# springboot-neo4j-demo
**Repository Path**: douglas_Hu/springboot-neo4j-demo
## Basic Information
- **Project Name**: springboot-neo4j-demo
- **Description**: springboot集成neo4j使用示例
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 8
- **Created**: 2020-07-15
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# springboot集成neo4j使用示例
## 目录
- 安装neo4j
- Neo4j与springBoot简单整合
1. 建立一个springBoot项目
2. 引入neo4j的pom
3. 建立一个Person的实体类
4. 建立PersonRepository
5. 建立关系实体类Friend
6. 建立关系接口FriendRepository
7. application.properties配置文件中建立数据库连接
8. 单元测试
## **安装neo4j**
下载安装neo4j,下载地址:[https://neo4j.com/download/](https://link.zhihu.com/?target=https%3A//neo4j.com/download/),选择社区服务器下相应版本下载即可,社区版免费,不支持集群模式,企业版需要发付费。
## Neo4j与springBoot简单整合
### 建立一个springBoot项目
新建一个springboot项目,我这里的版本是2.3.0。

### 引入neo4j的pom
上一步新建springboot项目是选择 Spring Data Neo4j,会自动引入neo4j的依赖.
```xml
org.springframework.boot
spring-boot-starter-data-neo4j
```
### 建立一个Person的实体类
新建person实体类,包含id、姓名和年龄字段,这里使用了lombok.Data注解,如果没有使用lombok的同学请自行添加get,set。
```java
@NodeEntity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
private Integer age;
}
```
### 建立PersonRepository
新建PersonRepository接口继承Neo4jRepository,默认提供基本的增删改查,这里添加了findFriendByPerson和findByName方法,后面会讲到。
```java
public interface PersonRepository extends Neo4jRepository {
/**
* 返回某个人的所有朋友
* @param name
* @return
*/
@Query("MATCH p =(n:Person)-[r:FRIEND]->(m:Person) WHERE m.name=$name RETURN n")
List findFriendByPerson(String name);
/**
* 根据名字查找
* @param name
* @return
*/
Person findByName(String name);
}
```
### 建立关系实体类Friend
建立朋友关系实体类,包含创建时间和备注添加好友来源,以及指向关系起点personFrom用@StartNode注解,指向关系终点personTo用@EndNode注解,相当于A(起点)向B(终点)发起好友申请,有一个指向关系。具体请了解图数据结构相关知识。
```java
@RelationshipEntity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Friend {
@Id
@GeneratedValue
private Long id;
private Date createTime;
private String remark;
@StartNode
private Person personFrom;
@EndNode
private Person personTo;
public Friend(Person personFrom, Person personTo, String remark) {
this.personFrom = personFrom;
this.personTo = personTo;
this.remark = remark;
this.createTime = new Date();
}
}
```
### 建立关系接口FriendRepository
新建FriendRepository接口继承Neo4jRepository
```java
public interface FriendRepository extends Neo4jRepository {
}
```
### application.properties配置文件中建立数据库连接
使用Neo4j安装时设置的用户名和密码
```properties
spring.data.neo4j.uri=bolt://localhost:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=*****
```
### 单元测试
简单的增删改查,findByName和findFriendByPerson为扩展方法,通过@Query注解可以自定义查询语句,通过$param可以引入自定义参数。
执行addNodeTest通过图形界面我们可以看到如图1已经添加成功一个节点
执行updateNodeTest通过图形界面我们可以看到如图2 age从18变成了19
重复执行addNodeRSTest并修改name添加指向jamie节点的好友关系,如图3所示。
```java
/**
* 添加节点
*/
@Test
public void addNodeTest(){
Person person=new Person();
person.setName("jamie");
person.setAge(18);
personRepository.save(person);
}
/**
* 删除节点
*/
@Test
public void deleteNodeTest(){
personRepository.deleteById(3L);
}
/**
* 修改节点
* 修改节点
*/
@Test
public void updateNodeTest(){
Person person=new Person();
person.setName("jamie");
person.setAge(19);
person.setId(3L);
personRepository.save(person);
}
/**
* 添加朋友关系
*/
@Test
public void addNodeRSTest(){
Person person=new Person();
person.setName("rose3");
person.setAge(18);
Person rose = personRepository.save(person);
Person jamie = personRepository.findByName("jamie");
Friend friend=new Friend(rose,jamie,"附近的人");
friendRepository.save(friend);
}
/**
* 查找某人所有朋友
*/
@Test
public void findFriendByPersonTest(){
List friends = personRepository.findFriendByPerson("jamie");
friends.forEach(System.out::println);
}
```
图一

图二

图三
