深入实践Spring Boot2.4.2 节点和关系实体建模

    xiaoxiao2024-04-13  119

    2.4.2 节点和关系实体建模

    虽然Neo4j没有表结构的概念,但它有节点和关系的概念。例如,现在有演员和电影两个实体,它们的关系表现为一个演员在一部电影中扮演一个角色。那么就可以创建演员和电影两个节点实体,和一个角色关系实体。它们的实体-关系模型如图2-5所示。这个实体-关系模型的定义比起关系型数据库的实体-关系模型的定义要简单得多,但是它更加形象和贴切地表现了实体之间的关系。更难能可贵的是,这个实体-关系模型是可以不经过任何转换而直接存入数据库的,也就是说,在Neo4j图数据库中保存的数据与图2-5所示的相同,它仍然是一张图。这对于业务人员和数据库设计人员来说,它的意义相同。所以使用Neo4j数据库,将在很大程度上减轻了设计工作和沟通成本。

    像JPA使用了ORM一样,Neo4j使用了对象-图形映射(Object-Graph Mapping,OGM)的方式来建模。代码清单2-21是演员节点实体建模,使用注解@JsonIdentityInfo是防止查询数据时引发递归访问效应,注解@NodeEntity标志这个类是一个节点实体,注解@GraphId定义了节点的一个唯一性标识,它将在创建节点时由系统自动生成,所以它是不可缺少的。这个节点预定义了其他两个属性,name和born。节点的属性可以随需要增加或减少,这并不影响节点的使用。

    代码清单2-21 演员节点实体建模

    @JsonIdentityInfo(generator=JSOGGenerator.class)

    @NodeEntity

    public class Actor {

        @GraphId Long id;

        private String name;

        private int born;

     

        public Actor() { }

    ……

    代码清单2-22是电影节点实体建模,注解@Relationship表示List<Role>是一个关系列表,其中type设定了关系的类型,direction设定这个关系的方向,Relationship.INCOMING表示以这个节点为终点。addRole定义了增加一个关系的方法。

    代码清单2-22 电影节点实体建模

    @JsonIdentityInfo(generator=JSOGGenerator.class)

    @NodeEntity

    public class Movie {

        @GraphId Long id;

        String title;

        String year;

        String tagline;

        @Relationship(type="ACTS_IN", direction = Relationship.INCOMING)

        List<Role> roles = new ArrayList<>();

     

        public Role addRole(Actor actor, String name){

            Role role = new Role(actor,this,name);

            this.roles.add(role);

            return role;

        }

     

        public Movie() { }

    ……

    代码清单2-23是角色的关系实体建模,注解@RelationshipEntity表明这个类是一个关系实体,并用type指定了关系的类型,其中@StartNode指定起始节点的实体,

    @EndNode指定终止节点的实体,这说明了图中一条有向边的起点和终点的定义。其中定义了一个创建关系的构造函数Role(Actor actor,Movie movie,String name),这里的name参数用来指定这个关系的属性。

    代码清单2-23 角色关系实体建模

    @JsonIdentityInfo(generator=JSOGGenerator.class)

    @RelationshipEntity(type = "ACTS_IN")

    public class Role {

        @GraphId

        Long id;

        String role;

        @StartNode

        Actor actor;

        @EndNode

        Movie movie;

     

        public Role() {

        }

     

        public Role(Actor actor, Movie movie, String name) {

            this.actor = actor;

            this.movie = movie;

            this.role = name;

        }

    ......

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)