Neo4J найти количество (размер) отношений между узлами - PullRequest
1 голос
/ 08 июня 2019

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

Я пробовал несколько методов COUNTing и SIZE, но не могу понять, является ли это дажевозможно в Neo4J

MATCH (cw:CreativeWork) WHERE cw.officialTitle IN ['Antz', 'The Specialist ']
MATCH (p:Person) WHERE SIZE((p)-[:contributedTo]-(cw)) > 1
RETURN p, cw

Это вернет два указанных Творческих произведения и всех людей, которые внесли свой вклад в название, основываясь на отношении :contributedTo.Два актера в списке внесли свой вклад в оба названия, и я заинтересован в возвращении только этих двух.

enter image description here

Этот запрос, например, не возвращает результатов:

MATCH (cw:CreativeWork) WHERE cw.officialTitle IN ['Antz', 'The Specialist ']
MATCH (p:Person) WHERE SIZE((p)-[:contributedTo]-(cw)) > 1
RETURN p, cw

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

@ Последний запрос Радж может быть упрощен:

MATCH (p:Person)-[:contributedTo]-(cw:CreativeWork)
WHERE cw.officialTitle IN ['Antz', 'The Specialist']
WITH p, collect(cw) as cws
WHERE SIZE(cws) > 1
RETURN p, cws
0 голосов
/ 08 июня 2019

В случае вашего запроса значение SIZE() будет всегда 0 или 1 (За исключением случаев, когда между любой парой Person и * 1007 существует два или более отношений *). Причина этого в том, что ваш запрос агрегирует SIZE (или Count) по Person и CreativeWork. (То же, что и Group by по обоим из них)

Вы можете использовать следующий запрос, который COUNTS CreativeWorks для каждого Person (Этот запрос возвращает список CreativeWork for Person. ):

MATCH (cw:CreativeWork) WHERE cw.officialTitle IN ['Antz', 'The Specialist']
MATCH (p:Person)-[:contributedTo]-(cw)
WITH p,count(cw) as rels, collect(cw) as cws
WHERE rels > 1
RETURN p,cws

Вы можете изменить приведенный выше запрос так, чтобы он выглядел просто так (оба выполняются одинаково):

MATCH (p:Person)-[:contributedTo]-(cw:CreativeWork)
WHERE cw.officialTitle IN ['Antz', 'The Specialist']
WITH p,count(cw) as rels, collect(cw) as cws
WHERE rels > 1
RETURN p,cws

ПРИМЕЧАНИЕ. В конце последнего заголовка списка есть пробел (в Ваш запрос).

...