2016-11-21 64 views
1

基本上是一個聚集列表,我問如何完成以下的Cypher查詢:如何聚合Cypher支架

unwind([[1, 2, 2, 3, 3, 3], [4, 4, 4, 4, 2, 2]]) as val 
    ... 
    return ... 

,這樣我就可以得到下面的結果:

+-----------------+ 
    | {1:1, 2:2, 3:3} | 
    +-----------------+ 
    | {4:4, 2:2}  | 
    +-----------------+ 

對於每個排val,它計算在val每個元素的發生。

回答

0

我用在列表中的字符,因爲它們使結果更容易理解。

UNWIND [['a', 'b', 'b', 'c', 'c', 'c'], ['d', 'd', 'd', 'd', 'b', 'b']] as list 
WITH list AS list1, list AS list2 
UNWIND list2 AS element 
WITH list1, element, COUNT(element) AS count 
RETURN list1 AS list, COLLECT(element) AS values, COLLECT(count) AS counts 

這導致:

╒══════════════════╤═════════╤═════════╕ 
│list    │values │counts │ 
╞══════════════════╪═════════╪═════════╡ 
│[a, b, b, c, c, c]│[c, a, b]│[3, 1, 2]│ 
├──────────────────┼─────────┼─────────┤ 
│[d, d, d, d, b, b]│[b, d] │[2, 4] │ 
└──────────────────┴─────────┴─────────┘ 

答案this question指出

它可能無法動態分配映射鍵

但它提供了一個創建雙元素列表的不錯選擇。使用這種方法,查詢變得這樣:

UNWIND [['a', 'b', 'b', 'c', 'c', 'c'], ['d', 'd', 'd', 'd', 'b', 'b']] as list 
WITH list AS list1, list AS list2 
UNWIND list2 AS element 
WITH list1, element, COUNT(element) AS count 
WITH list1 AS list, COLLECT(element) AS values, COLLECT(count) AS counts 
RETURN 
    list, 
    EXTRACT(i IN RANGE(0, LENGTH(values) - 1) | [values[i], counts[i]]) AS occurrences 

這給:

╒══════════════════╤════════════════════════╕ 
│list    │occurrences    │ 
╞══════════════════╪════════════════════════╡ 
│[a, b, b, c, c, c]│[[c, 3], [a, 1], [b, 2]]│ 
├──────────────────┼────────────────────────┤ 
│[d, d, d, d, b, b]│[[b, 2], [d, 4]]  │ 
└──────────────────┴────────────────────────┘ 
+0

我認爲這已經是足夠優雅。我會接受它。謝謝! –

+0

@JoeyZhang歡迎您。我找到了一種方法來壓縮列表中的另一堆棧溢出的問題,所以請再次檢查我的回答。 –