Neo4j Cypher语句中WITH子句内u变量的作用疑问
为什么第一个WITH中的u变量至关重要
先拆解两种写法的执行逻辑差异:
保留u的正确流程
MATCH (u:User)-[r:RATED]-(m:Movie):匹配所有用户、他们的评论关系及对应电影。WITH u, count(r) AS NumReviews:这里的u是分组依据——Cypher会把同一个用户的所有r关系归为一组,统计每组的数量,得到的是单个用户的评论数。比如用户甲有150条评论,用户乙有148条,每个用户对应一条NumReviews记录。- 后续
collect把所有用户的评论数收集成数组,展开后求平均,得到的就是所有用户评论数的平均值,也就是正确结果149。
移除u后的错误逻辑
如果把第一个WITH改成WITH count(r) AS NumReviews,此时没有指定分组键,Cypher会把所有匹配到的r关系当成一个整体组,count(r)计算的是全局所有评论的总数量(也就是你看到的100004)。后续collect得到的数组里只有这一个数值,展开求平均还是这个总数,完全偏离了“每个用户评论数的平均值”的需求。
简单说:u的作用是告诉Cypher“按用户维度分组统计”,没有它就变成了统计全局总评论数,结果自然错误。
内容的提问来源于stack exchange,提问作者CEORiley
相关产品推荐
相关产品推荐

