图数据库 Neo4j 学习之SpringBoot整合

news2024/12/28 18:55:36

Neo4j 系列

1、图数据库 Neo4j 学习随笔之基础认识
2、图数据库 Neo4j 学习随笔之核心内容
3、图数据库 Neo4j 学习随笔之基础操作
4、图数据库 Neo4j 学习随笔之高级操作
5、图数据库 Neo4j 学习之JAVA-API操作
6、图数据库 Neo4j 学习之SpringBoot整合


文章目录

  • Neo4j 系列
  • 前言
  • 一、pom依赖
  • 二、Neo4j配置
  • 三、添加Mapping实体
  • 四、增删改查操作
    • 4.1 新增节点和关系
    • 4.2 删除节点和关系
    • 4.3 修改节点和关系
    • 4.4 查询节点和关系
    • 4.5 自定义查询
  • 五、总结


前言

相对于Java通过Neo4j驱动来连接Neo4j数据库操作来说,SpringBoot引入starter组件来操作Neo4j 简直要上天,简单易用。

一、pom依赖

首先这是一个SpringBoot项目测试,为了方便,直接继承人家管理好的版本,版本就选择了最新的 2.6.13

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.13</version>
</parent>

那关于 Neo4j 和单元测试的 starter 组件如下。

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

二、Neo4j配置

配置 Neo4j 的连接信息。

spring:
  neo4j:
    uri: bolt://localhost:7687
    authentication:
      username: neo4j
      password: ******

三、添加Mapping实体

象牙山村的村民定义为 Person 实体,属性有 id,name 都不说了,重要的就是 @Relationship 注解注释的和他们有具体关系的人,比如他们的 妻子、父亲、暗恋对象、初恋都有谁,可以把这些有关系的人定义为 List
@Relationship 注解属性:type 是那种类型的关系,direction 是关系的方向,有两个值:OUTGOING(向外的关系),INCOMING(向内的关系)

@Node(labels = "loveperson")
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    @Property("name")
    private String name;
    @Relationship(type = "夫妻", direction = Relationship.Direction.OUTGOING)
    private List<Person> partners;
    @Relationship(type = "父子", direction = Relationship.Direction.OUTGOING)
    private List<Person> fathers;
    @Relationship(type = "暗恋", direction = Relationship.Direction.OUTGOING)
    private List<Person> girlfriend;
    @Relationship(type = "老丈人", direction = Relationship.Direction.OUTGOING)
    private List<Person> outFather;
    @Relationship(type = "初恋", direction = Relationship.Direction.OUTGOING)
    private List<Person> fistGirlfriend;
    @Relationship(type = "老弟", direction = Relationship.Direction.OUTGOING)
    private List<Person> brother;
}

四、增删改查操作

主要用 SpringBoot 的单元测试来测试,因为需要用到提供好的 Neo4jRepository 接口来实现操作。
新建一个操作接口 Neo4jPersonRepository 继承 Neo4jRepository 接口,并定义泛型是 Person 对象。

@EnableNeo4jRepositories
public interface Neo4jPersonRepository extends Neo4jRepository<Person,Long> {

}

4.1 新增节点和关系

@Test
public void createNode(){
    Person person = new Person();
    person.setName("王天来");
    Person girlfriend = new Person();
    girlfriend.setName("李秋歌");
    person.setFistGirlfriend(Arrays.asList(girlfriend));
    Person p = neo4jPersonRepository.save(person);
    System.out.println(p.getId() + ":" + p.getName());
}

创建节点成功:
创建节点成功

4.2 删除节点和关系

创建好了 Person 和 节点的 Mapping,可以直接调用 SpringBoot 提供好的 Neo4jRepository 来删除 Person 对象,需要指定 Personid,以及有关系的 Person 对象。

@Test
public void deleteNode(){
    Person person = new Person();
    person.setId(124L);
    Person p = new Person();
    p.setId(125L);
    person.setFistGirlfriend(Arrays.asList(p));
    neo4jPersonRepository.delete(person);
    neo4jPersonRepository.delete(p);
    System.out.println("删除成功");
}

4.3 修改节点和关系

王天来追到了李秋歌,李秋歌的妈妈是王大拿的老伴,所以王天来就认了王大拿为父亲,这样一来王天来的关系就变了。
创建 Person(王大拿),设置为王天来的父亲,当然也不能丢了李秋歌为对象的关系。

@Test
public void saveOrUpdateNode(){
    Person person = new Person();
    person.setId(131L);
    person.setName("王天来");
    Person father = new Person();
    father.setId(115L);
    father.setName("王大拿");
    person.setFathers(Arrays.asList(father));
    Person gf = new Person();
    gf.setId(123L);
    gf.setName("李秋歌");
    person.setFistGirlfriend(Arrays.asList(gf));
    Person p = neo4jPersonRepository.save(person);
    System.out.println(p.getId() + ":" + p.getName());
}

测试结果,他们的关系修改成功:
测试结果

4.4 查询节点和关系

调用 findAll() 方法来获取 loveperson 为标签的所有 节点信息,当然按条件查询API也是差不多的。

@Test
public void queryAll(){
    List<Person> persons = neo4jPersonRepository.findPersonAll();
    persons.forEach(person -> {
        System.out.println(person.getId() + ":" +person.getName());
        if(!CollectionUtils.isEmpty(person.getPartners())){
            System.out.print("妻子:");
            person.getPartners().forEach(p -> System.out.println(p.getName()));
        }
        if(!CollectionUtils.isEmpty(person.getFathers())){
            System.out.print("父亲:");
            person.getFathers().forEach(p -> System.out.println(p.getName()));
        }
        if(!CollectionUtils.isEmpty(person.getGirlfriend())){
            System.out.print("女朋友:");
            person.getGirlfriend().forEach(p -> System.out.println(p.getName()));
        }
        System.out.println("==================");
    });
}

4.5 自定义查询

首先创建自定义查询,使用 @Query 注解来定义查询语句。

@EnableNeo4jRepositories
public interface Neo4jPersonRepository extends Neo4jRepository<Person,Long> {

    @Query("match (n:loveperson) where n.name = $name return n")
    List<Person> findByName(String name);

}
@Test
public void queryByCustom(){
    List<Person> persons = neo4jPersonRepository.findByName("王香秀");
    persons.forEach(person -> System.out.println(person.getName()));
}

查询出王香秀了,嗯,李大国好眼光啊。

五、总结

SpringBoot 整合 Neo4j 构建起来还是有点小复杂的,查了一天的资料,尤其版本和pom依赖不好确定,但是一旦 pom 和配置都搞定后,那 增删改查基本的操作就很方便了,而且关系的创建和维护也很清楚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker与Linux之间的关系——Namespace,Cgroups, 网络通信总结

文章目录一、前言二、NamespaceNamespace Linux内核操作方法容器隔离性与 Linux Namespace 关系Linux Namespace 常用操作三、CgroupsCgroups 子系统CPU 子系统cpuacct 子系统Memory 子系统Linux 调度器使用 cgroup 限额实践四、DockerDocker的文件系统OCI 容器标准Docker 引擎…

php+vue基于微信小程序的房屋租赁小程序

当今社会房屋租赁买卖是必不可少的&#xff0c;人们不管走到哪里都需要有一个温馨的家&#xff0c;有一个落脚之地&#xff0c;所以房屋租赁市场也是非常火爆&#xff01;不管是房屋租赁公司或者是个人都需要一套完整的管理系统来掌握整个市场信息。针对这一需求&#xff0c;本…

微信小程序框架(三)-全面详解(学习总结---从入门到深化)

目录 事件系统 什么是事件 事件的使用方式 Event对象 事件分类 冒泡事件(bind) 非冒泡事件(catch) 事件类型 事件类型列表 事件携带参数 currentTarget 携带参数 mark 携带参数 条件渲染 wx:if wx:else wx:elif hidden wx:if vs hidden 区别 列表渲染 基本使用 复杂数…

C++用unordered_map查表代替if else/switch case多判断语句

一、引言 在C中我们写判断逻辑一般会用if else或switch case语句&#xff0c;比如以下例子&#xff1a; #include <iostream>using namespace std;class CTest { public:enum class ConditionType{TYPE1 0,TYPE2,TYPE3,};CTest() default;~CTest() default;void exe…

双倍NB!阿里一线架构师花7天肝出的这份620页“MyBatis源码解析绝密文档” 太震撼了!

前言 都知道MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Jav…

非零基础自学计算机操作系统 第1章 操作系统概述 1.1 操作系统的概念

非零基础自学计算机操作系统 文章目录非零基础自学计算机操作系统第1章 操作系统概述1.1 操作系统的概念1.1.1 操作系统的地位1.1.2 操作系统的作用1.1.3 操作系统的定义第1章 操作系统概述 1.1 操作系统的概念 关于什么是操作系统&#xff0c;目前尚无统一的定义。这里只能从…

基于Java的JSP电动车维修管理系统

随着我国电动车数量的不断增加&#xff0c;如果能够在电动车出现故障的时候及时的解决这些故障问题&#xff0c;并且能够让电动车的维修人员更好的对维修信息进行管理是本系统主要研究的问题&#xff61; 本项目利用软件工程原理&#xff0c;采用面向对象的编程方法&#xff0c…

会话技术

会话技术 今日目标 理解什么是会话跟踪技术 掌握Cookie的使用 掌握Session的使用 完善用户登录注册案例的功能 1&#xff0c;会话跟踪技术的概述 对于会话跟踪这四个词&#xff0c;我们需要拆开来进行解释&#xff0c;首先要理解什么是会话&#xff0c;然后再去理解什么是…

二叉树的构造(如何唯一确定一棵二叉树?附证明)

二叉树的构造(如何唯一确定一棵二叉树?附证明) 一些直观的认识 ▪ 同一棵二叉树具有唯一先序序列、中序序列和后序序列。 ▪ 不同的二叉树可能具有相同的先序序列、中序序列和后序序列。 通过上面两个例子的验证&#xff1a; ▪ 仅有一个先序序列&#xff08;或中序序列、后…

C++类和对象--封装

目录 1.封装 1.1封装的意义一--将属性和行为作为一个整体 1.1.1成员属性&#xff0c;成员变量&#xff0c;成员函数&#xff0c;成员方法 1.2封装的意义二--将属性和行为加以控制&#xff0c;公共权限&#xff0c;保护权限&#xff0c;私有权限 1.3struct和class区别 1.4成员…

物联网-异步控制多个设备

物联网-异步控制设备 背景 在这个万物互联的时代&#xff0c;物联网设备起到了关键性的作用&#xff0c;那我们怎么去联动一个个物联网设备。比如一个家庭&#xff0c;里面有很多的设备&#xff0c;比如洗衣机&#xff0c;加湿器、空调、除湿机、灯光等等这些智能设备。假如在…

攻击类型分布

执行摘要 从 1987 年 9 月 14 日&#xff0c;中国向世界发出第一封电子邮件到如今&#xff0c;中国的互联网 发展已过去整整 31 个年头。从消费互联、产业互联到万物互联&#xff0c;互联网正在加速改变我们的交流方式和交易方式&#xff0c;一次次 004.重塑了国家的经济形态和…

【Flutter 组件】001-关于 Widget 的一切

【Flutter 组件】001-关于 Widget 的一切 文章目录【Flutter 组件】001-关于 Widget 的一切一、概述1、Widget 基本概述2、Flutter Framework 里的 Widget架构图说明3、根 Widget二、Widget 类1、Widget 的功能2、Widget 类源码说明Widget 的标识符&#xff1a;KeyFlutter 中如…

【云原生 | Kubernetes 实战】10、K8s 控制器 Deployment 入门到企业实战应用(上)

目录 一、Deployment 控制器&#xff1a;概念、原理解读 1.1 Deployment 概述 1.2 Deployment 工作原理&#xff1a;如何管理 rs 和 Pod&#xff1f; 补充&#xff1a;什么叫做更新节奏和更新逻辑呢&#xff1f; 二、Deployment 资源清单文件编写技巧 三、Deployment 使…

Java线程 (使用Callable实现多线程),看完你发现多线程多么简单!

1.Thread 与 Runnable 的关系 2.Callable实现多线程 3.线程运行状态 1.Thread 与 Runnable 的关系 经过一系列的分析之后可以发现&#xff0c;在多线程的实现过程之中已经有了两种做法&#xff1a;Thread类、Runnable接口&#xff0c;如果从代码结构本身来讲&#xff0c;使…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(一级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;一级A卷&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 下面哪个积木能够调节左右声道的音…

疯狂加持,腾讯大佬的“百万级”JVM学习笔记,从思维图+核心+架构让你一步到位

前言 毫不夸张地说&#xff0c;JVM是现代软件工程最成功的案例之一。因为它自带GC&#xff0c;又有无数可以微调的参数&#xff0c;且运行极其稳定可靠&#xff0c;所以&#xff0c;许多厂商的核心业务系统&#xff0c;才敢放心地用Java编写&#xff0c;运行在JVM之上。 近几…

中英翻译《Thailand泰国》

Thailand 泰国 一、Pre-reading activity 阅前思考 1.Find Thailand in an atlas. 在地图册上找到泰国。 2.What are the names of the countries next to it? 与它相邻的国家都叫什么名字&#xff1f; 3.Is your country near Thailand? 你的国家靠近泰国吗&#xff1f; …

Java基于JSP的小区物业管理系统

经济的飞速发展,促使着城市化进程的加快,随之而来的则是人们生活水平日益提高,并促进住宅小区建设的飞速发展。大量住宅小区投入使用后,加大了管理者的工作难度,小区物业除了要对房屋本身进行修缮外,还需对场地、住户信息、附属设备、环卫绿化、收费情况、治安等方面进行专业化…

全国高校计算机能力挑战赛初赛试题全记录

今天搞了mini版蓝桥杯比赛&#xff0c;有时间的话&#xff0c;我们每天都会补充15道主观题。废话不多说&#xff0c;开整&#xff01;&#xff01;&#xff01; 2022.10.11 抽象&#xff1a;在C中&#xff0c;如果一个类并没有什么实际信息&#xff0c;那么就是一个抽象类 多态…