在Neo4J中,通过相互连接过滤某些关系



我正在尝试获取两个节点之间的所有中间节点,以便在给定某种类型的关系时,只返回相互连接的节点。

这是一些示例数据,可以帮助我解释我的问题:neo4j控制台。

我正在寻找P1和P3之间的相互连接的节点。对于诸如"研究"之类的关系,我可以对单向边缘。但是,对于"连接"的关系,我希望能够过滤出没有双向边缘的节点。因此,查询应仅返回S1和P5。

如何过滤我的查询,因此P2和P4不会显示(因为它们之间没有双向边缘,并且P1和P3)?

一个想法是考虑出现中间节点的路径数。如果计数等于1,则是结果的一部分

MATCH (a:Person { name: 'p1' })-[r1]-(b)-[r2]-(c:Person { name: 'p3' })
WITH b, count(*) AS count
WHERE count=1
RETURN b

您如何看待:

MATCH (a:Person { name: 'p1' })-[r1]-(b)-[r2]-(c:Person { name: 'p3' })
WITH a,c,b,type(r1) AS rel_type1,collect(r1) AS rels1, collect(r2) AS rels2, type(r2) AS rel_type2
WHERE (length(rels1)=1 OR startNode(rels1[0])=endNode(rels1[0])) AND (length(rels2)=1 OR startNode(rels2[0])=endNode(rels2[1]))
RETURN *

结果:

+--------------------------------------------------------------------------------------------------------------------------------+
| rels2             | rel_type1  | a                  | b                  | c                  | rels1             | rel_type2  |
+--------------------------------------------------------------------------------------------------------------------------------+
| [:studies[10] {}] | "studies"  | Node[0]{name:"p1"} | Node[5]{name:"s1"} | Node[2]{name:"p3"} | [:studies[9] {}]  | "studies"  |
| [:connects[8] {}] | "connects" | Node[0]{name:"p1"} | Node[1]{name:"p2"} | Node[2]{name:"p3"} | [:connects[0] {}] | "connects" |
+--------------------------------------------------------------------------------------------------------------------------------+
2 rows
35 ms

这是控制台:http://console.neo4j.org/r/8m9u78

最新更新