如何在没有无限循环的情况下在 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
的路径.
我有一个想法(受标签传播启发)来解决它:
- 标记目标节点'red'.
- 标记所有与 'red' 节点 'red' 有传出关系的节点。
- 重复第 2 步,直到不再有新的 'red' 个节点。
- 所有 'red' 个节点(包括目标节点)现在都在同一个结果子图中。
但我不知道如何在 Cypher 中编写它,因为它包含递归,而且我在为 Neo4j 编写那些 Java 用户定义过程时遇到困难。
它可以用 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 "
我正在使用 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
的路径.
我有一个想法(受标签传播启发)来解决它:
- 标记目标节点'red'.
- 标记所有与 'red' 节点 'red' 有传出关系的节点。
- 重复第 2 步,直到不再有新的 'red' 个节点。
- 所有 'red' 个节点(包括目标节点)现在都在同一个结果子图中。
但我不知道如何在 Cypher 中编写它,因为它包含递归,而且我在为 Neo4j 编写那些 Java 用户定义过程时遇到困难。
它可以用 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 "