【问题标题】:How to use Wildcards on node attributes in cypher queries in neo4j如何在 Neo4j 的密码查询中对节点属性使用通配符
【发布时间】:2012-12-29 23:03:04
【问题描述】:

我正在尝试从 Neo4j 中的查询参数创建搜索,但似乎无法识别通配符。 “*”不适用于节点属性上的通配符。

我的代码如下:

price = "*" # by default
query = 'start b = product("*:*") WHERE has(b.public) and (b.public = 1) and (b.price = %d) RETURN ID(b) SKIP %d LIMIT %d;' % (price, skip, limit)
cypher.execute(cdb,query)[0]

不幸的是,当我运行查询或切换到控制台时...

start b = product("*:*") WHERE has(b.public) and (b.public = 1) and (b.price = "*") RETURN ID(b) SKIP 0 LIMIT 10;

...我得到空值,好像价格试图从字面上匹配“*”而不是匹配任何东西,就像通配符一样。例如,当我将变量 price 替换为 0 时,一切都很好。

我不太明白,因为this 建议我可以这样说:

WHERE follower.name =~ 'S.*'

并且 "*" 作为 count(*) 和 node:indexes("*:*") 的通配符

如果有什么不同的话,我正在使用 python 和 py2neo。

【问题讨论】:

    标签: wildcard neo4j cypher py2neo


    【解决方案1】:

    根据docscount(*)的意思是统计匹配的行数。但请记住,匹配是指MATCH 子句返回的行,而不是通配符匹配。所以"*"在这里不是一个普通的通配符。

    node:indexes("*:*") 中,第一个“*”表示“所有键”(索引的)。你不能说"i*",意思是“所有以字母'i'开头的键”。

    第二个“*”表示所有索引值。但是在这里,你也可以说"foo*",意思是“所有以'foo'开头的值”。

    最后,"WHERE follower.name =~ 'S.*'" 是一个 regexp 匹配项。

    为了使您的案例有效,产品索引上应该存在一个名为 "price" 的键。然后你可以使用"price:whatever"

    【讨论】:

    • 嗯。我还是不明白。这是对不同“*”如何不是通配符的非常清楚的解释,这非常有帮助。但是我如何有时传递一个给定的值,有时传递一个对所有人都重要的值?你建议像start b = product("name:*", "price:%d") WHERE has(b.public) and (b.public = 1) RETURN ID(b) SKIP %d LIMIT %d; % (price, skip, limit)这样的查询?
    • 如果您出于某种原因想要对价格属性进行通配符搜索,那么这是最快的解决方案。
    • 好的,谢谢。这不是一个太奇怪的原因,对吧?我将从搜索字段中传递 GET 参数。如果没有参数,我想索引返回所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2023-01-30
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    相关资源
    最近更新 更多