如何计算可变长度边的属性总和?查询城市间路线总旅行时间
用Cypher计算可变长度路径的总旅行时间(Cavite Island到Bastille示例)
要找出从Cavite Island到Bastille的所有可行路线,并计算每条路线的总旅行时间,你可以用Cypher的可变长度路径匹配结合reduce函数实现属性求和,具体查询如下:
MATCH path = (start {name: "Cavite Island"})-[*]->(end {name: "Bastille"}) WITH path, reduce(total = 0, e IN relationships(path) | total + e.travelTime) AS totalTravelTime RETURN [node IN nodes(path) | node.name] AS 路线, totalTravelTime AS 总旅行时间 ORDER BY totalTravelTime ASC
关键部分说明:
MATCH path = (start {name: "Cavite Island"})-[*]->(end {name: "Bastille"}):匹配起点到终点的所有任意长度路径,[*]表示不限边数,若要限制路径长度范围,可写成[1..5](1到5条边)。reduce(total = 0, e IN relationships(path) | total + e.travelTime):遍历路径中的每条边,累加travelTime属性值,得到这条路线的总耗时。[node IN nodes(path) | node.name]:把路径上的所有城市名称提取成列表,清晰展示完整路线。ORDER BY totalTravelTime ASC:按总耗时从小到大排序,方便快速找到最短路线。
注意事项:
- 如果图中存在循环路线(比如同一城市被多次访问),查询可能返回大量重复或无限结果,可通过限制路径长度(如
[1..10]),或者添加无重复节点的条件:WHERE ALL(n IN nodes(path) | size(filter(m IN nodes(path) WHERE m = n)) = 1)。 - 如果你的节点有特定标签(比如
:City),可以在匹配时加上标签,让查询更精准:(start:City {name: "Cavite Island"})。
内容的提问来源于stack exchange,提问作者Matheus Farias
相关产品推荐
相关产品推荐

