2013-04-17 3 views
1

Мне нужно агрегировать данные во время запроса, а затем заказать по этим данным.
Порядок Cypher по агрегации

Согласно шифровальщика документации:

Если вы хотите использовать агрегированные отсортировать результирующий набор, то агрегации должны быть включены в RETURN для использования в вашем заказе BY.

У меня есть следующий запрос: Cypher

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, если у вас уже есть агрегация.

И необязательные отношения медленны, поэтому, если вы столкнетесь с перфекционной проблемой, скорее используйте выражение пути и получите оттуда оттуда.

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) .. любые предложения? –

Смежные вопросы