Neo4j Матч с несколькими отношениями - PullRequest
0 голосов
/ 17 апреля 2020

Мне нужно МАТЧ, где оба отношения верны. Я понимаю (person1) - [: r1 |: r2] - (person2). Проблема, которую я имею, состоит в том, что один из MATCH проходит через другой узел. IE:

(p1:person)-[:FRIEND]-(p2:person)-[:FRIEND]-(p3:person)

Итак, я хочу этот вид логики c. Враг моего врага - мой друг. И мой друг мой друг. Выведите список всех имен, которые являются моими друзьями. Я также ограничиваю отношение определенным значением.

Что-то вроде:

MATCH (p1:Person)-[:ENEMY{type:'human'}]-(myEnemy:Person)-[enemy2:ENEMY{type:'human'}]-(myFriend:Person)
OR (p1:Person)-[friend:FRIEND{type:'human'}]-(myFriend:Person)
RETURN p1.name, myFriend.name

Мне нужен один список, в котором я могу затем выполнить агрегацию.

Это мой первый публиковать .... так что если мой вопрос беспорядок ... напишите мне свой отзыв, и я уточню:)

1 Ответ

0 голосов
/ 17 апреля 2020

Вы можете использовать предложение UNION , чтобы объединить 2 запроса и также удалить дублирующиеся результаты:

MATCH (p:Person)-[:ENEMY{type:'human'}]-(:Person)-[:ENEMY{type:'human'}]-(f:Person)
WHERE ID(p) < ID(f)
RETURN p.name AS pName, f.name AS fName
UNION
MATCH (p:Person)-[:FRIEND{type:'human'}]-(f:Person)
WHERE ID(p) < ID(f)
RETURN p.name AS pName, f.name AS fName

Фильтрация ID(p) < ID(f) выполняется, чтобы избежать использования одной и той же пары Person имена возвращаются дважды (в обратном порядке).

[ОБНОВЛЕНИЕ]

Чтобы получить количество количества друзей у каждого Person, вы можете воспользоваться нового синтаксиса CALL (в neo4j 4.0) для обработки после объединения :

CALL {
  MATCH (p:Person)-[:ENEMY{type:'human'}]-(:Person)-[:ENEMY{type:'human'}]-(f:Person)
  WHERE ID(p) < ID(f)
  RETURN p.name AS pName, f
  UNION
  MATCH (p:Person)-[:FRIEND{type:'human'}]-(f:Person)
  WHERE ID(p) < ID(f)
  RETURN p.name AS pName, f
}
RETURN pName, COUNT(f) AS friendCount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...