2013-04-17 95 views
1

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

根据暗号文档:

如果你想使用聚合排序结果集,该 聚合必须包括在返回到您的订单 BY使用。

我有以下暗号查询:

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 

上述查询工作正常的事情是我必须在我的结果集总和(r.rate)

我使用Cypherdsl通过库(我的仓库扩展CypherDslRepository)时quering的反应应该是故事列表/页...

我可以通过聚集功能使用顺序,而不包括它的结果组?
任何解决方法?

谢谢。

回答

4

你可以用一个中间`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 

做到这一点,离开过DISTINCT如果你已经有聚集。

可选关系很慢,所以如果遇到perf问题而不是使用路径表达式并从那里获取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 
+1

嗨迈克尔谢谢你的回应... cypherdsl不允许以后的命令(WithNext类没有得到的方法orderBy)..任何建议? –