代码之家  ›  专栏  ›  技术社区  ›  Rudie

graphdb/neo4j与另一个关系或与3个节点的关系

  •  2
  • Rudie  · 技术社区  · 7 年前

    我想在neo4j中创建imdb的字符/角色结构。 Person , Movie Character . 性格 ,因为一个角色可以出现在多部电影中,由不同的人播放。

    没有 性格 这很容易:

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

    但是 PLAYS_IN 是一个 性格 ,所以应该是:

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

    但那不起作用,因为它没有直接的 Person-Movie 关系。没有这个,每个扮演过彼得·帕克的人,都会出现在每部有彼得·帕克的电影里。

    一定有人电影关系,也有人电影人物关系。怎样?这可能管用,但那太恶心了:

    (Person)-[:PLAYS_IN {uuid}]->(Movie), (Character {uuid})
    

    因为现在我正在建立我自己的外键关系。那真是太无趣了。但它有效:

    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个外键创建rdbms链接表( movie_id, character_id, person_id 在NeN4J??

    编辑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
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   stdob--    7 年前

    你的问题是通过 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)
    

    enter image description here

        2
  •  1
  •   ThirstForKnowledge    7 年前

    使你的关系 Actor Movie rich relationship 在哪里 演员 PLAYED_IN 电影 播放特定的 Role . 这个 角色 是作为一个单独的实体(关系实体)实现的,具有自己的属性,并且只有当 演员 电影 存在。

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

    (来自上述链接的令牌)