两组节点之间的最短路径

时间:2019-01-01 12:36:16

标签: neo4j shortest-path subgraph

我在Neo4j中创建了一个具有1000万个节点和3000万个关系的图形。 每个节点分别标记为A(400万个节点),B(600万个节点)或C(20个节点)。
A中的节点通向B中的节点。B中的节点通向B中的其他节点,以及C中的节点。
对于A中的每个节点,我需要找到C中最接近的节点(或节点,如果它们具有相同的距离),并在A节点中添加C节点的ID作为属性的值。
任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

因此,我们正在研究这样的模型(由于未指定关系类型,所以使用:LEAD):

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

APOC Procedures为此提供了最佳解决方案,但这是两部分的,因为我们首先使用path expander procedures找到最接近的: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
相关问题