Graphdb / Neo4j与另一个关系的关系,或与3个节点的关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Graphdb / Neo4j与另一个关系的关系,或与3个节点的关系相关的知识,希望对你有一定的参考价值。
我想在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,但不是非常极大的图。我不能查询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
你的问题是由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)
让你的Actor
和Movie
之间的关系是rich relationship,其中Actor
PLAYED_IN
和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;
}
(来自上述链接的令牌)
以上是关于Graphdb / Neo4j与另一个关系的关系,或与3个节点的关系的主要内容,如果未能解决你的问题,请参考以下文章
哪个 graphdb 用于用户的数据库。 (Neo4j 或 FB 图形 API)