如何在没有无限循环的情况下在 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 的路径.

我有一个想法(受标签传播启发)来解决它:

  1. 标记目标节点'red'.
  2. 标记所有与 'red' 节点 'red' 有传出关系的节点。
  3. 重复第 2 步,直到不再有新的 'red' 个节点。
  4. 所有 '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 "