2016-03-29 69 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()再次聚合。

由於您想要在預先路徑基礎上部分排列事物,因此您的情況更加複雜。首先,您需要爲每個路徑構建一種哈希函數(我們在此處將關係的ID),然後根據之前計算的哈希執行unwind,然後執行order bycollect

我假設您想使用您的關係的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