一. 介绍
  所有对最短路径(APSP)计算所有节点对之间的最短路径(加权)。此算法具有优化功能,使其比为图中的每对节点调用单一源最短路径算法更快。

二.neo4j算法

CALL
algo.allShortestPaths.stream('cost',{nodeQuery:'Loc',defaultValue:1.0,graph:'huge'})
YIELD sourceNodeId, targetNodeId, distance
RETURN sourceNodeId, targetNodeId, distance LIMIT 10

三.实例

MERGE (a:Loc {name:'A'})
MERGE (b:Loc {name:'B'})
MERGE (c:Loc {name:'C'})
MERGE (d:Loc {name:'D'})
MERGE (e:Loc {name:'E'})
MERGE (f:Loc {name:'F'})
MERGE (a)-[:ROAD {cost:50}]->(b)
MERGE (a)-[:ROAD {cost:50}]->(c)
MERGE (a)-[:ROAD {cost:100}]->(d)
MERGE (b)-[:ROAD {cost:40}]->(d)
MERGE (c)-[:ROAD {cost:40}]->(d)
MERGE (c)-[:ROAD {cost:80}]->(e)
MERGE (d)-[:ROAD {cost:30}]->(e)
MERGE (d)-[:ROAD {cost:80}]->(f)
MERGE (e)-[:ROAD {cost:40}]->(f);

在这里插入图片描述

call algo.allShortestPaths.stream('cost',{nodeQuery:'Loc',defaultValue:1.0})
yield sourceNodeId,targetNodeId,distance
with sourceNodeId,targetNodeId,distance
where algo.isFinite(distance) = true

match(source:Loc) where id(source) = sourceNodeId
match(target:Loc) where id(target)=targetNodeId
with source,target,distance where source <> target

return source.name as source ,target.name as target ,distance
order by distance desc
limit 10

其中isFinite是来过滤无穷值,因为在图中有点节点之间是不可达的,所以他们之间不存在最短路径,故会返回无穷值,但在cypher中不支持无穷值,故采用isFinite来过滤。

在这里插入图片描述在我的结果中,与官方文档中所呈现的结果不一致,不知道是哪一个出现了错误,在官方文档中A—F得出的结果是100,故我重新使用单源最短路径计算了A—F的距离,所得的结果与我上图中的结果一致,单源结果如下所示:

在这里插入图片描述

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐