我最近开始学习将neo4j与cypher一起使用,而且我遇到了一项我无法解决该问题的任务。
' COOKS'关系包含一个名为' popular'这只是一些流行的'一块蛋糕,每个蛋糕都煮熟了。由厨师(紫色名字)。
我的最终目标是返回拥有最受欢迎菜肴的厨师节点,在我的情况下,通过总结所有人气来实现这一点。与任何厨师相关联的关系中的属性,并从所有总和中获取最大值。到目前为止,我最好的尝试是:
match (chef:Chef)-[r:COOKS]->(c:Cake) return sum(r.popularity), chef
并且表格结果对我来说是这样的:
所以现在我只需要获得所有这些总和的最大值,并且只返回具有最大总和“#39”
的厨师的节点。答案 0 :(得分:2)
您可以采取查询,按降序对结果进行排序,并将返回限制在第一行。
MATCH (chef:Chef)-[r:COOKS]->(c:Cake)
RETURN chef, sum(r.popularity) AS popularity
ORDER BY popularity DESC
LIMIT 1
但这只会让你成为一名厨师。在你的样本中我假设你希望鲍勃和约翰都回来。
在这种情况下,执行相同的搜索并按降序排序,但收集每位厨师的结果是从最热门到最不受欢迎的有序列表。然后只返回与最受欢迎的厨师匹配的列表行。
MATCH (chef:Chef)-[r:COOKS]->(c:Cake)
WITH chef, sum(r.popularity) AS popularity
ORDER BY popularity DESC
WITH COLLECT ([chef, popularity]) AS chefs
UNWIND chefs AS chef
WITH chef
WHERE chef[1] = chefs[0][1]
RETURN chef
答案 1 :(得分:2)
Dave Bennet的解决方案略有不同,我们可以通过收集他们的受欢迎程度来收集厨师,因此对于每行我们都会有受欢迎,然后收集具有特定受欢迎程度的厨师),然后订购这些并与所有最受欢迎的厨师一起排队。这可以让你处理关系。
MATCH (chef:Chef)-[r:COOKS]->(c:Cake)
WITH chef, sum(r.popularity) AS popularity
WITH popularity, collect(chef) as chefs
ORDER BY popularity DESC
LIMIT 1
UNWIND chefs AS chef
RETURN chef, popularity