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

时间:2014-03-07 05:47:43

标签: neo4j cypher

我试图获取两个节点之间的所有中间节点,这样当给定某种类型的关系时,只返回相互连接的节点。

以下是帮助我解释问题的一些示例数据:Neo4j console

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

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

2 个答案:

答案 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

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