Graph 如何在Neo4J中使用Cypher查询节点间的扩展路径?

Graph 如何在Neo4J中使用Cypher查询节点间的扩展路径?,graph,neo4j,cypher,Graph,Neo4j,Cypher,我使用Neo4J/Cypher来存储/检索一些基于图形模型的数据 让我们假设以下模型:我有一组节点(type=child),它们通过一个关系(type=connected\u TO)连接起来 如果我想在不知道中间物的情况下查询从C1到C4的路径: MATCH p= (a:child {id:'c1Id'}) -[:CONNECTED_TO*0..]-(z:child {id:'c4Id'}) RETURN p 到目前为止还不错 现在假设每个子项都包含在父项中,我想从父项ID开始查询 P1

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

让我们假设以下模型:我有一组节点(type=child),它们通过一个关系(type=connected\u TO)连接起来

如果我想在不知道中间物的情况下查询从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
可能吗?也许我的模型设计不适合那个用例?在这种情况下,如何改进它以解决此查询

Tx

您可以使用构造:

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]
匹配p=
(a:parent{id:'p1Id'})
-[:包含]->
(cStart:儿童)
-[:已连接到*0..]-
(cEnd:儿童)

令人惊叹的!你能解释一下吗?我在报纸上看不到docs@Nico这是从列表中获取不带第一个和最后一个元素的子列表的语法:
返回范围(0,10)[1..-1]
//谢谢您的帮助
P1 -[:CONTAINS]-> C1 -[:CONNECTED_TO]-> C2 -[:CONNECTED_TO]-> C3 -[:CONNECTED_TO]-> C4 <-[:CONTAINS]- P4
P2 -[:CONTAINS]-> C2
P3 -[:CONTAINS]-> C3
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]