获取多个求和结果最大值:Neo4j Cypher查询问题
解决Neo4j/Cypher查询:找出总受欢迎度最高的厨师
嘿,刚好我熟悉Neo4j和Cypher,这就帮你搞定这个查询问题!
咱们的核心需求是计算每个厨师制作的所有蛋糕的popularity总和,然后找出总和最大的厨师。这里分两种场景给你提供实用的查询语句:
场景1:仅需单个最高总和的厨师(默认无并列)
用排序加限制的方式就能快速拿到结果:
MATCH (chef)-[r:COOKS]->(cake) WITH chef, SUM(r.popularity) AS total_popularity ORDER BY total_popularity DESC LIMIT 1 RETURN chef, total_popularity
给你拆解下每一步逻辑:
MATCH (chef)-[r:COOKS]->(cake):匹配所有厨师节点通过COOKS关系连接到蛋糕节点的路径,把关系存为r,方便后续调用它的popularity属性。WITH chef, SUM(r.popularity) AS total_popularity:按厨师节点分组,计算每个厨师所有COOKS关系的popularity总和,给这个总和命名为total_popularity。ORDER BY total_popularity DESC:把结果按总受欢迎度从高到低排序,让排名第一的厨师处于结果首位。LIMIT 1:只取排序后的第一个结果,也就是总受欢迎度最高的厨师。RETURN chef, total_popularity:返回厨师节点和对应的总受欢迎度,方便你核对结果是否符合预期。
场景2:处理多个厨师并列第一的情况
如果存在多个厨师的总受欢迎度相同且都是最大值,上面的语句只会返回一个,这时候可以用下面的查询把所有并列第一的厨师都找出来:
MATCH (chef)-[r:COOKS]->(cake) WITH chef, SUM(r.popularity) AS total_popularity WITH COLLECT({chef: chef, total: total_popularity}) AS chef_pop_list, MAX(total_popularity) AS max_total UNWIND chef_pop_list AS cp WHERE cp.total = max_total RETURN cp.chef, cp.total AS total_popularity
这个版本的逻辑更周全:
- 先计算每个厨师的总受欢迎度,和第一个查询的前两步一致。
- 把所有厨师与对应总受欢迎度收集成一个列表,同时算出所有总和里的最大值
max_total。 - 展开这个列表,筛选出总受欢迎度等于最大值的条目,最后返回这些厨师和他们的总和。
这样不管是单个还是多个并列第一的情况,都能精准得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者xmaxert
相关产品推荐
相关产品推荐

