繁体   English   中英

使用 neo4j cypher 检索子节点之间的关系

[英]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 的第一种方法不同,此查询使用UNWINDn2 (未在WITH子句中指定,因此变为未绑定)绑定到MATCH子句中的相同n2节点。 此查询还将所有关系组合到一个rs列表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM