当条件为真时停止neo4j/cypher查询
我有一个图,其中每个节点代表一个java类,每个节点都有一个名为namespace的属性。我想匹配一个模式,其中起始节点和最终节点共享一个名称空间,但所有中间节点不共享该名称空间。对于有3类(A类->B类->C类)的情况,我有:当条件为真时停止neo4j/cypher查询,neo4j,cypher,Neo4j,Cypher,我有一个图,其中每个节点代表一个java类,每个节点都有一个名为namespace的属性。我想匹配一个模式,其中起始节点和最终节点共享一个名称空间,但所有中间节点不共享该名称空间。对于有3类(A类->B类->C类)的情况,我有: START inside1=节点(*) 匹配内部1-[:使用]->外部1-[:使用]->内部2 其中inside1.namespace在1.namespace之外 和inside2.namespace=inside1.namespace 返回inside1.name、o
START inside1=节点(*)
匹配内部1-[:使用]->外部1-[:使用]->内部2
其中inside1.namespace在1.namespace之外
和inside2.namespace=inside1.namespace
返回inside1.name、outside1.name、inside2.name
这似乎很有效。当我尝试扩展它时,我尝试:
START inside1 = node(*)
match inside1 -[:USES]-> outside1 -[:USES*] -> inside2
where inside1.namespace <> outside1.namespace
and outside1.namespace <> inside1.namespace
and inside2.namespace = inside1.namespace
return inside1.name, outside1.name, inside2.name
START inside1=节点(*)
匹配内部1-[:使用]->外部1-[:使用*]->内部2
其中inside1.namespace在1.namespace之外
外部1.namespace内部1.namespace
和inside2.namespace=inside1.namespace
返回inside1.name、outside1.name、inside2.name
问题是我不想要中间节点与inside1共享同一名称空间的任何路径。所以我的问题是,我是否可以告诉它“当你碰到一个名称空间等于inside1.namespace的节点时停止”
谢谢。不确定这是否最简洁,但我想这正是你想要的?首先,它获取查询的一般情况,然后将其限制为使用
with
进行最紧密的匹配
START inside1 = node(*)
MATCH inside1-[:USES*]->outside1-[:USES]->inside2
WHERE inside1.ns <> outside1.ns
AND inside2.ns = inside1.ns
WITH inside1, inside2, outside1
MATCH inside1-[:USES]->outside2
WHERE inside1.ns <> outside2.ns
RETURN inside1, outside1, inside2
START inside1=节点(*)
匹配内部1-[:使用*]->外部1-[:使用]->内部2
其中内侧1.ns外侧1.ns
和inside2.ns=inside1.ns
内1、内2、外1
匹配内部1-[:使用]->外部2
其中内侧1.ns外侧2.ns
返回内部1、外部1、内部2
@PeterNeubauer感谢您的验证——希望这就是他想要的东西。:)
START inside1 = node(*)
MATCH inside1-[:USES*]->outside1-[:USES]->inside2
WHERE inside1.ns <> outside1.ns
AND inside2.ns = inside1.ns
WITH inside1, inside2, outside1
MATCH inside1-[:USES]->outside2
WHERE inside1.ns <> outside2.ns
RETURN inside1, outside1, inside2