2014-09-11 4 views
0

У меня есть запрос (ниже), который возвращает коллекции узлов, содержащих даты создания. Я хочу сортировать строки по новой дате создания. В некоторых строках есть одна дата создания, в других - несколько. Как видно, узел «name4» должен быть первым. Какие исправления я должен внести в свой запрос? Благодарю.Neo4j Cypher сортировать по коллекциям

MATCH (node:node) 
WITH node 
ORDER BY node.created DESC 
RETURN count(node.name) AS count, node.name, collect(node.created) AS created 

count node.name created 
3  "name1"  [1410234609620,1410234606534,1410234506799] 
1  "name2"  [1410234434936] 
1  "name3"  [1410234454573] 
2  "name4"  [1410463902552,1410460561481] 
1  "name5"  [1410234485185] 
2  "name6"  [1410234548527,1410234525740] 

ответ

2

Если предположить, что ваши метки времени в правильном порядке в вашей коллекции, вы можете сделать первый штамп времени от каждой из коллекций с использованием HEAD([1, 2, 3]), которая возвращает первый элемент коллекции. Я загрузил это значение в свойство timeSort и использовал его в качестве критериев заказа.

MATCH (node:node) 
WITH node 
ORDER BY node.created DESC 
WITH count(node.name) AS count, node.name as name, collect(node.created) AS created 
WITH count, name, head(created) as timeSort, created 
RETURN count, name, created 
ORDER BY timeSort DESC 
+1

Это отлично работает! Благодарю. – JeffA

2

Этот запрос сначала находит максимальную временную метку, x, для каждого имени, а затем сортирует результаты.

MATCH (node:node) 
WITH node.name AS name, COLLECT(node.created) AS created 
WITH name, created, REDUCE(t = 0, c IN created | CASE WHEN c > t THEN c ELSE t END) AS x 
RETURN LENGTH(created) AS count, name, created 
ORDER BY x DESC 
+0

Это также работает. Хотя, для чего это стоит, Кенни легче читать. – JeffA

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