【问题标题】:Graphdb/Neo4j relationship to another relationship, or relationship with 3 nodesGraphdb/Neo4j 与另一个关系的关系,或与 3 个节点的关系
【发布时间】:2018-10-30 12:50:23
【问题描述】:

我想在 Neo4j 中制作 IMDB 的角色/角色结构。我需要标签PersonMovieCharacterCharacter,因为一个角色可以出现在多部电影中,由不同的人扮演。

没有Character,很简单:

(Person)-[:PLAYS_IN]->(Movie)

但是PLAYS_INCharacter,所以应该是这样的:

(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-MovieCharacter-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

【问题讨论】:

    标签: neo4j graph-databases


    【解决方案1】:

    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)
    

    【讨论】:

    • 所以Role 就像一个链接表......这真的是 Neo4j 的方式吗?太不雅了!
    • 如何识别这样的节点?添加uuid,或者使用_id,或者通过它的关系?
    • 感觉很奇怪,像这样一个空的关系节点,但是效果很好!这是更喜欢它! screencast.com/t/nQLqDJEtw 这是“官方”的 Neo4j 方式吗?
    • 就是感觉怪怪的,在graphdb中做一个链接表节点。链接表是 RDBMS 中必要的不良设计。这就是graphdb如何宣传自己的优势。现在我正在为它的外键创建一个空节点......感觉很奇怪。但效果很好!
    • @Rudie 这取决于观点:你的案例中的角色不是一个适合演员和电影节点之间关系的概念。如果你把它扩展到一个角色由一个演员扮演并由另一个演员配音的情况,那么一切都会到位。
    【解决方案2】:

    ActorMovierich relationship 之间建立关系,其中ActorPLAYED_INMovie 扮演特定的RoleRole 被实现为具有自己属性的单独实体(关系实体),并且仅在ActorMovie 之间存在关系时才成为实体。

    @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;
    }
    

    (来自上述链接的令牌)

    【讨论】:

    • 我没有要注释的代码。我只有查询。如何与 MATCH 和 CREATE 建立丰富的关系?你的角色有一个演员和一个电影。这就是问题所在:一个角色/角色可以在许多电影中被许多演员重复使用。我将在问题中添加一个等效的 RDBMS。
    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 2014-03-08
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多