繁体   English   中英

如何在没有无限循环的情况下找到 Neo4j 中有向图中连接到某些节点的所有节点?

[英]How to find all nodes connected to certain nodes in a directed graph in Neo4j without infinite loops?

我正在使用 Neo4j。我想在单向有向图中(可能带有循环)找到(通过一个方向)连接到某些节点targets的所有节点。 例如:

targets: [4]
1->2->3->[4]->2->...
1->5->6->7->5->...

现在4是目标节点,但目标节点可以不止一个。 我想找到1,2,3,4作为结果,因为它们可以与目标节点t连接,而5,6,7不能。

我想知道如何在Neo4j中通过Cypher制作它。

我的第一个想法是:

MATCH (target) WHERE id(target) IN [4]
MATCH p=(a)-[:Rel*]->(target)
MATCH (a)-[r:Rel]->(c) WHERE a IN nodes(p) AND c IN nodes(p)
RETURN a,c

当没有循环时它工作得很好,但是当有循环时[:Rel*]将无限运行,例如在5,6,7中找到到4的路径。

我有一个想法(受 Label Propagation 启发)来解决它:

  1. 将目标节点标记为“红色”。
  2. 将所有与“红色”节点有传出关系的节点也标记为“红色”。
  3. 重复步骤 2,直到不再有新的“红色”节点。
  4. 所有“红色”节点(包括目标节点)现在都在同一个结果子图中。

但我无法弄清楚如何在 Cypher 中编写它,因为它包含递归,而且我在编写 Java Neo4j 的用户定义过程时遇到困难。

可以写成Cypher吗,或者像这样的任务已经有解决方案了吗? 我没有在 Apoc 或 Graph Data Science 库中找到有用的工具。

任何帮助将不胜感激,谢谢!

一种方法是使用apoc.path.expandConfig 这是 apoc 插件的一部分,您可以在 neo4j 数据库上轻松启用它。 使用它,你可以运行类似的东西:

MATCH (target) WHERE id(target) IN [4]
CALL apoc.path.expandConfig(target, {
    relationshipFilter: "<Rel",
    maxLevel: 10 //This is optional
})
YIELD path
RETURN path

在第一行,您可以找到目标节点,就像您所做的那样。 relationshipFilter "<REL" 将只允许遍历指向目标方向的节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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