[英]Retrieve relationships between child nodes using neo4j cypher
当我在 neo4j 浏览器中运行此查询时,我有以下网络结果:
MATCH (n1:Item {name: 'A'})-[r]-(n2:Item) Return n1,r,n2
在图表的底部,它显示: Displaying 6 nodes, 7 relationships
。 但是当我在neo4j浏览器中查看表格时,我只有5条记录
n1,r,n2
A,A->B,B
A,A->C,C
A,A->D,D
A,A->E,E
A,A->F,F
因此,在 java 代码中,当我使用以下代码获取记录列表时:
List<Record> records = session.run(query).list();
我只得到 5 条记录,所以我只得到 5 条关系。 但我想获得所有 7 种关系,包括以下 2 种:
B->C
C->F
我如何使用 cypher 查询来实现这一点?
有很多方法可以实现这一目标。 一种方法是遍历到第二级并检查第二级节点是否也在第一级
MATCH (n1:Item {name: 'A'})-[r]-(n2:Item)
WITH n1,collect(r) AS firstRels,collect(n2) AS firstNodes
OPTIONAL MATCH (n2)-[r2]-(n3:Item)
WHERE n3 IN firstNodes
RETURN n1,firstRels,firstNodes,collect(r2) as secondRels
或者您可以在第一级节点之间进行笛卡尔积并匹配:
MATCH (n1:Item {name: 'A'})-[r]-(n2:Item)
WITH n1,collect(r) AS firstRels,collect(n2) as firstNodes
UNWIND firstNodes AS x
UNWIND firstNodes AS y
OPTIONAL MATCH (x)-[r2]-(y)
RETURN n1,firstRels,firstNodes,collect(r2) as secondRels
根据 firstNodes 和 secondRels 的基数以及其他现有关系,一个可能比另一个更快。
这应该有效:
MATCH (n:Item {name: 'A'})-[r1]-(n2:Item)
WITH n, COLLECT(r1) AS rs, COLLECT(n2) as others
UNWIND others AS n2
OPTIONAL MATCH (n2)-[r2]-(x)
WHERE x IN others
RETURN n, others, rs + COLLECT(r2) AS rs
与@FrantišekHartman 的第一种方法不同,此查询使用UNWIND
将n2
(未在WITH
子句中指定,因此变为未绑定)绑定到MATCH
子句中的相同n2
节点。 此查询还将所有关系组合到一个rs
列表中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.