• SpringBoot 整合 Neo4j


    阅读此文之前,必须对 Neo4j 有个初步的了解,如果要实际操作的话,需要自备一个 Neo4j 数据库

    本文所涉及代码已开源至 Gitee

    https://gitee.com/Array_Xiang/spring-boot-neo4j

    创建一个 SpringBoot 项目,引入 Neo4j 的依赖

    1. <dependency>
    2.   <groupId>org.springframework.boot</groupId>
    3.   <artifactId>spring-boot-starter-data-neo4j</artifactId>
    4. </dependency>

    配置文件可以参考我这个 application.yml

    1. spring:
    2.   data:
    3.     neo4j:
    4.       uri: bolt://localhost:7687
    5.       username: neo4j
    6.       password: password

    1、创建测试类

    1.1、创建节点

    创建3个节点,为了防止数据污染,可以在执行前,清空所有数据

    1. // 清空所有数据和对应关系
    2. match (n) detach delete n;

    我们要创建三个节点,分别是 XiangNeneXu Neo4j 的语法是

    1. CREATE (n:Person{name:"Xiang",age:18})
    2. CREATE (n:Person{name:"Nene",age:18})
    3. CREATE (n:Person{name:"Xu",age:18})

    清楚了语法如何书写,我们开始写测试类

    SpringBootNeo4jApplicationTests 测试类

    1. package com.liuyuncen;
    2. import org.junit.jupiter.api.Test;
    3. import org.neo4j.driver.*;
    4. import org.springframework.boot.test.context.SpringBootTest;
    5. import static org.neo4j.driver.Values.parameters;
    6. @SpringBootTest
    7. class SpringBootNeo4jApplicationTests {
    8.     @Test
    9.     void createNode() {
    10.         Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j""password"));
    11.         Session session = driver.session();
    12.         session.run("CREATE (n:Person {name:$name, age:$age})",
    13.                 parameters("name","Xiang","age","18"));
    14.         session.run("CREATE (n:Person {name:$name, age:$age})",
    15.                 parameters("name","Nene","age","18"));
    16.         session.run("CREATE (n:Person {name:$name, age:$age})",
    17.                 parameters("name","Xu","age","18"));
    18.         // 最后查询一下 Nene
    19.         Result result = session.run"MATCH (n:Person) WHERE n.name = $name " +
    20.                         "RETURN n.name as name, n.age as age",
    21.                 parameters( "name""Nene"));
    22.         while (result.hasNext()) {
    23.             Record record = result.next();
    24.             System.out.println(record.get("name"+":"+ record.get("age"));
    25.         }
    26.         session.close();
    27.     }
    28. }

    这里输出了查询的 Nene 结果

    Neo4j 控制台页面查询 match (n) return n

    这样,我们三个节点就创建完了,如果要创建对应关系,把 Neo4j 的 sql 语句替换上面程序就可以了

    1.2、创建关联关系

    已经存在现有节点属性,新增新的关联

    语法:

    1. MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
    2. CREATE  
    3.  (<node1-label-name>)-[<relationship-label-name>:<relationship-name>]->(<node2-label-name>)
    4. RETURN <relationship-label-name>
    5. -- RETURN子句是可选的。 如果我们想立即看到结果,那么使用它。 否则,我们可以省略这个子句。

    案例:

    1. match (p:Person{name:"Nene"}),(m:Person{name:"Xiang"})
    2. CREATE (m) -[:classMater] -> (p)
    3. CREATE (p) -[:classMater] -> (m)

    所以第二段程序可以这样写

    1.     @Test
    2.     void createRelation(){
    3.         Driver driver = GraphDatabase.driver("bolt://192.168.111.139:7687", AuthTokens.basic("neo4j""password"));
    4.         Session session = driver.session();
    5.         session.run("match (p:Person{name:$name1}),(m:Person{name:$name2}) " +
    6.                 "CREATE (m) -[:classMater] -> (p) " +
    7.                 "CREATE (p) -[:classMater] -> (m)",
    8.         parameters("name1","Xiang","name2","Nene"));
    9.         session.close();
    10.     }

    同样的 ,其他语法,删除、修改等都是类似。这个可以看我上一篇文章内容。

    2、集成 SpringBoot

    既然我们是 SpringBoot 项目,那自然以对象为存储介质,将数据都封装到对象中。spring-boot-starter-data-neo4j 早就帮我们想好了这一切。

    创建 Person 对象

    1. package com.liuyuncen.entity;
    2. import lombok.Builder;
    3. import lombok.Data;
    4. import lombok.ToString;
    5. import org.neo4j.ogm.annotation.GeneratedValue;
    6. import org.neo4j.ogm.annotation.Id;
    7. import org.neo4j.ogm.annotation.NodeEntity;
    8. import org.neo4j.ogm.annotation.Property;
    9. import java.io.Serializable;
    10. /**
    11.  * @belongsProject: SpringBoot-Neo4j
    12.  * @belongsPackage: com.liuyuncen.entity
    13.  * @author: Xiang想
    14.  * @createTime: 2022-09-28  14:29
    15.  * @description: TODO
    16.  * @version: 1.0
    17.  */
    18. @Data
    19. @Builder
    20. @NodeEntity("person")
    21. @ToString
    22. public class Person implements Serializable {
    23.     @Id
    24.     @GeneratedValue
    25.     private Long id;
    26.     @Property("name")
    27.     private String name;
    28.     @Property("age")
    29.     private Integer age;
    30. }

    创建dao层,PersonRepository 并继承 Neo4jRepository

    1. package com.liuyuncen.repository;
    2. import com.liuyuncen.entity.Person;
    3. import org.springframework.data.neo4j.annotation.Query;
    4. import org.springframework.data.neo4j.repository.Neo4jRepository;
    5. import org.springframework.stereotype.Repository;
    6. import java.util.List;
    7. /**
    8.  * @belongsProject: SpringBoot-Neo4j
    9.  * @belongsPackage: com.liuyuncen.repository
    10.  * @author: Xiang想
    11.  * @createTime: 2022-09-28  15:03
    12.  * @description: TODO
    13.  * @version: 1.0
    14.  */
    15. @Repository
    16. public interface PersonRepository extends Neo4jRepository<Person, Long> {
    17.     @Query("MATCH (n:Person) WHERE id(n) = $0 RETURN n")
    18.     List<Person> findChildList(Long id);
    19. }

    最后测试类

    1. @Test
    2. void findPersonById(){
    3.     Long id = 0L;
    4.     List<Person> childList = repository.findChildList(id);
    5.     for (Person person : childList) {
    6.         System.out.println("person = " + person.toString());
    7.     }
    8. }

    到这里我相信你已经可以拿下 Neo4j 基础的一些操作了。

    我是想想,一个不仅会敲代码的程序🐒,手动滑稽😜

  • 相关阅读:
    leetcode45. 跳跃游戏 II
    华为OD,阿里巴巴找黄金宝箱(Ⅱ)(Java实现)
    双指针算法——移动零
    【业务功能篇108】CDN Nginx
    如何实现点云体素化及由密集特征得到二维伪装
    注释写的好,文档不潦草.
    msvcr120.dll文件的作用、丢失的原因及解决办法分享
    『PyQt5-Qt Designer篇』| 10 Qt Designer中控件的尺寸相关设置(sizePolicy策略)
    【洛谷P1351】联合权值【数学】
    javaee thymeleaf简介
  • 原文地址:https://blog.csdn.net/qq_39550368/article/details/127100885