一. 介绍
所有对最短路径(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的距离,所得的结果与我上图中的结果一致,单源结果如下所示: