Я хочу сделать структуру персонажей / ролей IMDB в Neo4j. Мне понадобятся ярлыки Person
, Movie
и Character
. Character
, потому что персонаж может быть в нескольких фильмах, сыгранных разными людьми.
Без Character
легко:
(Person)-[:PLAYS_IN]->(Movie)
Но PLAYS_IN
- это Character
, так что это будет что-то вроде:
(Person)-[:PLAYS_AS]->(Character)-[:PLAYS_IN]->(Movie)
но это не работает, потому что у него нет прямых Person-Movie
отношений. Без этого все, кто когда-либо играл Питера Паркера, есть в каждом фильме, в котором есть Питер Паркер.
Должны быть отношения Персона-Кино, но также отношение Персона-Кино-персонаж. Как? Это может сработать, но это просто противно:
(Person)-[:PLAYS_IN {uuid}]->(Movie), (Character {uuid})
потому что сейчас я создаю свой собственный тип отношений с внешним ключом. Это очень ungraphdb. Но это работает:
MATCH (p:Person)-[r:PLAYS_IN]->(m:Movie), (c:Character)
WHERE c.uuid = r.uuid
RETURN p, c, m
путем построения декартового произведения = (которое является очень RDBMS, но не очень GraphDB. И я не могу запросить Character-Movie
или Character-Person
, потому что это не настоящие отношения.
Как создать таблицу ссылок СУБД с 3 внешними ключами (movie_id, character_id, person_id
) в Neo4j ??
редактировать 1
Эквивалент СУБД:
movies (id, title) # e.g. Dragon Tattoo, or Spider's Web
people (id, name) # e.g. Rooney Mara, or Claire Foy
characters (id, name) # e.g. Lisbeth Salander
roles (movie_id, person_id, character_id) # 2 rows with 1 distinct character_id