Как получить узел с похожими / идентичными отношениями? - PullRequest
1 голос
/ 06 октября 2019

Скажем, у нас есть некоторые данные, подобные этим:

create
(a:Person{name:'andy'})-[:LIKES]->(:Animal{name:'cat'}),
(b:Person{name:'bob'})-[:LIKES]->(:Animal{name:'cat'}),
(c:Person{name:'charlie'})-[:LIKES]->(:Animal{name:'cat'}),
(a)-[:LIKES]->(:Animal{name:'dog'}),
(b)-[:LIKES]->(:Animal{name:'dog'})

Я хотел бы знать, у какого Персона есть идентичные НРАВИТСЯ с Энди. Энди нравится «кошка» и «собака», поэтому должен появиться Боб, но не Чарли, потому что ему не нравится «собака».

Как я могу сформировать такой запрос? Мне бы хотелось, чтобы этот запрос работал со многими LIKES, поэтому в будущем, когда будет 100 животных, я все равно смогу найти кого-то с таким же вкусом, как у Энди.

Я пробовал что-то подобное

match
(p:Person{name:'andy'})-[:LIKES]->(a:Animal),
(a)<-[:LIKES]-(p2:Person)
return p,a,p2

Но это вернул бы и Чарли.

1 Ответ

0 голосов
/ 07 октября 2019

Если вы хотите найти человека с таким же вкусом, вы можете использовать этот запрос:

MATCH (p:Person{name:'andy'})-[:LIKES]->(a:Animal)
WITH collect(a) AS likes
MATCH (p2:Person)
WHERE all(n IN likes WHERE exists((p2)-[:LIKES]->(n)))
RETURN p2, likes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...