[英]neo4j Cypher — traverse variable length path, but stop when a label is found
假设我的图形数据库有一个foo
节点的“流”。 在每个foo
节点之间可能是任意数量的bar
、 bar1
、 bar2
、 ... barN
节点,它们最终连接到下一个foo
节点。
所以,所有这些都是可能的
等等
我想返回每对不同的foo
节点,它们之间没有任何其他foo
节点
对于上述示例,解决方案应返回:
解决方案不应包括以下内容,它们之间有 foo 节点:
我试过的。 这将返回所有连接的 foo 对,无论它们之间是什么。
MATCH x=(a:foo)-[:RELTYPE*1..]->(b:foo)
RETURN a,b
这应该有效:
MATCH x = (a:foo)-[:RELTYPE*..]->(b:foo)
WHERE NONE(n IN NODES(x)[1..-1] WHERE ANY(l IN LABELS(n) WHERE l = 'foo'))
RETURN a, b
[更新]
甚至更好:
MATCH x = (a:foo)-[:RELTYPE*..]->(b:foo)
WHERE NONE(n IN NODES(x)[1..-1] WHERE n:foo)
RETURN a, b
您还可以利用 APOC 程序来处理可以处理这种用例的路径扩展程序。
使用此图:
CREATE (a:foo {name:'a'}), (b:foo {name:'b'}), (c:foo {name:'c'}), (d:foo {name:'d'}),
(a)-[:RELTYPE]->(:bar)-[:RELTYPE]->(b),
(b)-[:RELTYPE]->(:bar)-[:RELTYPE]->(c)-[:RELTYPE]->(:bar1)-[:RELTYPE]->(d),
(a)-[:RELTYPE]->(:bar)-[:RELTYPE]->(:bar1)-[:RELTYPE]->(:bar2)-[:RELTYPE]->(:barN)-[:RELTYPE]->(c)
我们可以应用这个查询:
MATCH (start:foo)
CALL apoc.path.subgraphNodes(start, {relationshipFilter:'RELTYPE>', labelFilter:'/foo'}) YIELD node as end
RETURN start, end
这从 every:foo 节点开始,仅遍历传出:RELTYPE 关系,并在到达 a:foo 标记节点时终止扩展(label 过滤器中的 'foo' 之前的/
表示这是标签上的终止过滤器)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.