如何在Memgraph/Cypher中获取图的唯一路径并统计热门路径?
解决方案
针对直接关系(单步路径)的场景
如果你的路径都是单步直接关系(像示例里的A→B、A→C),可以通过按起点和终点节点分组,统计关系数量(即热度)来实现需求:
MATCH (start:Fen)-[r]->(end:Fen) WHERE start.Name = 'A' // 按起点、终点分组,统计关系数作为热度 WITH start, end, COUNT(r) AS hotness // 按热度降序排序 ORDER BY hotness DESC // 返回合并后的路径表示和热度 RETURN start.Name + ' -r-> ' + end.Name AS path, hotness
执行后会得到:
| path | hotness |
|---|---|
| A -r-> B | 2 |
| A -r-> C | 1 |
针对多步路径的场景
如果需要处理任意长度的多步路径(对应你原查询里的[r*]),可以通过提取路径上的节点序列来分组,统计相同节点序列的路径数量:
MATCH path = (start:Fen)-[r*]->(end:Fen) WHERE start.Name = 'A' // 提取路径上的所有节点,按节点序列分组统计热度 WITH nodes(path) AS pathNodes, COUNT(path) AS hotness // 将节点列表转换为名称数组 WITH [node IN pathNodes | node.Name] AS nodeNames, hotness // 拼接成路径字符串 WITH REDUCE(result = nodeNames[0], idx IN RANGE(1, SIZE(nodeNames)-1) | result + ' -r-> ' + nodeNames[idx]) AS path, hotness // 按热度降序,返回去重后的路径 ORDER BY hotness DESC RETURN DISTINCT path, hotness
原查询问题说明
你之前用RETURN DISTINCT(path)无法去重,是因为Cypher中每条路径的关系实例(r1、r2)是不同的,即使起点终点相同,也会被判定为不同路径。必须通过节点序列分组统计的方式,才能合并相同起点终点(或相同节点序列)的路径。
内容的提问来源于stack exchange,提问作者user1099123
相关产品推荐
相关产品推荐

