考虑以下密码:
MATCH (n{name: "John"})-[:Colleague]-(m) RETURN m;
该查询找到
Colleague(s)
的John(s)
。现在再来一个:MATCH (n{name: "John"})-[:Friend]-()-[:Colleague]-(m) RETURN m;
这找到
Colleague(s)
John(s)'
的Friend(s)
。现在是最后一个:MATCH (n{name: "John"})-[:Colleague]-()-[:Friend]-(m) RETURN m;
最后,找到
Friend(s)
John(s)'
的Colleague(s)
。我正在寻找的是Cypher查询,该查询查找给定查询找到的所有节点的并集。请注意,这仅是示例。我在这里实际上要问的是如何使用多条路径查找一组节点?就像是:
MATCH (n{name: "John"})
-[:Colleague]- /
-[:Friend]-()-[:Colleague]- /
-[:Colleague]-()-[:Friend]-
(m) RETURN m;
最佳答案
您可以在多个匹配项之间重用变量以引用同一节点(JOIN模式)。例
MATCH (n{name: "John"})-[:Colleague]-(m)
MATCH (n)-[:Friend]-()-[:Colleague]-(m)
MATCH (n)-[:Colleague]-()-[:Friend]-(m)
RETURN m;
在这里,“约翰”被匹配一次,并且被用作每个匹配的开始,并且m是每个匹配的感兴趣节点的连接。如果有多个“John”实例,则此查询将分别处理所有这些实例。如果所有“约翰”都应被视为同一个人,则不要重复使用n。
如果您想要UNION而不是JOIN,则可以像这样收集它们
MATCH (n{name: "John"})
OPTIONAL MATCH (n)-[:Colleague]-(c)
OPTIONAL MATCH (c)-[:Friend]-(fc)
OPTIONAL MATCH (n)-[:Friend]-()-[:Colleague]-(fc)
WITH c+collect(fc)+collect(cf) AS nodez
UNWIND nodez AS m
RETURN DISTINCT m;
关于neo4j - 通过Cypher中的多个路径地址选择节点列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44137509/