我正在尝试获取两个节点之间的所有中间节点,以便在给定某种类型的关系时,只返回相互连接的节点。
这是一些示例数据,可以帮助我解释我的问题: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