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接口,結果如圖: