繁体   English   中英

neo4j Cypher — 遍历可变长度路径,但在找到 label 时停止

[英]neo4j Cypher — traverse variable length path, but stop when a label is found

假设我的图形数据库有一个foo节点的“流”。 在每个foo节点之间可能是任意数量的barbar1bar2 、 ... barN节点,它们最终连接到下一个foo节点。

所以,所有这些都是可能的

  • (a:foo)-->(:bar)-->(b:foo)
  • (b:foo)-->(:bar)-->(c:foo)-->(:bar1)-->(d:foo)
  • (a:foo)-->(:bar)-->(:bar1)-->(:bar2)-->(:barN)-->(c:foo)

等等

我想返回每对不同的foo节点,它们之间没有任何其他foo节点

对于上述示例,解决方案应返回:

  • 一,乙
  • b、c
  • c, d
  • 一、c

解决方案不应包括以下内容,它们之间有 foo 节点:

  • b, d
  • 广告

我试过的。 这将返回所有连接的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM