获取两个节点之间的关系和节点

时间:2017-12-14 14:53:12

标签: graph neo4j cypher

在Neo4j中给出以下数据集:

(A)-flows->(B)-flows->(C)-flows->(D)-flows->(Z)
(A)-flows->(E)-flows->(F)-flows->(Z)
(A)-flows->(G)-flows->(Z)

当只知道A和Z时,如何使用Cypher查询返回子图(节点B,C,D,E,F,G它们之间的关系以及与A和Z的关系)。

伪代码:

Match(a)-[rels*](nodes*)-(z)
where a.Id = '123' and z.Id = '456'
return a,rels,nodes,z

1 个答案:

答案 0 :(得分:1)

(A)->...->(Z)子图保存到named path,然后使用nodesrelationships函数提取节点和关系列表:

MATCH p=(a {Id: '123'})-[:flows*]->(z {Id: '456'})
RETURN a, nodes(p), relationships(p), z

正如评论中指出的那样,nodes(p)也会返回az。如果您不希望返回这些节点,请省略列表的第一个和最后一个元素。感谢Bruno Peres和cybersam的投入。

MATCH p=(a {Id: '123'})-[:flows*]->(z {Id: '456'})
RETURN a, nodes(p)[1..-1], relationships(p), z

备注#1。这些列表也可以逐个UNWIND到其内容流程。

备注#2。根据您使用的驱动程序,您只需返回p并在客户端代码中处理它。例如,Java驱动程序允许使用返回Path对象,其nodes()relationships()方法返回Iterable