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

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

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

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

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

введите здесь описание изображения

Cybersam дал правильный запрос

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);

person Romain Bruckert    schedule 10.02.2015    source источник
comment
может кто-нибудь отредактировать это, чтобы это был не первый результат поиска корневых узлов?   -  person tladuke    schedule 09.03.2017


Ответы (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
person cybersam    schedule 10.02.2015
comment
На самом деле я пытаюсь найти все листовые узлы (те, у которых нет исходящих отношений). BELONGS_TO сбивает меня с толку. Тем не менее, запросы не возвращают мой узел... - person Romain Bruckert; 10.02.2015
comment
Я добавил в свой ответ тип отношения :BELONGS_TO, поскольку на самом деле у вас могут быть другие типы отношений (которые начинаются с ваших конечных узлов). Кроме того, вы уверены, что используете правильную метку для своих узлов? - person cybersam; 10.02.2015
comment
Спасибо за это. Да, я использую правильный ярлык ;-). До сих пор не работает. Мне интересно, этот конечный узел, который я пытаюсь найти, может иметь другие исходящие отношения, которых я не вижу в браузере Neo4j... может быть? Как я могу перечислить все отношения из / из этого узла (по {id: sssss}, чтобы узнать? И последнее. Листовой узел имеет несколько входящих отношений. Вы бы запросили работу, хотя? - person Romain Bruckert; 10.02.2015
comment
PS: MATCH (n:Somelabel) WHERE NOT (n)‹-[:BELONGS_TO]-() RETURN n для поиска корневых узлов действительно работает - person Romain Bruckert; 10.02.2015
comment
Но это способ найти корневые узлы! - person cybersam; 10.02.2015
comment
Подождите, я запутался, если я пытаюсь найти корень или лист... я пытаюсь найти тот, у которого НЕТ ИСХОДЯЩЕЙ связи! ;-) - person Romain Bruckert; 10.02.2015
comment
Затем вы пытаетесь найти листовые узлы. Ваш последний запрос был для корневых узлов. - person cybersam; 10.02.2015
comment
Я добавил шаг проверки работоспособности в свой ответ. - person cybersam; 10.02.2015
comment
Спасибо. Я заставил это работать! Ваш первый запрос был правильным: MATCH (n:Somelabel) WHERE NOT (n)-[:BELONGS_TO]-›() RETURN n У вас есть идея подсчитать непосредственных потомков в том же запросе? - person Romain Bruckert; 11.02.2015
comment
См. мой обновленный ответ о том, как получить листовые узлы и количество отдельных родителей для каждого из них. - person cybersam; 11.02.2015