绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
SpringBoot2.x系列教程53--NoSQL之SpringBoot整合Neo4j
2020-06-23 16:59:01

SpringBoot2.x系列教程53--NoSQL之SpringBoot整合Neo4j

作者:一一哥

一. Spring Boot中整合Neo4j

我们上一章节简单介绍了Neo4j及其安装配置过程,这节带大家学习在Spring Boot中整合Neo4j.

1. 创建web项目

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。

2. 添加依赖包

<dependency>  
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>

3. 创建配置文件

#neo4j
spring:
  data:
    neo4j:
      uri: bolt://localhost:7474
      username: neo4j
      password: neo4j

4. 创建Neo4j的配置类

注解@EnableNeo4jRepositories用来开启Neo4j的仓库功能;
注解@EnableTransactionManagement用来支持事务。

package com.yyg.boot.config;

import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.Session;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/10
 * @Description Description
 */
@Configuration
@EnableNeo4jRepositories(basePackages = "com.yyg.boot.repository")
@EnableTransactionManagement
public class Neo4jConfig {

    @Value("${spring.data.neo4j.uri}")
    private String url;

    @Value("${spring.data.neo4j.username}")
    private String username;

    @Value("${spring.data.neo4j.password}")
    private String password;

    @Bean(name = "session")
    public Session neo4jSession() {
        Driver driver = GraphDatabase.driver(url, AuthTokens.basic(username, password));
        return driver.session();
    }

}

5. 创建关系节点实体类

ParentNode类

package com.yyg.boot.entity;

import lombok.Data;
import lombok.ToString;
import org.neo4j.ogm.annotation.*;

import java.util.HashSet;
import java.util.Set;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/10
 * @Description Description
 */
@Data
@ToString
@NodeEntity("ParentNode")
public class ParentNode {

    @Id
    @GeneratedValue
    private Long id;

    private @Property(name = "name")
    String name;

    private @Relationship(type = "RelationEdge")
    Set<RelationNode> sets = new HashSet<>();

    public ParentNode(String name) {
        this.name = name;
    }

    public void addRelation(SonNode sonNode, String name) {
        RelationNode relationNode = new RelationNode(this, name, sonNode);
        sets.add(relationNode);
        sonNode.getSets().add(relationNode);
    }

}

SonNode类

package com.yyg.boot.entity;

import lombok.Data;
import lombok.ToString;
import org.neo4j.ogm.annotation.*;

import java.util.HashSet;
import java.util.Set;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/10
 * @Description Description
 */
@NodeEntity("SonNode")
@Data
@ToString
public class SonNode {

    @Id
    @GeneratedValue
    private Long id;

    @Property(name = "name")
    private String name;

    private @Relationship(type = "RelationEdge", direction = "INCOMING")
    Set<RelationNode> sets = new HashSet<>();

    public SonNode(String name) {
        this.name = name;
    }

}

RelationNode节点类

package com.yyg.boot.entity;

import lombok.Data;
import lombok.ToString;
import org.neo4j.ogm.annotation.*;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/10
 * @Description Description
 */
@RelationshipEntity(type = "RelationEdge")
@Data
@ToString
public class RelationNode {

    @Id
    @GeneratedValue
    private Long id;

    private @StartNode
    ParentNode parentNode;

    // 关系名
    private String name;

    private @EndNode
    SonNode sonNode;

    RelationNode(ParentNode parentNode, String name, SonNode sonNode) {
        this.parentNode = parentNode;
        this.name = name;
        this.sonNode = sonNode;
    }

}

6. 创建Repository仓库类

package com.yyg.boot.repository;

import com.yyg.boot.entity.ParentNode;
import org.springframework.data.neo4j.repository.Neo4jRepository;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/10
 * @Description Description
 */
public interface ParentRepository extends Neo4jRepository<ParentNode,Long> {
}

7. 编写Controller接口方法

package com.yyg.boot.web;

import com.yyg.boot.entity.ParentNode;
import com.yyg.boot.entity.RelationNode;
import com.yyg.boot.entity.SonNode;
import com.yyg.boot.repository.ParentRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Iterator;
import java.util.Set;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/10
 * @Description Description
 */
@RestController
@RequestMapping("/node")
@Slf4j
public class Neo4jController {

    @Autowired
    private ParentRepository parentRepository;

    @GetMapping(value = "/create")
    public void createNodeRelation() {
        SonNode sonNode1 = new SonNode("儿子小帅");
        SonNode sonNode2 = new SonNode("女儿小美");

        ParentNode parentNode = new ParentNode("爸爸:孙一一");

        parentNode.addRelation(sonNode1, "女儿");
        parentNode.addRelation(sonNode2, "儿子");

        parentRepository.save(parentNode);
    }

    @GetMapping(value = "/find")
    public void findNodes() {
        Iterable<ParentNode> parentNodes = parentRepository.findAll();
        for (ParentNode parentNode : parentNodes) {
            Set<RelationNode> relationNodeSet = parentNode.getSets();
            for (RelationNode relationNode : relationNodeSet) {
                log.info("id:" + parentNode.getId() + " name:" + parentNode.getName() + " 关系:" + relationNode.getName() + "子节点:" + relationNode.getSonNode().getName());
            }
        }
    }

}

8. 创建入口类

package com.yyg.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/9
 * @Description Description
 */
@SpringBootApplication
public class Neo4jApplication {

    public static void main(String[] args) {
        SpringApplication.run(Neo4jApplication.class, args);
    }

}

完整目录结构

9. 启动项目进行测试

注意:

要先执行/node/create接口,再执行/node/find接口,结果如图:

分享好友

分享这个小栈给你的朋友们,一起进步吧。

NoSQL与NewSQL
创建时间:2020-06-17 14:29:11
关注NoSQL与NewSQL,专区一站找到所需资料!
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 小雨滴
    专家
戳我,来吐槽~