我使用的Neo4j / Cypher支架来存储/检索基于图形模型的一些数据。
让我们假设以下模型:我有一组通过关系(类型= CONNECTED_TO)连接节点(类型=小孩)的。
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
可能吗?也许我的模型设计并不适用于使用情况?在这种情况下,如何提高它来解决这个查询?
TX
您可以使用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]