В neo4j извлекайте уникальные элементы из списков - PullRequest
0 голосов
/ 08 октября 2019

У меня есть база данных, в которой узлы и отношения создаются так:

create ({foo: 1})-[:r]->({foo: 1}), ({foo: 1})-[:r]->({foo: 2}), ({foo: 1})-[:r]->({foo: 2})

Для каждого пути я могу создавать списки свойств следующим образом:

MATCH path = (start)-[*]->(end)
WHERE NOT ()-->(start) and NOT (end)-->()
RETURN [node in nodes(path) | node.foo] as foos

, который возвращает

foos
------
[1, 1]
[1, 2]
[1, 2]

Но мне нужны только отдельные свойства в каждом списке.

Вдохновлен Cypher: извлечение уникальных значений из коллекции Я пытался

MATCH path = (start)-[*]->(end)
WHERE NOT ()-->(start) and NOT (end)-->()
WITH [node in nodes(path) | node.foo] as foos
UNWIND foos as x
RETURN COLLECT(DISTINCT x) as foos_unique

Но это дает мне уникальные свойства для всех узлов:

foos_unique
----
[1, 2]

Как извлечь отдельные элементы из каждого списка, так что результат будет

foos_unique
------
[1]
[1, 2]
[1, 2]

Ответы [ 2 ]

1 голос
/ 08 октября 2019

[ОБНОВЛЕНО]

Функция REDUCE поможет:

MATCH path = (start)-[*]->(end)
WHERE NOT ()-->(start) and NOT (end)-->()
RETURN REDUCE(s = [], n in NODES(path) |
  CASE WHEN NOT EXISTS(n.foo) OR n.foo IN s THEN s ELSE s + n.foo END) as foos
0 голосов
/ 08 октября 2019

Это сделало бы работу. Вместо того, чтобы собирать уникальные элементы, мы можем сравнить foo s start и end следующим образом:

MATCH (start)-[*]->(end)
WHERE NOT ()-->(start) and NOT (end)-->()
WITH start.foo as foos, end.foo as fooe 
RETURN case when foos = fooe then [foos] else [foos, fooe] end as foos_unique

Вывод:

foos_unique

[1]
[1, 2]
[1, 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...