Neo4j: вернуть только корневые узлы из возможных дочерних путей - PullRequest
0 голосов
/ 28 мая 2018

У меня есть набор (n) значений, все из которых имеют соответствующие узлы на моем графике.Я начинаю с неизвестных отношений друг с другом.(см. начальные узлы синим цветом)

Я хочу выяснить, насколько просто, если какое-либо значение / узлы являются дочерними по отношению к любому из других, тогда применяются эти правила для фильтрации результатов:

  1. Если узел является дочерним, то отбросьте его.(белые узлы)
  2. Если узел является корнем, вернуть его.(зеленые узлы)
  3. Если у узла нет дочерних элементов, также верните его.(зеленый узел 673)

Может быть до 50 начальных узлов.Я пытался выполнять итерацию по ним, сравнивая две за один раз, отбрасывая их, если они - дети, - но число итераций быстро выходит из-под контроля в больших наборах.Я надеюсь, что есть некоторая магия графа, которую я пропустил.Сайфер, пожалуйста!

Спасибо!

enter image description here

1 Ответ

0 голосов
/ 28 мая 2018

Допустим, у вас есть входной параметр nids - набор значений для свойства id узла, целевые узлы имеют метку Node, отношения между узлами имеют тип hasChild.

Затем вам нужно найти такие узлы, которые соответствуют входному набору и не имеют родителей от узлов, соответствующих входному набору:

UNWIND {nids} as nid
MATCH (N:Node {id: nid})
OPTIONAL MATCH (N:Node {id: nid})<-[:hasChild]-(P:Node) WHERE P.id IN {nids}
WITH N, collect(P) AS ts WHERE size(ts) = 0
RETURN N

И не забудьте добавить индекс кid свойство для узла:

CREATE INDEX ON :Node(id)
...