2016-11-21 2 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 добро пожаловать. Я нашел способ переустановки списков в другой вопрос переполнения стека, поэтому, пожалуйста, снова проверьте мой ответ. –

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