在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
答案 0 :(得分:1)
将(A)->...->(Z)
子图保存到named path,然后使用nodes
和relationships
函数提取节点和关系列表:
MATCH p=(a {Id: '123'})-[:flows*]->(z {Id: '456'})
RETURN a, nodes(p), relationships(p), z
正如评论中指出的那样,nodes(p)
也会返回a
和z
。如果您不希望返回这些节点,请省略列表的第一个和最后一个元素。感谢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
。