[英]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 启发)来解决它:
但我无法弄清楚如何在 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.