按聚合排序的密码顺序

ass*_*z84 1 sql-order-by aggregate-functions neo4j cypher

我需要在查询期间聚合数据,然后按此数据排序。

根据密码文档:

如果要使用聚合对结果集进行排序,则必须将聚合包含在要在 ORDER BY 中使用的 RETURN 中。

我有以下密码查询:

START profile=node(31) MATCH (profile)-[r:ROLE]->(story)
WHERE r.role="LEADER" and story.status="PRIVATE" 
WITH story MATCH (story)<-[r?:RATED]-() 
RETURN distinct story ,sum(r.rate) as rate ORDER BY rate DESCENDING
Run Code Online (Sandbox Code Playgroud)

上面的查询工作正常,问题是我必须在我的结果集中包含sum(r.rate)

当查询响应应该是故事列表/页面时,我通过存储库使用Cypherdsl(我的存储库扩展了 CypherDslRepository )...

我可以使用按聚合函数排序而不将其包含在结果集中吗?
有什么解决方法吗?

谢谢。

Mic*_*ger 5

你可以用一个中间的`WITH`

START profile=node(31) MATCH (profile)-[r:ROLE]->(story)
WHERE r.role="LEADER" and story.status="PRIVATE" 
WITH story 
MATCH (story)<-[r?:RATED]-() 
WITH story ,sum(r.rate) as rate 
ORDER BY rate DESCENDING
RETURN story
Run Code Online (Sandbox Code Playgroud)

DISTINCT如果您已经进行了聚合,请停止。

并且可选关系很慢,所以如果您遇到性能问题,不如使用路径表达式并从那里获取 rel。

START profile=node(31) MATCH (profile)-[r:ROLE]->(story)
WHERE r.role="LEADER" and story.status="PRIVATE" 
with story, extract(p in (story)<-[r?:RATED]-() : head(rels(p)) as rated
WITH story , reduce(sum = 0, r in rated : sum + r.rate)  as rate 
ORDER BY rate DESCENDING
RETURN story
Run Code Online (Sandbox Code Playgroud)