SpringBoot+Neo4j在社交電商中,講述你是怎麼被綁定為下線的

  • 2020 年 2 月 24 日
  • 筆記

上兩篇文章我們主要講解了Neo4j的基本知識以及Neo4j的基本使用,這篇文章我們就以實例來深入的理解一下,我們以社交電商中的綁定關係為例,使用SpringBoot+Neo4j來實現。

Neo4j文章回顧:

  • 不懂Neo4j?沒關係,一起學
  • 圖文並茂教你學會操作圖數據庫Neo4j

一、分析

社交電商中,現在做的比較出色的就應該屬於花生日記,以及最近比較火的芬香。或許你經常會收到朋友或者親戚發來的分享出的商品,而當你點擊這些分享出來的商品後,那麼,恭喜你,你可能已經被綁定為下級(粉絲)了。當然,我們這裡只是舉例說明下。

下面我們就用SpringBoot+Neo4j實現別人分享出來的商品,你點擊了,註冊成為新用戶,進而被綁定為下線來詳細說明。

二、代碼架構

代碼架構如下,這裡沒有寫controller和service,以test來測試,也是為了方便。

三、代碼實現

1.引入Neo4j依賴

2.添加 neo4j 配置

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,點擊查看源碼會發現,這裏面封裝好了簡單的增刪改查。

5.增加一個官方用戶

增加完後,我們有兩種方法查看,一是在Neo4j的控制台查看,另一個是在代碼中查看。這裡我們先在Neo4j的控制台查詢下:

說明官方用戶已經增加成功了。

6.查詢官方用戶

這裡我們使用代碼查詢剛剛創建的官方用戶。

7.綁定用戶

除了官方用戶外,假設第一個註冊的是 隔壁老王,即隔壁老王綁定在了官方用戶下,也可以叫官方用戶發展了 隔壁老王為下線。

我們在控制台查看下創建的關係:

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

隔壁老王人緣廣,發展了小張、小李、小吳、小周等人:

我們從控制台上查看綁定關係:

這樣,綁定關係就已經形成了。

四、源碼下載

為了方便,已經將源碼上傳到github 了,地址:https://github.com/joeBeckham/springboot-learn

五、說在最後

社交電商中經常會存在返佣,你買了東西,你的上級就會得到百分之多少,這樣,就會用到dao層中的 《查詢某個節點的直屬父節點》 方法,即:findParent。

你買了東西,可能並不會直接返佣到你的上級,可能會找某個等級的上級,這時候你就會用到dao層中的《查詢某個節點的 指定等級的所有父節點》,即:findParentByLevel。

你買了東西,可能會返佣給指定等級的最近的一個父節點,這時候你就會用到dao層中的《查詢某個節點的 指定等級的 最近的父節點》,即:findParentInfoByLevel。

這些我們就不一一舉例了。

以上就是我們今天介紹的使用SpringBoot + Neo4j來實現社交電商中的綁定邏輯。