2016-03-29 2 views
0

У меня есть запрос в Neo4j/Cypher, который возвращает коллекцию так:Neo4j высчитывать удалить перестановки в коллекции

MATCH z = (a:X)-[b:Y*2..]->(a) 
RETURN relationships(z) 

возвращает (пути) соответственно имена ребер:

[name 1, name 2, name 3, name 5], 
[name 2, name 3, name 5, name 1], 
[name 3, name 5, name 1, name 2], 
[name 5, name 1, name 2, name 3], 
[name 6, name 7], 
[name 7, name 6], 
[name 4, name 8], 
[name 8, name 4] 

В результате выше, чем первые 4 строки равны, то следующие два равны, а последние две строки равны. Я хочу, чтобы у меня не было никаких перестановок, таких как выше. Я хочу что-то вроде этого:

[name 1, name 2, name 3, name 5], 
[name 6, name 7], 
[name 4, name 8] 

Кто-нибудь знает, как я могу решить проблему?

Заранее спасибо;)

ответ

0

Cypher не имеет прямой способ сортировки коллекции. Но есть способ сделать это: используйте UNWIND, а затем WITH ... ORDER BY для сортировки на уровне строк и используйте collect() для агрегирования снова.

Ваш случай еще сложнее, так как вы хотите частично упорядочить вещи на базе предварительного пути. Сначала вам нужно построить своего рода хэш-сумов для каждого пути (мы здесь идентификаторы консигационных отношений), затем выполните unwind, а затем order by и collect на основе хеша, вычисленного ранее.

Предполагаете, что вы хотите использовать id ваших отношений для заказа.

MATCH z = (a:X)-[b:Y*2..]->(a) 
WITH relationships(z) as rels, 
    reduce(s="", x in relationships(z) | s+x+"_") as hash 
UNWIND rels as r 
WITH hash, id(r) as r_id order by hash, r_id 
WITH hash, collect(r_id) as sorted_r_id 
RETURN distinct sorted_r_id 
+0

Это работает! Большое спасибо! :) – C90HM

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