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