Отношение Graphdb / Neo4j к другому отношению или отношение с 3 узлами - PullRequest
0 голосов
/ 30 октября 2018

Я хочу сделать структуру персонажей / ролей 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

Ответы [ 2 ]

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

Ваша проблема решена с помощью гиперграфов . Но поскольку neo4j не поддерживает гиперграфы, вам необходимо смоделировать их. Например:

CREATE (P1:Person {name: 'Tobey Maguire'})
CREATE (P2:Person {name: 'Nicholas Hammond'})
CREATE (CW1:CreativeWork {name: 'Spider-Man'})
CREATE (CW2:CreativeWork {name: 'The Amazing Spider-Man (TV Series)'})
CREATE (CH:Character {name: 'Spider-Man'})

CREATE (A1:Role)
CREATE (A2:Role)

CREATE (P1)-[:PLAYS_AS]->(A1)
CREATE (A1)-[:HAS_CHARACTER]->(CH)
CREATE (A1)-[:PLAYS_IN]->(CW1)

CREATE (P2)-[:PLAYS_AS]->(A2)
CREATE (A2)-[:HAS_CHARACTER]->(CH)
CREATE (A2)-[:PLAYS_IN]->(CW2)

enter image description here

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

Сделайте ваши отношения между Actor и Movie a богатыми отношениями , где Actor who PLAYED_IN a Movie играет определенного Role. Role реализуется как отдельная сущность (сущность отношения) со своими собственными свойствами и становится сущностью, только когда существует связь между Actor и Movie.

@NodeEntity
public class Actor {
    Long id;
    @Relationship(type="PLAYED_IN") private Role playedIn;
}

@RelationshipEntity(type = "PLAYED_IN")
public class Role {
    @Id @GeneratedValue   private Long relationshipId;
    @Property  private String title;
    @StartNode private Actor actor;
    @EndNode   private Movie movie;
}

@NodeEntity
public class Movie {
    private Long id;
    private String title;
}

(токен по указанной ссылке)

...