Neo4j 是一个高性能的 图数据库,适用于存储和查询 节点(Node) 和 关系(Relationship) 的数据。本教程将带你从零开始,在 Spring Boot 项目中整合 Neo4j,并实现基本的 CRUD 操作。
1. Neo4j 简介
Neo4j 是一个 原生图数据库,采用 属性图模型,数据由 节点(Node) 和 关系(Relationship) 组成,每个节点和关系都可以有 属性(Property)。
Neo4j 的核心概念
概念 | 说明 |
---|---|
节点(Node) | 类似于关系数据库中的 记录,可以有标签(Label)和属性(Property)。 |
关系(Relationship) | 连接两个节点,有方向(单向或双向),可以有类型(Type)和属性(Property)。 |
属性(Property) | 键值对(Key-Value),可以存储在节点或关系上。 |
标签(Label) | 类似于关系数据库中的 表,用于分类节点。 |
类型(Type) | 类似于关系数据库中的 外键,用于定义关系的类型。 |
2. 环境准备
2.1 安装 Neo4j
方式 1:本地安装(Docker 方式)
docker run \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-e NEO4J_AUTH=neo4j/123456 \
neo4j:5.12.0
- 7474:Neo4j Web 管理界面端口
- 7687:Neo4j 数据库端口(Bolt 协议)
- NEO4J_AUTH=neo4j/123456:默认用户名
neo4j
,密码123456
访问 Neo4j Web 界面:http://localhost:7474
方式 2:云服务(Neo4j Aura)
- 官网:https://neo4j.com/cloud/aura/
- 免费试用,无需本地安装。
2.2 创建 Spring Boot 项目
使用 Spring Initializr 创建项目:
- 依赖:
- Spring Web
- Spring Data Neo4j
https://i.imgur.com/xyz1234.png
3. Spring Boot 整合 Neo4j
3.1 添加 Neo4j 依赖
在 pom.xml
中添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
3.2 配置 Neo4j 连接
在 application.yml
或 application.properties
中配置:
spring:
data:
neo4j:
uri: bolt://localhost:7687 # Neo4j Bolt 协议地址
username: neo4j # 默认用户名
password: 123456 # 默认密码
3.3 创建 Neo4j 实体类
Neo4j 的实体类使用 @Node
注解标记,类似于 JPA 的 @Entity
。
示例:定义 Person
节点
import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Node;
import org.springframework.data.neo4j.core.schema.Property;
@Node("Person") // 定义节点标签为 "Person"
public class Person {
@Id // 主键
private Long id;
@Property("name") // 属性名
private String name;
@Property("age")
private Integer age;
// 构造方法、Getter、Setter
public Person() {}
public Person(Long id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
// Getter & Setter
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}
3.4 创建 Neo4j Repository
类似于 JPA 的 JpaRepository
,Neo4j 提供 Neo4jRepository
用于 CRUD 操作。
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PersonRepository extends Neo4jRepository<Person, Long> {
// 可以自定义查询方法
List<Person> findByName(String name);
}
3.5 创建 Service 层
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class PersonService {
@Autowired
private PersonRepository personRepository;
// 保存 Person
public Person savePerson(Person person) {
return personRepository.save(person);
}
// 查询所有 Person
public List<Person> findAllPersons() {
return personRepository.findAll();
}
// 按名字查询 Person
public List<Person> findByName(String name) {
return personRepository.findByName(name);
}
// 删除 Person
public void deletePerson(Long id) {
personRepository.deleteById(id);
}
}
3.6 创建 Controller 层
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/persons")
public class PersonController {
@Autowired
private PersonService personService;
// 新增 Person
@PostMapping
public Person addPerson(@RequestBody Person person) {
return personService.savePerson(person);
}
// 查询所有 Person
@GetMapping
public List<Person> getAllPersons() {
return personService.findAllPersons();
}
// 按名字查询 Person
@GetMapping("/name/{name}")
public List<Person> getPersonsByName(@PathVariable String name) {
return personService.findByName(name);
}
// 删除 Person
@DeleteMapping("/{id}")
public void deletePerson(@PathVariable Long id) {
personService.deletePerson(id);
}
}
4. 测试 Neo4j 操作
4.1 启动 Spring Boot 项目
运行 SpringBootApplication
主类,访问:
- Neo4j Web 界面:http://localhost:7474
- API 接口:
POST /api/persons
(新增 Person)GET /api/persons
(查询所有 Person)GET /api/persons/name/{name}
(按名字查询)DELETE /api/persons/{id}
(删除 Person)
4.2 使用 Postman 测试
(1) 新增 Person
POST http://localhost:8080/api/persons
{
"id": 1,
"name": "Alice",
"age": 25
}
(2) 查询所有 Person
GET http://localhost:8080/api/persons
(3) 按名字查询
GET http://localhost:8080/api/persons/name/Alice
(4) 删除 Person
DELETE http://localhost:8080/api/persons/1
5. 进阶:定义关系(Relationship)
Neo4j 不仅可以存储节点,还可以定义 关系。例如,Person
和 Movie
之间可以有 ACTED_IN
关系。
5.1 定义 Movie
节点
@Node("Movie")
public class Movie {
@Id
private Long id;
@Property("title")
private String title;
// Getter & Setter
}
5.2 定义关系
使用 @Relationship
注解定义关系:
import org.springframework.data.neo4j.core.schema.Relationship;
@Node("Person")
public class Person {
@Id
private Long id;
@Property("name")
private String name;
@Property("age")
private Integer age;
@Relationship(type = "ACTED_IN", direction = Relationship.Direction.OUTGOING)
private List<Movie> movies;
// Getter & Setter
}
6. 总结
步骤 | 说明 |
---|---|
1. 安装 Neo4j | 本地 Docker 或云服务 |
2. 创建 Spring Boot 项目 | 添加 spring-boot-starter-data-neo4j |
3. 配置 Neo4j 连接 | application.yml 配置 |
4. 定义 Neo4j 实体 | 使用 @Node 注解 |
5. 创建 Repository | 继承 Neo4jRepository |
6. 实现 CRUD 操作 | Service + Controller |
7. 测试 API | Postman 或浏览器 |