neo4j 查询同一节点的两个上级_SpringBoot+Neo4j在社交电商中,讲述你是怎么被绑定为下线的...

点击上方码农小胖哥,选择“设为星标”

优质文章,及时送达

59064f924bf832df96fdb38ae2719bbc.png

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

Neo4j文章回顾:

  • 不懂Neo4j?没关系,一起学

  • 图文并茂教你学会操作图数据库Neo4j

一、分析

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

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

二、代码架构

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

09ce566f9d8922d7c2a6995e29497496.png

三、代码实现

1.引入Neo4j依赖

d2f5308b8ff13a9c1f41555d73c37152.png

2.添加 neo4j 配置

00d4639a3a1959ea20f0f6f12eb70775.png

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,点击查看源码会发现,这里面封装好了简单的增删改查。

1c962599703bd089bf197d19af740286.png

5.增加一个官方用户

e1755b3fc20ee8803f0e391974f41263.png

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

686a5812d4de9270ec2fd7430676f1c0.png

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

6.查询官方用户

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

95645de4aac72391389cca464213e2ee.png

7.绑定用户

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

f83336e3468d2e31e497684d3117227c.png

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

match (p:MemberInvit) return p

或者

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

48377be10a23a360d7a5b40d32f03caa.png

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

135e80d8bd4fd55d645948d18270a33c.png

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

b28080daf109c6752933a8b2ddb842e6.png

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

四、源码下载

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

五、说在最后

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

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

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

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

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

20349e49319becdf3a0736a4dc3fe461.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值