news 2026/8/11 8:56:35

Neo4j图数据库学习(二)——SpringBoot整合Neo4j

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Neo4j图数据库学习(二)——SpringBoot整合Neo4j

一. 前言

本文介绍如何通过SpringBoot整合Neo4j的方式,对图数据库进行简单的操作。
Neo4j和SpringBoot的知识不再赘述。关于Neo4j的基础知识,有兴趣可以看看作者上一篇的文章:Neo4j图数据库学习(一)——初识CQL

二. 前置准备

新建SpringBoot项目

首先,新建一个SpringBoot项目,注意JDK与Java版本,需要与你的Neo4j版本相匹配。


接着添加依赖项,这里添加了Lombok与SpringDataNeo4j,Lombok可以使用@Data注解为实体类快速生成get()、set()等方法。

我选择使用的SpringBoot版本在2.4以下,如果版本较高,集成的Neo4j的API规则方法变化较大

properties配置文件

在properties中配置Neo4j的连接信息:

#Neo4j配置 spring.data.neo4j.uri= bolt://localhost:7687 spring.data.neo4j.username= neo4j spring.data.neo4j.password= 123456

假如有修改过密码,记得将初始密码替换为自己设置的密码。
至此,前置的准备已经基本完毕。

三. 查询

我们知道,启动Neo4j后,可以在浏览器中对数据库进行操作,那么在SpringBoot中我们如何进行操作呢?
我们接着以小猪佩奇的案例进行分析。

我们需要有小猪佩奇的实体类,所以创建一个Pig类,代码如下:
使用@NodeEntity注解定义节点模型。

package com.tuling.lowversionneo4j.entity; import lombok.Data; import org.neo4j.ogm.annotation.GeneratedValue; import org.neo4j.ogm.annotation.Id; import org.neo4j.ogm.annotation.NodeEntity; import org.neo4j.ogm.annotation.Property; import java.io.Serializable; @Data @NodeEntity(label = "pig") public class Pig implements Serializable { @Id @GeneratedValue private Long id; @Property private String name; }

使用spring-data-neo4j提供的Neo4jRepository接口来创建数据访问层,可以使用@Repository注解。

package com.tuling.lowversionneo4j.dao; import com.tuling.lowversionneo4j.entity.Pig; import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.repository.Neo4jRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface PigReponsitory extends Neo4jRepository<Pig,Long> { }

此时,如果我们要查询<id>为2的成员信息,我们可以使用@Autowired进行依赖注入,接着使用pigReponsitory调用相关方法进行操作。
这里使用测试类进行简单演示,后续代码同样:

package com.tuling.lowversionneo4j; import com.tuling.lowversionneo4j.dao.PigReponsitory; import com.tuling.lowversionneo4j.entity.Pig; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.Optional; @SpringBootTest class LowVersionNeo4jApplicationTests { @Autowired PigReponsitory pigReponsitory; @Test void test() { Optional<Pig> byId = pigReponsitory.findById(2L); //注意此处传入的数据类型为Long Pig pig = byId.get(); System.out.println(pig); } }

运行测试,在控制台中得到输出结果。可以看出,<id>为2的家庭成员为佩奇。

四. 删除

同样地,我们也可以使用pigReponsitory调用方法进行其他操作。如使用deleteById()方法根据Id进行删除。
我们以删除<id>为5的节点为例,代码如下:

pigReponsitory.deleteById(5L); //注意此处传入的数据类型为Long

运行测试类,回到浏览器页面,可以发现<id>为5的节点(猪爷爷)已被删除。


删除后:


pigReponsitory可以调用其他方法来进行其他操作,在这里不多赘述,有兴趣可以自己研究。

五. 添加

添加节点

如果我们想要添加节点,该如何操作?
同样地,我们可以通过pigReponsitory调用方法来实现。
如下方代码所示,我们创建两个pig对象并设置name属性,最后通过调用save()方法来添加节点。

Pig pig1 = new Pig(); pig1.setName("猪爷爷"); Pig pig2 = new Pig(); pig2.setName("猪奶奶"); pigReponsitory.save(pig1); pigReponsitory.save(pig2);
添加关系
新建PigRelationShip和PigRelationShipRepository的方法

这是一种较为复杂的方法。
与创建PigReponsitoryPig同理,我们在entity中创建PigRelationShip:

package com.tuling.lowversionneo4j.dao; import com.tuling.lowversionneo4j.entity.PigRelationShip; import org.springframework.data.neo4j.repository.Neo4jRepository; public interface PigRelationShipRepository extends Neo4jRepository<PigRelationShip,Long> { }

在dao中创建PigRelationShipRepository

使用@StartNode@EndNode注解,设置起始节点和结束节点。

package com.tuling.lowversionneo4j.entity; import lombok.Data; import org.neo4j.ogm.annotation.*; import java.io.Serializable; @Data @RelationshipEntity(type ="夫妻") public class PigRelationShip implements Serializable { @Id @GeneratedValue private Long id; @StartNode private Pig start; @EndNode private Pig end; @Property private String relation; }

在测试类中进行测试:

PigRelationShip ship = new PigRelationShip(); ship.setStart(pig1); ship.setEnd(pig2); ship.setRelation("夫妻"); pigRelationShipRepository.save(ship);

最终成功创建关系

使用@Query注解

刚才提到的方法是较为繁琐的,spring-data-neo4j为我们提供了快捷的注解——@Query
PigReponsitory中,我们使用@Query注解简化添加关系操作,在@Query()中编写CQL语句,与MyBatis有些相似。

//上方内容省略 @Repository public interface PigReponsitory extends Neo4jRepository<Pig,Long> { @Query("match(n:pig{name:$from}) match(m:pig{name:$to}) create (n) -[:小猪佩奇家庭关系{relation:$relation}] -> (m)") void createRelation(@Param(value="from")String from, @Param(value="relation")String relation, @Param(value="to")String to); }

测试类中的代码:

pigReponsitory.createRelation("猪爷爷","夫妻", "猪奶奶");

在这里,作者也有一个问题,就是只有使用$name@Param才能正常替换字符串内容,否则会报语法错误:


而似乎有人使用{}与参数序号的方式,可以成功实现。

@Repository public interface PigReponsitory extends Neo4jRepository<Pig,Long> { @Query("match(n:pig{name:{0}}) match(m:pig{name:{2}}) create (n) -[:小猪佩奇家庭关系{relation:{1}}] -> (m)") void createRelation(String from, String relation, String to); }

作者无法使用这种方法实现,不知为何,有知道的可以指导指导,作者感激不尽!

六. 最后

由于作者的水平非常有限,难免会出现错误,欢迎各位指正!假如您有任何想法,也欢迎交流!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 5:32:02

Nginx 安装及配置教程(Windows)【安装】

文章目录 一、 Nginx 下载 1. 官网下载2. 其它渠道 二、 Nginx 安装三、 配置四、 验证五、 其它问题 1. 常用命令2. 跨域问题 软件 / 环境安装及配置目录 一、 Nginx 下载 1. 官网下载 安装地址&#xff1a;https://nginx.org/en/download.html 打开浏览器输入网址 htt…

作者头像 李华
网站建设 2026/8/11 6:29:49

金运环球:被动卖压VS鸽派预期,非农前聚焦关键区间

【市场早间简述】大宗商品指数年度再平衡于昨日盘后正式启动&#xff0c;预计将产生显著被动抛压&#xff0c;昨日金银价格在抛压下V型反弹显示买盘支撑。地缘政治风险持续存在&#xff0c;叠加美联储官员鸽派表态强化降息预期&#xff0c;为市场提供中长期支撑。现货黄金与白银…

作者头像 李华
网站建设 2026/8/11 7:36:07

MySQL:顿悟了,添加索引时竟然不锁表?

一、前言 在 MySQL 数据库中&#xff0c;“锁表” 指的是对数据库表进行锁定&#xff0c;以控制对表中数据的并发访问。锁表是数据库管理系统&#xff08;DBMS&#xff09;用来维护数据一致性和完整性的一种机制。 当某个事务&#xff08;Transaction&#xff09;或操作需要对表…

作者头像 李华
网站建设 2026/8/8 20:00:33

Sheet-to-Doc vs 邮件合并:选择最适合你的文档生成工具

在文档自动化生成领域&#xff0c;邮件合并是一个广为人知的功能&#xff0c;而Sheet-to-Doc则是一款新兴的文档自动化工具。两者都可以实现从Excel数据到Word文档的自动转换&#xff0c;但它们在功能、易用性、性能等方面存在明显差异。今天&#xff0c;我将详细比较Sheet-to-…

作者头像 李华
网站建设 2026/8/8 10:30:03

CUDA out of memory怎么办?Image-to-Video显存优化方案

CUDA out of memory怎么办&#xff1f;Image-to-Video显存优化方案 问题背景与挑战 在使用基于 I2VGen-XL 模型的 Image-to-Video 图像转视频生成器 进行二次开发时&#xff0c;开发者“科哥”遇到了一个典型但棘手的问题&#xff1a;CUDA out of memory&#xff08;显存溢出&a…

作者头像 李华