spring data neo4j 中节点实体之间的关系在代码中怎样维护

首先我们要知道在图中关系是有关系指向的

比如我们有如下实体

user :  用户 shop : 商店 sku  : 商品

我们想让他们三者具有如下的关系

user----buy-->sku  <-----own---- shop

在图数据库中显示如下

64855b035e755e97f021dffa2ab68458863.jpg

那么我们在代码中要怎样构建这样的实体关系呢 ?

 

(我的domain :基本目录结构如下)

02c74b86d264685d3429493a2527c451ec4.jpg

一、首先我们先定义节点和关系的公共基类

节点和关系的基类

package org.jsg.domain.base;

import org.neo4j.ogm.annotation.GraphId;

/**
 * 最基础的entity无论是节点还是关系都需要继承
 * 提供最基础的 id属性,equals、hashCode方法
 *
 * @author zjl
 */
public abstract class AllBaseEntity {

   /**
    * id 必须为Long类型,而且必须提供(节点和关系都需要)。且要加这个注解。
    * id 由图数据库统一操作,所以不需要setter
    */
   @GraphId
   private Long id;

   public Long getId() {
      return id;
   }

   @Override
   public boolean equals(Object obj) {
      if (this == obj) {
         return true;
      }

      if (obj == null) {
         return false;
      }

      if (getClass() != obj.getClass()) {
         return false;
      }

      if (this.id == null) {
         // For newly created entity, id will be null
         return false;
      }

      AllBaseEntity entity = (AllBaseEntity) obj;
      return this.id.equals(entity.id);
   }

   @Override
   public int hashCode() {
      return id == null ? super.hashCode() : id.hashCode();
   }
}

节点的基类

package org.jsg.domain.base;

/**
 * 节点需要继承的基础类
 * 提供节点的公共属性-name
 *
 * @author zjl
 */
public abstract class NodeBaseEntity extends AllBaseEntity {

    /**
     * 在图数据库中每个节点展示的名字
     */
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

二、定义我们的节点

package org.jsg.domain;

import org.jsg.domain.base.NodeBaseEntity;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;

import java.util.List;

/**
 * 节点-店铺
 *
 * @author zjl
 */
@NodeEntity
public class shop extends NodeBaseEntity {
// 之所以类名小写是因为SpringDate-neo4j 生成的节点标识和类名相同,为了匹配数据给过来的数据,所以小写了类名
    /**
     * 一个属性值:店铺名称
     */
    private String shop_name;

    /**
     * 商店有那些商品
     * 关系指向在定义时已经确定shop ->sku
     */
    @Relationship(type="own", direction=Relationship.INCOMING)
    private List<sku> skuses;

    public String getShop_name() {
        return shop_name;
    }

    public void setShop_name(String shop_name) {
        this.shop_name = shop_name;
    }

    public List<sku> getSkuses() {
        return skuses;
    }

    public void setSkuses(List<sku> skuses) {
        this.skuses = skuses;
    }

}

 

package org.jsg.domain;

import org.jsg.domain.base.NodeBaseEntity;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;

import java.util.List;

/**
 * 节点-商品SKU
 *
 * @author zjl
 */
@NodeEntity
public class sku extends NodeBaseEntity {
// 之所以类名小写是因为SpringDate-neo4j 生成的节点标识和类名相同,为了匹配数据给过来的数据,所以小写了类名
    /**
     * 商品的SKUId
     */
    private String item_sku_id;

    /**
     * 商品质量标志(违规商品-正常商品)
     */
    private Integer bad_sku_flag;

    /**
     * 商品名称
     */
    private String sku_name;

    /**
     * 被统计次数
     */
    private Integer possible_bad_sku_times;

    /**
     * 商品被那些用户购买了
     * 关系指向在定义时已经确定:user -> sku
     */
    @Relationship(type="buy", direction=Relationship.INCOMING)
    private List<user> users;

     /**
     * 那些店铺拥有此商品
     * 关系指向在定义时已经确定:shop ->sku
     */
    @Relationship(type="own", direction=Relationship.INCOMING)
    private List<shop> shops;

    public List<shop> getShops() {
        return shops;
    }

    public void setShops(List<shop> shops) {
        this.shops = shops;
    }

    public String getItem_sku_id() {
        return item_sku_id;
    }

    public void setItem_sku_id(String item_sku_id) {
        this.item_sku_id = item_sku_id;
    }

    public Integer getBad_sku_flag() {
        return bad_sku_flag;
    }

    public void setBad_sku_flag(Integer bad_sku_flag) {
        this.bad_sku_flag = bad_sku_flag;
    }

    public String getSku_name() {
        return sku_name;
    }

    public void setSku_name(String sku_name) {
        this.sku_name = sku_name;
    }

    public List<user> getUsers() {
        return users;
    }

    public void setUsers(List<user> users) {
        this.users = users;
    }

    public Integer getPossible_bad_sku_times() {
        return possible_bad_sku_times;
    }

    public void setPossible_bad_sku_times(Integer possible_bad_sku_times) {
        this.possible_bad_sku_times = possible_bad_sku_times;
    }
}

 

package org.jsg.domain;

import org.jsg.domain.base.NodeBaseEntity;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;

import java.util.List;

/**
 * 节点-用户
 *
 * @author zjl
 */
@NodeEntity
public class user extends NodeBaseEntity {
// 之所以类名小写是因为SpringDate-neo4j 生成的节点标识和类名相同,为了匹配数据给过来的数据,所以小写了类名
    /**
     * 用户编号
     */
    private String user_id;

    /**
     * 用户购买了那些商品
     * 关系指向在定义时已经确定:user -> sku
     */
    @Relationship(type="own", direction=Relationship.INCOMING)
    private List<sku> skuses;

    public String getUser_id() {
        return user_id;
    }

    public void setUser_id(String user_id) {
        this.user_id = user_id;
    }

    public List<sku> getSkuses() {
        return skuses;
    }

    public void setSkuses(List<sku> skuses) {
        this.skuses = skuses;
    }
}

三、定义关系

package org.jsg.domain.relationship;

import org.jsg.domain.base.AllBaseEntity;
import org.neo4j.ogm.annotation.EndNode;
import org.neo4j.ogm.annotation.RelationshipEntity;
import org.neo4j.ogm.annotation.StartNode;

/**
 * 关系-买
 * 关系的指向为StartNode 指向EndNode(StartNode -> EndNode : user -> sku) 在定义关系时已经确定
 *
 * @autor zjl
 */
@RelationshipEntity(type="buy") // 此处注解中type的值就是数据库中关系存储的name值
public class Buy extends AllBaseEntity {

    @StartNode
    private org.jsg.domain.user user;

    @EndNode
    private org.jsg.domain.sku sku;

    public org.jsg.domain.user getUser() {
        return user;
    }

    public void setUser(org.jsg.domain.user user) {
        this.user = user;
    }

    public org.jsg.domain.sku getSku() {
        return sku;
    }

    public void setSku(org.jsg.domain.sku sku) {
        this.sku = sku;
    }
}
package org.jsg.domain.relationship;

import org.jsg.domain.shop;
import org.jsg.domain.base.AllBaseEntity;
import org.neo4j.ogm.annotation.EndNode;
import org.neo4j.ogm.annotation.RelationshipEntity;
import org.neo4j.ogm.annotation.StartNode;

/**
 * 关系-拥有
 * 关系的指向为StartNode 指向EndNode (StartNode -> EndNode : shop ->sku) 在定义关系时已经确定
 *
 * @autor zjl
 */
@RelationshipEntity(type="own") // 此处注解中type的值就是数据库中关系存储的name值
public class Own extends AllBaseEntity {

    @StartNode
    private shop shop;

    @EndNode
    private org.jsg.domain.sku sku;

    public shop getShop() {
        return shop;
    }

    public void setShop(shop shop) {
        this.shop = shop;
    }

    public org.jsg.domain.sku getSku() {
        return sku;
    }

    public void setSku(org.jsg.domain.sku sku) {
        this.sku = sku;
    }
}

 

转载于:https://my.oschina.net/zjllovecode/blog/2051110

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值