neo4j - возвращение первого ряда без группировки - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь сделать следующее с neo4j.У нас есть узлы, которые имеют набор атрибутов.Одним из этих атрибутов является дата.

Я ищу, чтобы эти атрибуты были возвращены, но только для сбора вхождения с самой поздней датой.

В SQL мой запрос выглядел бы так:

select commonKey, attr1, attr2, dateAttr
from ( 
   select commonKey, attr1, attr2, dateAttr, 
   row_number(
         partition by commonKey 
         order by commonKey ASC, dateAttr DESC
     ) rn
from tab 
) t
WHERE t.rn = 1

Есть ли способ добиться того же в Cypher?Существует метод collect (dateAttr) [1], но он будет группировать по всем атрибутам, которые мне нужно вернуть (commonKey, attr1, attr2), в то время как я забочусь только о «group» по commonKey, но возвращаю другие - из первой строкивнутри группы.

Любая помощь / предложения будут высоко оценены!

Спасибо!

- Алекс

1 Ответ

0 голосов
/ 15 октября 2018

Я думаю, что вы проецируете свойства слишком рано.Вероятно, было бы лучше упорядочить узлы по дате, затем либо сгруппировать collect () по дате, и взять первое:

MATCH (n:MyNode) 
WHERE ...
WITH n, n.dateAttr as dateAttr
ORDER BY dateAttr DESC 
WITH dateAttr, collect(n)[0] as n
RETURN n.commonKey, n.attr1, n.attr2, dateAttr as TDate

В качестве альтернативы вы можете использовать процедуры APOC, которые имеют функции агрегирования для такого случая:

MATCH (n:MyNode) 
WHERE ...
WITH n, n.dateAttr as dateAttr
ORDER BY dateAttr DESC 
WITH dateAttr, apoc.agg.first(n) as n
RETURN n.commonKey, n.attr1, n.attr2, dateAttr as TDate
...