neo4j - 两组节点之间的最短路径
问题描述
我在 Neo4j 中创建了一个包含 1000 万个节点和 3000 万个关系的图表。每个节点被标记为 A(400 万个节点)、B(600 万个节点)或 C(20 个节点)。
A中的节点导致B中的节点。B中的节点导致B中的其他节点,以及C中的节点。
对于A中的每个节点,我需要找到最近的节点(或节点,如果它们的距离相同) C,并将 C 节点的 ID 添加为 A 节点中的属性值。
任何帮助将非常感激。
解决方案
所以我们正在研究这样的模型(使用 :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
推荐阅读
- performance - 使用并行编程存储数据
- javascript - 根据鼠标滚轮滚动内容设置活动文本链接+将文本链接链接到每个鼠标滚轮滚动内容
- ios - ios 无法使用 Agora 共享屏幕示例
- typescript - 静态成员不能引用类类型参数。同时能够创建子类的实例
- tensorflow - 第二轮交叉验证中的OOM
- kubernetes - Kubernetes 上的 API 部署,Pod 未创建
- javascript - 无法理解这个 compose reduce javascript 示例中发生了什么?
- pandas - Pandas groupby 多条件和日期差异计算
- react-native - 如何断言 React Native 测试库中的按钮被禁用?
- python - 如何根据带有 Pandas 的分离数据框 y 的值迭代地将列添加到数据框 X?