Запрос Cypher для пары узлов, которые связаны по крайней мере с 2 другими узлами? - PullRequest
0 голосов
/ 14 октября 2018

У меня проблема с тем, что мне нужно найти количество узлов, к которым оба пары узлов одного типа подключены.

, поэтому
(a1) - (b)
(a2) - (b)
(a1) - (c)
(a2) - (c)

Результат, который я хочу получить:
a1, a2,2
[пара узлов, на которые я смотрю] и подсчитайте, сколько других заметок относятся к ним обоим.

Пока у меня есть запрос, который дает мне нужные мне узлы, но я запуталсяотносительно того, как я могу сформировать «пару», которую я затем могу искать на других связанных узлах.

Добавление примера:
CREATE
(a1: Node {name: 'Alice'}) - [: REFERS] -> (b: узел {имя: 'movie1'}),
(a2: узел {имя: 'Bob'}) - [: REFERS] -> (b),
(a3: Узел {имя: 'Чарли'}) - [: REFERS] -> (b),
(a3) ​​- [: REFERS] -> (d: Узел {name: 'movie3'}),
(a3) ​​- [: REFERS] -> (e: Node {name: 'movie4'}),
(a1) - [: REFERS] -> (c: Node {name: 'movie2'}),
(a2) - [: REFERS] -> (c);

Информация, которую я хочу извлечь, - это то, какая пара актеров была в фильме вместе, и количество # фильмов, в которых была пара актеров.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

1.Создание вашего графика

С дополнительной информацией и требованиями я хочу предложить вам адаптированный график, который учитывает различные роли Actor и Movie:

CREATE
  (alice:Actor {name: 'Alice'})-[:REFERS]->(movie1:Movie {name: 'Movie 1'}),
  (bob:Actor {name: 'Bob'})-[:REFERS]->(movie1),
  (charlie:Actor {name: 'Charlie'})-[:REFERS]->(movie1),
  (charlie)-[:REFERS]->(movie3:Movie {name: 'Movie 3'}),
  (charlie)-[:REFERS]->(movie4:Movie {name: 'Movie 4'}),
  (alice)-[:REFERS]->(movie2:Movie {name: 'Movie 2'}),
  (bob)-[:REFERS]->(movie2);

example graph

2.Реализация

2.1 Требование I

"Информация, которую я хочу извлечь, - это то, какая пара актеров была вместе в фильме [...]."

2.1.1 Решение

MATCH
  (movie:Movie)<-[:REFERS]-(actor:Actor)
RETURN
  movie.name AS movieName, collect(actor.name) AS actorTeam;

2.1.2 Результат

╒═══════════╤═════════════════════════╕
│"movieName"│"actorTeam"              │
╞═══════════╪═════════════════════════╡
│"Movie 2"  │["Alice","Bob"]          │
├───────────┼─────────────────────────┤
│"Movie 1"  │["Alice","Bob","Charlie"]│
├───────────┼─────────────────────────┤
│"Movie 4"  │["Charlie"]              │
├───────────┼─────────────────────────┤
│"Movie 3"  │["Charlie"]              │
└───────────┴─────────────────────────┘

2.2 Требование II

"Информация, которую я хочу извлечь, - [...] количество # фильмов, в которых участвовала пара актеров. "

2.2.1 Решение

MATCH
  (movie:Movie)<-[:REFERS]-(actor:Actor)
WITH
  movie.name AS movieName, collect(actor.name) AS actorTeam
RETURN
  actorTeam, count(actorTeam) AS movieAmount;

2.2.2 Результат

╒═════════════════════════╤═════════════╕
│"actorTeam"              │"movieAmount"│
╞═════════════════════════╪═════════════╡
│["Alice","Bob","Charlie"]│1            │
├─────────────────────────┼─────────────┤
│["Charlie"]              │2            │
├─────────────────────────┼─────────────┤
│["Alice","Bob"]          │1            │
└─────────────────────────┴─────────────┘


[расширение]

2.3 Требование A (из комментария)

"'Алиса, Боб': 2," Чарли, Алиса ": 1," Чарли,bob '1 (те, у кого 1 актер не имеет значения) "

2.3.1 Решение

MATCH
  (startActor:Actor)-[:REFERS]->(movie:Movie)<-[:REFERS]-(endActor:Actor)
  WHERE
  id(startActor) < id(endActor)
WITH
  startActor.name AS startActorName, endActor.name AS endActorName, count(movie) AS movieAmount
RETURN
  startActorName, endActorName, movieAmount;

Сравнение id в предложении WHERE строки4 позволяет избежать двух отношений на пару (по одному в каждом направлении) и предотвращает создание отношений между узлами и самими собой.

2.3.2 Результат

╒════════════════╤══════════════╤═════════════╕
│"startActorName"│"endActorName"│"movieAmount"│
╞════════════════╪══════════════╪═════════════╡
│"Alice"         │"Bob"         │2            │
├────────────────┼──────────────┼─────────────┤
│"Alice"         │"Charlie"     │1            │
├────────────────┼──────────────┼─────────────┤
│"Bob"           │"Charlie"     │1            │
└────────────────┴──────────────┴─────────────┘
0 голосов
/ 14 октября 2018

Создание вашего графика

Для простоты возможных дальнейших ответов и решений отмечу мое утверждение создания графика:

CREATE
  (a1:Node {name: 'a1'})-[:REFERS]->(b:Node {name: 'b'}),
  (a2:Node {name: 'a2'})-[:REFERS]->(b),
  (a3:Node {name: 'a3'})-[:REFERS]->(b),
  (a1)-[:REFERS]->(c:Node {name: 'c'}),
  (a2)-[:REFERS]->(c);

example graph

Решение

MATCH
  (startNode:Node)-[:REFERS]-(endNode:Node)
WITH
  startNode.name AS inspectedNode, collect(endNode.name) AS pair
RETURN
  inspectedNode, pair, size(pair) AS pairAmount;

Результат

╒═══════════════╤════════════════╤════════════╕
│"inspectedNode"│"pair"          │"pairAmount"│
╞═══════════════╪════════════════╪════════════╡
│"a2"           │["b","c"]       │2           │
├───────────────┼────────────────┼────────────┤
│"c"            │["a1","a2"]     │2           │
├───────────────┼────────────────┼────────────┤
│"b"            │["a1","a2","a3"]│3           │
├───────────────┼────────────────┼────────────┤
│"a1"           │["b","c"]       │2           │
├───────────────┼────────────────┼────────────┤
│"a3"           │["b"]           │1           │
└───────────────┴────────────────┴────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...