neo4j - 通过Cypher中的多个路径地址选择节点列表

标签 neo4j cypher

考虑以下密码:

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/

相关文章:

带有标签的neo4j LOAD CSV

Neo4j 匹配多个关系

Neo4j 密码查询 : Parenthesis not considered in WHERE clause?

python - py2neo (Neo4j) : py2neo. packages.httpstream.http.SocketError: 不允许操作

javascript - NodeJS 和 Neo4j 的异步行为问题

javascript - 我可以在单个查询中使用约束和索引将 csv 加载到 neo4j 吗?

Neo4j - 返回最大值的节点

neo4j - neo4j是否适合搜索特定长度的路径

Neo4j 最短路径

neo4j - 获取 NEO4j 错误 "Expected Long(0) to be a org.neo4j.values.storable.TextValue, but it was a org.neo4j.values.storable.LongValue": 1