在 neo4j 密码查询中使用多个匹配子句不会返回任何结果

Posted

技术标签:

【中文标题】在 neo4j 密码查询中使用多个匹配子句不会返回任何结果【英文标题】:using multiple match clauses doesn't return any result in neo4j cypher query 【发布时间】:2013-05-17 14:37:31 【问题描述】:

我正在执行以下两个查询,我得到了一些结果。

第一次查询

START 
person=node:NODE_TYPE(NODE_TYPE='PERSON') 
MATCH 
(person)-[?:contacts]->(var1)-[?:addresses]->(var2)-[?:details]->(var3)-[?:items]->(var4)-[?:items]->(var5)-[?:value]->(var6) 
WHERE 
var2.`#nodeId` ='at0000' and var3.`#nodeId` ='at0001' and var4.`#nodeId` ='at0002' and var5.`#nodeId` ='at0028' and var6.`value` =~'address.*' 
return distinct person;

第二次查询

START 
person=node:NODE_TYPE(NODE_TYPE='PERSON') 
MATCH 
(person)-[?:contacts]->(var1)-[?:addresses]->(var2)-[?:details]->(var3)-[?:items]->(var4)-[?:value]->(var5) 
WHERE 
var2.`#nodeId` ='at0000' and var3.`#nodeId` ='at0001' and var4.`#nodeId` ='at0009' and var5.`value` =~'india.*' 
return distinct person;

但是当我将这两个查询组合到一个查询中以获取同时满足这两个条件的人时,它不起作用。

组合查询是

START 
person=node:NODE_TYPE(NODE_TYPE='PERSON')  
MATCH 
(person)-[?:contacts]->(var1)-[?:addresses]->(var2)-[?:details]->(var3)-[?:items]->(var4)-[?:items]->(var5)-[?:value]->(var6) , (person)-[?:contacts]->(var7)-[?:addresses]->(var8)-[?:details]->(var9)-[?:items]->(var10)-[?:value]->(var11) 
WHERE 
var2.`#nodeId` ='at0000' and var3.`#nodeId` ='at0001' and var4.`#nodeId` ='at0002' and var5.`#nodeId` ='at0028' and var6.`value` =~'address.*' and 
var8.`#nodeId` ='at0000' and var9.`#nodeId` ='at0001' and var10.`#nodeId` ='at0009' and var11.`value` =~'india.*' 
return distinct person;

这个查询返回一个空的迭代器。

我使用 'comma' 来组合 MATCH 条件,并使用 'and' 来组合 WHERE 条件。 这有什么问题吗?

(我正在实现一个查询构建器来构建密码查询。我必须检查多个条件匹配。最好的方法是什么?)

Neo4j 1.9M04

【问题讨论】:

对我来说看起来是正确的。您确定有任何persons 满足这两个标准吗?即查询1和查询2的结果中是否出现了persons? 是的,有符合这两个条件的人。 我尝试在没有 WHERE 子句的情况下执行查询,并打印了结果,包括我使用的所有 'var's。 var7,var8,var9,var10,var11 对于所有结果都是空的。 var1 和 var7 都代表关系为 'contacts' 的节点,但 var1 有一些值,而 var7 为空。 这太奇怪了。除了猜测它是一个错误(或我没有看到的其他东西)之外,我真的无法解释这种行为。您可以在 console.neo4j.org 上设置一些示例数据吗? 有什么方法可以在 console.neo4j.org 中重新创建并在此处发布链接? 【参考方案1】:

您可能会遇到here 中描述的“标识符唯一性”条件(参见 Michael Hunger 的第一篇文章)。 如果您在同一个 (person) 节点上找到匹配项,并且从那里只有 1 个 :contacts 关系,则标识符 var1 将“用完”此匹配项中的连接节点,var7 不能分配给同一个节点。

换句话说,通过 match 语句找到的节点只能由同一 match 语句中的一个标识符使用。

您可以尝试使用WITH 子句代替另一个MATCH 来解决此问题。

START 
person=node:NODE_TYPE(NODE_TYPE='PERSON') 
MATCH 
(person)-[?:contacts]->(var1)-[?:addresses]->(var2)-[?:details]->(var3)-[?:items]->(var4)-[?:items]->(var5)-[?:value]->(var6) 
WHERE 
var2.`#nodeId` ='at0000' and var3.`#nodeId` ='at0001' and var4.`#nodeId` ='at0002' and var5.`#nodeId` ='at0028' and var6.`value` =~'address.*' 
with distinct person
MATCH 
(person)-[?:contacts]->(var1)-[?:addresses]->(var2)-[?:details]->(var3)-[?:items]->(var4)-[?:value]->(var5) 
WHERE 
var2.`#nodeId` ='at0000' and var3.`#nodeId` ='at0001' and var4.`#nodeId` ='at0009' and var5.`value` =~'india.*' 
return distinct person;

【讨论】:

感谢您的帮助。但是我已经更改了我的构建器,以便在标识符多次出现时重复使用。

以上是关于在 neo4j 密码查询中使用多个匹配子句不会返回任何结果的主要内容,如果未能解决你的问题,请参考以下文章

ES查询语法

Neo4j 第九篇:查询数据(Match)

Neo4j,在返回可分页结果的同时查询多个 lucene 索引

Cypher:使用 WHERE 子句或 MATCH 属性定义进行精确匹配?

neo4j 密码查询优化

Neo4j:匹配多个标签(2个或更多)