首页 > 解决方案 > 两组节点之间的最短路径

问题描述

我在 Neo4j 中创建了一个包含 1000 万个节点和 3000 万个关系的图表。每个节点被标记为 A(400 万个节点)、B(600 万个节点)或 C(20 个节点)。
A中的节点导致B中的节点。B中的节点导致B中的其他节点,以及C中的节点。
对于A中的每个节点,我需要找到最近的节点(或节点,如果它们的距离相同) C,并将 C 节点的 ID 添加为 A 节点中的属性值。
任何帮助将非常感激。

标签: neo4jshortest-pathsubgraph

解决方案


所以我们正在研究这样的模型(使用 :LEAD 因为您没有指定关系类型):

(:A)-[:LEAD]->(:B)
(:B)-[:LEAD]->(:B)
(:B)-[:LEAD]->(:C)

APOC 程序为此提供了最佳解决方案,但它是一个两部分的解决方案,因为我们首先使用路径扩展程序找到最近的 :C 节点,然后使用该距离重新匹配以获得在该距离可到达的 :C 节点的完整集合。

您还需要使用apoc.periodic.iterate()以便对它进行批处理,尽管您可能想要使用 batchSize。

我在此查询中做出了一些假设,因为您没有提供太多要在图中使用的属性的方式。

CALL apoc.periodic.iterate("MATCH (a:A) RETURN a",
 "CALL apoc.path.spanningTree(a, {relationshipFilter:'LEAD>', labelFilter:'/C', limit:1}) YIELD path
  WITH a, length(path) as length
  CALL apoc.path.subgraphNodes(a, {relationshipFilter:'LEAD>', labelFilter:'/C', maxLevel:length}) YIELD node
  WITH a, collect(node.id) as ids
  SET a.cIDs = ids",
  {batchSize:1000}) YIELD batches, total, errorMessages
  RETURN batches, total, errorMessages

推荐阅读