zoukankan      html  css  js  c++  java
  • SpringBoot+Neo4j在社交电商中,讲述你是怎么被绑定为下线的

    上两篇文章我们主要讲解了Neo4j的基本知识以及Neo4j的基本使用,这篇文章我们就以实例来深入的理解一下,我们以社交电商中的绑定关系为例,使用SpringBoot+Neo4j来实现。

    Neo4j文章回顾:

    一、分析

    社交电商中,现在做的比较出色的就应该属于花生日记,以及最近比较火的芬香。或许你经常会收到朋友或者亲戚发来的分享出的商品,而当你点击这些分享出来的商品后,那么,恭喜你,你可能已经被绑定为下级(粉丝)了。当然,我们这里只是举例说明下。

    下面我们就用SpringBoot+Neo4j实现别人分享出来的商品,你点击了,注册成为新用户,进而被绑定为下线来详细说明。

    二、代码架构

    代码架构如下,这里没有写controller和service,以test来测试,也是为了方便。

    1578887311044

    三、代码实现

    1.引入Neo4j依赖

    1578882711200

    2.添加 neo4j 配置

    1578882765769

    3.添加Neo4j 节点类

    这里添加一个MemberInvit节点,有点注解类似于Mysql中的table 映射的对象类,mysql中叫做ORM,neo4j中叫做OGM。这里要使用到的是 @NodeEntity 注解和 @Id注解。

    • @NodeEntity声明该类为Neo4j的节点类
    • @Id Neo4j的主键。
    package com.xsjt.learn.neo4j.model;
    
    import lombok.*;
    import org.neo4j.ogm.annotation.Id;
    import org.neo4j.ogm.annotation.NodeEntity;
    import org.neo4j.ogm.annotation.Relationship;
    import java.io.Serializable;
    import java.util.HashSet;
    import java.util.Set;
    
    /**
     * @author Joe
     */
    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    @NodeEntity(label = "MemberInvit")
    public class MemberInvit implements Serializable {
    
        /** 用户id */
        @Id
        private Long mId;
    
        /** 用户名称 */
        private String name;
    
        /** 用户等级 */
        private Integer level;
    
        /** 发展的下级 */
        @Relationship(type = "develop")
        private Set<MemberInvit> fans;
    
        /**
         * 发展 方法
         * @param memberInvit 用户邀请信息
         */
        public void develop(MemberInvit memberInvit) {
            if (fans == null) {
                fans = new HashSet<>();
            }
            fans.add(memberInvit);
        }
    }
    

    4.创建repositories类

    当然,下面的方法不一定在我们绑定示例中用得到,但是在社交电商中这些都是基本要用的。

    package com.xsjt.learn.neo4j.dao;
    
    import com.xsjt.learn.neo4j.model.MemberInvit;
    import org.springframework.data.neo4j.annotation.Query;
    import org.springframework.data.neo4j.repository.Neo4jRepository;
    import org.springframework.data.repository.query.Param;
    import org.springframework.stereotype.Repository;
    import java.util.List;
    
    /**
     * dao层
     * @author Joe
     * @date 2020-01-13
     */
    @Repository
    public interface MemberInvitRepository extends Neo4jRepository<MemberInvit, String> {
    
        /**
         * 根据节点id查询节点信息
         * @param mId
         * @return
         */
        MemberInvit findBymId(Long mId);
    
        /**
         * 查询某个节点的所有子节点
         * @param mId
         * @return
         */
        @Query("Match (p:MemberInvit{mId:{mId}})-[*]->(s:MemberInvit) return s ")
        List<MemberInvit> findChildList(Long mId);
    
        /**
         * 查询某个节点的直属父节点
         * @param mId
         * @return
         */
        @Query("Match (p:MemberInvit)-[*]->(s:MemberInvit{mId:{mId}}) return p limit 1")
        MemberInvit findParent(@Param("mId") Long mId);
    
        /**
         * 查询某个节点的所有父节点
         * @param mId
         * @return
         */
        @Query("Match (p:MemberInvit)-[*]->(s:MemberInvit{mId:{mId}}) return p")
        List<MemberInvit> findParentList(@Param("mId") Long mId);
    
    
        /**
         * 查询某个节点的 指定等级的 最近的父节点
         * @param mId
         * @param level
         * @return
         */
        @Query("Match (p:MemberInvit{level:{level}})-[*]->(s:MemberInvit{mId:{mId}}) return p limit 1")
        MemberInvit findParentInfoByLevel(@Param("mId") Long mId, @Param("level") Integer level);
    
        /**
         * 查询某个节点的 指定等级的所有父节点
         * @param mId
         * @param level
         * @return
         */
        @Query("Match (p:MemberInvit{level:{level}})-[*]->(s:MemberInvit{mId:{mId}}) return p")
        List<MemberInvit> findParentByLevel(@Param("mId") Long mId, @Param("level") Integer level);
    
    }
    

    这里继承了Neo4jRepository,点击查看源码会发现,这里面封装好了简单的增删改查。

    1578883557886

    5.增加一个官方用户

    1578884611664

    增加完后,我们有两种方法查看,一是在Neo4j的控制台查看,另一个是在代码中查看。这里我们先在Neo4j的控制台查询下:

    1578884729236

    说明官方用户已经增加成功了。

    6.查询官方用户

    这里我们使用代码查询刚刚创建的官方用户。

    1578884860283

    7.绑定用户

    除了官方用户外,假设第一个注册的是 隔壁老王,即隔壁老王绑定在了官方用户下,也可以叫官方用户发展了 隔壁老王为下线。

    1578885814796

    我们在控制台查看下创建的关系:

    match (p:MemberInvit) return p
    或者
    match (p:MemberInvit)-[d:develop]->(s:MemberInvit) return p,d,s
    

    1578886003913

    隔壁老王人缘广,发展了小张、小李、小吴、小周等人:

    1578886625902

    我们从控制台上查看绑定关系:

    1578886677904

    这样,绑定关系就已经形成了。

    四、源码下载

    为了方便,已经将源码上传到github 了,地址:https://github.com/joeBeckham/springboot-learn

    五、说在最后

    社交电商中经常会存在返佣,你买了东西,你的上级就会得到百分之多少,这样,就会用到dao层中的 《查询某个节点的直属父节点》 方法,即:findParent。

    你买了东西,可能并不会直接返佣到你的上级,可能会找某个等级的上级,这时候你就会用到dao层中的《查询某个节点的 指定等级的所有父节点》,即:findParentByLevel。

    你买了东西,可能会返佣给指定等级的最近的一个父节点,这时候你就会用到dao层中的《查询某个节点的 指定等级的 最近的父节点》,即:findParentInfoByLevel。

    这些我们就不一一举例了。

    以上就是我们今天介绍的使用SpringBoot + Neo4j来实现社交电商中的绑定逻辑。

    欢迎关注我的公众号,第一时间接收最新文章~ 搜索公众号: 码咖 或者 扫描下方二维码:

    1578886677904

  • 相关阅读:
    ActiveMQ 中的链表
    ActiveMQ 的线程池
    ActiveMQ broker解析
    ActiveMQ broker和客户端之间的确认
    ActiveMQ producer 流量控制
    基于大数据的精准营销与应用场景
    Math.abs为Integer.Min_VALUE返回错误的值
    使用http_load网站压力测试
    可伸缩系统的架构经验
    Tumblr:150亿月浏览量背后的架构挑战
  • 原文地址:https://www.cnblogs.com/xbq8080/p/12187408.html
Copyright © 2011-2022 走看看