知识库

节点集之间的所有最短路径

考虑一些任意节点,A、B、C、D、E、F……

我希望返回这些节点之间所有最短路径。节点之间可能存在许多边,但预期最多为 4 条。图是复杂的且非层次结构的(如果这有意义 - 任何节点都可能指向任何其他节点)。一个典型的节点形式为:match (n:Entity { name: 'xyz' })

我将如何编写匹配表达式以返回上述节点之间以任何顺序排列的最短路径?

解决方案

  1. 使用索引查找操作查找节点集

  2. 将它们收集到列表中

  3. 两次展开列表,一次用于路径的每一侧

  4. 通过 ID 比较删除反向对

  5. 匹配并返回路径

MATCH (n:Entity) where n.name IN {names}
WITH collect(n) as nodes
UNWIND nodes as n
UNWIND nodes as m
WITH * WHERE id(n) < id(m)
MATCH path = allShortestPaths( (n)-[*..4]-(m) )
RETURN path