为何Memgraph的allshortest路径查询返回含环路径?如何处理零权重边?
Memgraph中
allshortest返回含环路径的原因及解决方法 一、返回含环路径是预期行为吗?
是的,这完全符合allshortest的设计逻辑。allshortest的核心目标是找出所有总权重最小的路径,当存在接近零权重的边时,绕环(比如从中心节点出发走这条边再返回)不会增加总路径权重——这类带环路径的总权重和无环的最短路径完全一致,因此会被查询返回。
二、如何修改查询排除含零权重边的路径?
可以通过两种核心思路调整查询,按需选择:
1. 直接过滤权重接近零的边
在路径匹配时,给边添加权重过滤条件,排除掉接近零的边(阈值根据你对“接近零”的定义调整,比如用0.0001作为临界值):
MATCH path = allshortest((start:Node {id: '你的中心节点ID'})-[e*]->(end:Node)) WHERE ALL(edge IN relationships(path) | edge.weight > 0.0001) RETURN path;
如果是严格等于0的权重,直接把条件改成edge.weight != 0即可。
2. 同时排除零权重边和路径环
如果需要彻底避免路径中出现循环(即使非零权重边也不想绕环),可以在过滤边的同时,检查路径中的节点是否唯一:
MATCH path = allshortest((start:Node {id: '你的中心节点ID'})-[e*]->(end:Node)) WHERE ALL(edge IN relationships(path) | edge.weight > 0.0001) AND size(nodes(path)) = size(DISTINCT nodes(path)) RETURN path;
这里通过比较路径节点总数和去重后的节点数,判断是否存在重复节点(即环),确保路径是无环的简单路径。
内容的提问来源于stack exchange,提问作者ztudents
相关产品推荐
相关产品推荐

