全源最短路径的应用

43 篇文章 1 订阅
31 篇文章 3 订阅

一、最短路径-CYPHER自带函数

输入:两个节点
输出:两点之间的最短路径

1、查询周迅与王菲的最短路径

MATCH p = shortestPath((周迅:明星 {名称:"周迅"})-[*..6]-(王菲:明星 {姓名:"王菲"}))RETURN p;

2、查询周迅与王菲的所有最短路径

MATCH p = allShortestPaths((周迅:明星 {名称:'周迅'})-[*..6]-(王菲:明星 {姓名:'王菲'})) RETURN p;

二、全源最短路径-neo4j-graph-algorithms算法包

全源最短路径可以认为是单源最短路径问题的推广,即分别以每个顶点作为源顶点并求其至其它顶点的最短距离。
输入:一批节点
输出:当前点与其它点之间的距离(两两之间的最短路径)

- 构造样例数据:
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);

在这里插入图片描述

1、isFinite函数的使用

普通的cypher不支持过滤无穷大的值,所以添加了isFinite函数来帮助过滤结果中的无穷值。此查询返回彼此之间距离最远的前10对节点。
algo.allShortestPaths.stream过程第一个参数cost是关系ROAD的权值属性字段。

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

在这里插入图片描述

2、将图形作为无向图处理
CALL algo.allShortestPaths.stream('cost', {
nodeQuery:'MATCH (n:Loc) RETURN id(n) as id',
relationshipQuery:'MATCH (n:Loc)-[r]-(p:Loc) RETURN id(n) as source, id(p) as target, r.cost as weight',
graph:'cypher', defaultValue:1.0}) YIELD sourceNodeId, targetNodeId, distance RETURN sourceNodeId, targetNodeId, distance ORDER BY distance DESC LIMIT 10
3、大图运算

默认支持20亿节点与关系,超过此值需要设置config-graph:‘huge’

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

三、通过全源最短路径算法寻找路径紧密度排序

全源最短路径算法寻找路径紧密度排序,此排序即为目标群体的路径紧密度排序。
通过目标群体的路径紧密排序列表,可以很直接的观察到当前图中人物之间的关系,为进一步分析提供便捷的入口。
路径紧密度排序:两点之间可达路径越短排序越靠前。

1、路径R的权值设置

路径R的权值设置如下所示:
在这里插入图片描述

2、增加存储过程

增加存储过程,计算路径紧密度权重并排重

CALL zdr.shortestPath.allPathsTightness({sourceIds},{targetIds},{distanceSTE}) YIELD source,target,distance,tightnessSort RETURN source,target,distance,tightnessSort
3、使用关系属性COST计算DISTANCE

使用关系COST属性带权重计算(返回紧密度最高的前一百组节点):

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
WITH collect(id(source)) AS sourceIds, collect(id(target)) AS targetIds, collect(distance) AS distanceSTEs
CALL zdr.shortestPath.allPathsTightness(sourceIds,targetIds,distanceSTEs) YIELD source,target,distance,tightnessSort RETURN source,target,distance,tightnessSort ORDER BY distance ASC LIMIT 100

在这里插入图片描述

4、使用距离默认值计算DISTANCE

algo.allShortestPaths.stream的算法实现中保留的默认值为1.0
在这里插入图片描述

CALL algo.allShortestPaths.stream(null,{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
WITH collect(id(source)) AS sourceIds, collect(id(target)) AS targetIds, collect(distance) AS distanceSTEs
CALL zdr.shortestPath.allPathsTightness(sourceIds,targetIds,distanceSTEs) YIELD source,target,distance,tightnessSort RETURN source,target,distance,tightnessSort ORDER BY distance ASC LIMIT 100
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马超的博客

谢谢大佬的赞赏 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值