在Neo4j中如何仅用每个用户的最新评分计算电影平均评分?
电影平均评分查询优化方案
原查询问题说明
当前编写的Cypher语句未对同一用户的多条评分记录做筛选,也没有引入时间维度判断帖子发布先后,直接对所有匹配到的评分值取平均,会导致同一用户的多次评分被重复计入最终结果,不符合需求。
解决方案
默认Post实体存在createdAt字段存储发布时间戳(数值越大代表发布时间越新,若实际字段名不同可自行替换),优化后的查询语句如下:
MATCH (m:Movie { name: "The Dark Knight"})-[:HAS_RATING]-(r:Rating)--(p:Post)--(u:User) // 按用户分组,同一用户的帖子按发布时间倒序排列 WITH u, r, p ORDER BY u.id, p.createdAt DESC // 每个用户仅取排序后的第一条即最新评分 WITH u, collect(r)[0] AS latestRating // 对所有用户的最新评分计算平均值并保留两位小数 RETURN apoc.math.round(avg(latestRating.value), 2)
逻辑说明
- 匹配环节先关联到目标电影对应的所有评分、关联帖子、发布帖子的用户全链路数据
- 排序环节将同一用户的所有带评分帖子按发布时间倒序排列,保证最新的帖子排在最前
- 筛选环节通过
collect(r)[0]取每个用户的最新一条评分记录 - 最终计算平均值时仅使用每个用户的唯一最新评分,避免重复统计
内容的提问来源于stack exchange,提问作者Thingamajig
相关产品推荐
相关产品推荐

