Я использую символы в списках, так как они делают результаты намного легче понять.
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]] │
└──────────────────┴────────────────────────┘
Я думаю, что уже достаточно элегантно. Я соглашусь. Благодаря! –
@JoeyZhang добро пожаловать. Я нашел способ переустановки списков в другой вопрос переполнения стека, поэтому, пожалуйста, снова проверьте мой ответ. –