Neo4j cypher - подсчет непосредственных потомков корневых узлов

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

Мой график выглядит так (см. Прикрепленный скриншот). Я пробовал следующий запрос, который работает до тех пор, пока корневой узел имеет только ОДНУ входящую связь, а не когда он имеет более одного. (Я пока не очень знаком с кибер-языком).

MATCH (n:Somelabel) WHERE NOT (()-[:BELONGS_TO]->(n:Somelabel)) RETURN n

Любая помощь приветствуется! (я даже не пытался посчитать корневые узлы непосредственных потомков... что будет "2" согласно моему графику)

Правильный запрос дал киберсам

MATCH (n:Somelabel) WHERE NOT (n)-[:BELONGS_TO]->() RETURN n;

MATCH (n:Somelabel)<-[:BELONGS_TO]-(c:Somelabel)
WHERE NOT (n)-[:BELONGS_TO]->() RETURN n, count(c);

1 ответ

Решение

Исходя из вашей диаграммы, похоже, что вы действительно ищете "листовые" узлы. Этот запрос будет искать все Somelabel узлы, которые не имеют исходящих отношений, и возвращают каждый такой узел вместе со счетчиком количества различных узлов, которые имеют отношение, указывающее на этот узел.

MATCH (n:Somelabel)
WHERE NOT (n)-[:BELONGS_TO]->()
OPTIONAL MATCH (m)-[:BELONGS_TO]->(n)
RETURN n, COUNT(DISTINCT m);

Если вы действительно ищете все "корневые" узлы, ваш оригинальный запрос сработал бы.

В качестве проверки работоспособности, если у вас есть определенный узел, который вы считаете "листовым" узлом (скажем, он имеет id значение 123), этот запрос должен возвращать одну строку с null значения для r а также m, Если вы получаете ненулевые результаты, то у вас действительно исходящие отношения.

MATCH (n {id:123})
OPTIONAL MATCH (n)-[r]->(m)
RETURN r, m
Другие вопросы по тегам