我试图获取两个节点之间的所有中间节点,这样当给定某种类型的关系时,只返回相互连接的节点。
以下是帮助我解释问题的一些示例数据:Neo4j console。
我正在寻找P1和P3之间相互连接的节点。对于像"研究"这样的关系,我可以使用单向边缘。但是,对于关系"连接",我希望能够过滤掉没有双向边缘的节点。因此,查询应该只返回S1和P5。
如何过滤我的查询以便P2和P4不会显示(因为它们与P1和P3之间没有双向边缘)?
答案 0 :(得分:1)
一个想法是考虑中间节点出现的路径数量。如果count等于1,则它是结果的一部分
MATCH (a:Person { name: 'p1' })-[r1]-(b)-[r2]-(c:Person { name: 'p3' })
WITH b, count(*) AS count
WHERE count=1
RETURN b
答案 1 :(得分:1)
你喜欢这个:
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