【问题标题】:How to query extended path between nodes with Cypher in Neo4J?如何在 Neo4J 中使用 Cypher 查询节点之间的扩展路径?
【发布时间】:2019-02-06 07:41:03
【问题描述】:

我正在使用 Neo4J / Cypher 来存储/检索基于图形模型的一些数据。

假设以下模型:我有一组通过关系 (type=CONNECTED_TO) 连接的节点 (type=child)。

C1 -[:CONNECTED_TO]-> C2 -[:CONNECTED_TO]-> C3 -[:CONNECTED_TO]-> C4

如果我想在不知道中间体的情况下查询从 C1 到 C4 的路径:

MATCH p=
  (a:child {id:'c1Id'}) -[:CONNECTED_TO*0..]-(z:child {id:'c4Id'}) 
RETURN p

到目前为止一切顺利。

现在假设每个孩子都包含在父母中,我想从父母 ID 开始查询

P1 -[:CONTAINS]-> C1
P2 -[:CONTAINS]-> C2
P3 -[:CONTAINS]-> C3
P4 -[:CONTAINS]-> C4

查询看起来像:

MATCH p=
        (a:parent {id:'p1Id'})
        -[:CONTAINS]->
        (cStart:child)
        -[:CONNECTED_TO*0..]-
        (cEnd:child)
        <-[Contains]-
        (z:parent {id:'p4Id'})
RETURN p

这给了我很好的结果。以下路径:

P1 -[:CONTAINS]-> C1 -[:CONNECTED_TO]-> C2 -[:CONNECTED_TO]-> C3 -[:CONNECTED_TO]-> C4 <-[:CONTAINS]- P4

我想做的是使用子拓扑查询从 P1 到 P4 的路径,但我还想检索所有包含中间体的父级。

除此之外,我如何改进我的最后一个密码查询以返回:

P2 -[:CONTAINS]-> C2
P3 -[:CONTAINS]-> C3

有可能吗?也许我的模型设计不适合那个用例?在这种情况下,如何改进它来解决这个查询?

发送

【问题讨论】:

    标签: graph neo4j cypher


    【解决方案1】:

    您可以使用list comprehension 构造:

    MATCH p=
            (a:parent {id:'p1Id'})
            -[:CONTAINS]->
            (cStart:child)
            -[:CONNECTED_TO*0..]-
            (cEnd:child)
            <-[Contains]-
            (z:parent {id:'p4Id'})
    RETURN p,
           [n IN nodes(p)[1..-1] | (n)<-[:CONTAINS]-(:parent)][0]
    

    【讨论】:

    • 太棒了!你能解释一下 [1..-1] 吗?我在文档中没有看到它
    • @Nico 这是从列表中获取没有第一个和最后一个元素的子列表的语法:RETURN range(0, 10)[1..-1] // neo4j.com/docs/cypher-manual/current/syntax/lists/…
    • 感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多