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);
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 │
└────────────────┴──────────────┴─────────────┘