我想在Neo4j中制作IMDB的角色/角色结构。我需要标签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
,因为这不是真正的关系。
如何在Neo4j中使用3个外键(movie_id, character_id, person_id
)创建RDBMS链接表?
修改1
RDBMS等效项:
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
答案 0 :(得分:2)
您的问题已由hypergraphs解决。但是由于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)
答案 1 :(得分:1)
在Actor
和Movie
和rich relationship之间建立关系,其中Actor
和PLAYED_IN
的{{1}}扮演特定的{{1 }}。 Movie
被实现为具有其自身属性的单独实体(关系实体),并且仅在Role
和Role
之间存在关系时才成为实体。
Actor
(提到链接的令牌)