Cypher求平均评分最大值问题:获取最高平均评分的MOVIE节点
解决Cypher中获取平均评分最高电影的问题
嘿,刚上手Cypher遇到聚合操作的坑太正常了!你的需求是找到平均评分最高的MOVIE节点,本质是先计算每部电影的平均评分,再找出全局最高的那个(甚至可能有并列的情况),咱们先拆解下你原语句的问题,再给你两种靠谱的解法。
先说说你原语句的问题
你写的语句里有两个关键问题:
- 语法错误:
MATCH (m:MOVIE)-[r:RATED]-() m,ar,WITH这里多了m,ar,,属于语法混乱,Cypher无法正确解析。 - 逻辑错误:你第一次WITH已经得到了每部电影的平均评分
ar,但后续没有把所有电影的ar聚合起来找全局最大值,反而重新MATCH了一次,相当于完全没用到之前计算的平均评分,自然得不到全局最高值。
正确解法1:支持并列第一的场景(推荐)
如果数据库里有多个电影平均评分并列最高,这个方法能把它们全部返回:
// 第一步:计算每部电影的平均评分 MATCH (m:MOVIE)-[r:RATED]-() WITH m, AVG(r.rating) AS avg_rating // 第二步:收集所有电影的评分数据,同时算出全局最高平均评分 WITH COLLECT({movie: m, rating: avg_rating}) AS all_movie_ratings, MAX(avg_rating) AS highest_avg // 第三步:从收集的列表里筛选出评分等于最高值的电影 UNWIND all_movie_ratings AS single_movie_rating WHERE single_movie_rating.rating = highest_avg RETURN single_movie_rating.movie AS top_movie, single_movie_rating.rating AS highest_average_rating
逻辑解释:
- 第一个WITH:遍历所有RATED关系,计算每部MOVIE的平均评分,把电影节点和对应的平均分绑定在一起。
- 第二个WITH:用
COLLECT()把所有电影的评分数据打包成一个列表,同时用MAX()算出所有平均评分里的最大值。 - 最后UNWIND列表,筛选出评分等于全局最大值的电影,这样就算有多个并列第一也不会漏掉。
正确解法2:简洁版(仅返回单个最高评分电影)
如果你确定只有一部电影评分最高,或者只需要返回其中一部,这个写法更简洁:
MATCH (m:MOVIE)-[r:RATED]-() WITH m, AVG(r.rating) AS avg_rating // 按平均评分降序排序,取第一个结果 ORDER BY avg_rating DESC LIMIT 1 RETURN m AS top_movie, avg_rating AS highest_average_rating
逻辑解释:
先计算每部电影的平均评分,然后按评分从高到低排序,LIMIT 1直接取排在第一位的电影,简单高效,但要注意如果有并列第一,这个只会返回其中一个。
内容的提问来源于stack exchange,提问作者Luno
相关产品推荐
相关产品推荐

