Поиск узлов, которые связаны как минимум с 2 одинаковыми узлами через 2 взаимосвязи, но промежуточный из которых отличается - PullRequest
0 голосов
/ 25 марта 2020

Я хотел бы выяснить все пары людей и несчастных случаев в следующем случае:

  • Лица, которые участвовали как минимум в двух одинаковых авариях, когда они находились в двух разных автомобилях.

У меня всегда есть следующие отношения: Человек -> Автомобиль -> Авария

Я сделал упрощенный и воспроизводимый пример:

CREATE
  (p1:Person {name: 'Paul'})-[:DRIVES]->(c1:Car {name: 'Car A'}),
  (p2:Person {name: 'John'})-[:DRIVES]->(c2:Car {name: 'Car B'}),
  (p3:Person {name: 'Mike'})-[:DRIVES]->(c3:Car {name: 'Car C'}),
  (p4:Person {name: 'Joe'})-[:OCCUPANT]->(c1),
  (p4)-[:OCCUPANT]->(c3),
  (c1)-[:IS_DOER]->(a1: Accident {name: 'Crash 1'}),
  (c2)-[:IS_VICTIM]->(a1),
  (c2)-[:IS_DOER]->(a2: Accident {name: 'Crash 2'}),
  (c3)-[:IS_VICTIM]->(a2) ;

И вот как выглядит график:

enter image description here

В этом примере я хотел бы вернуть пары («Джо», «Джон») и (« Cra sh 1 "," Cra sh 2 "), потому что Джо и Джон попали как минимум в две одинаковые аварии, находясь в разных автомобилях.

Спасибо за помощь.

1 Ответ

0 голосов
/ 25 марта 2020

На самом деле я думаю, что нашел ответ:

MATCH
  (p1:Person)-[r1]->(c1:Car)-[r2]->(a:Accident)<-[r3]-(c2:Car)<-[r4]-(p2:Person)
WHERE c1<>c2
WITH p1, p2, COUNT(DISTINCT a) AS count_accident
WHERE count_accident>= 2
RETURN p1, p2
...