【问题标题】:Get relationships and nodes between two nodes获取两个节点之间的关系和节点
【发布时间】:2017-12-14 14:53:12
【问题描述】:

给定 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

【问题讨论】:

    标签: graph neo4j cypher


    【解决方案1】:

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

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

    正如 cmets 中所指出的,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 对象,该对象具有返回 Iterables 的 nodes()relationships() 方法。

    【讨论】:

    • 似乎节点a被返回了两次。对于a 变量和nodes(p) 调用。 z 节点也是如此。
    • x[1..size(x)-1] 可以更简洁地写成x[1..-1]
    • 哇,这对我来说是新的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多