neo4j(spring) 使用示例

文章目录

  • 前言
  • 一、neo4j是什么
  • 二、开始编码
    • 1. yml 配置
    • 2. crud 测试
    • 3. node relation 与java中对象的关系
    • 4. 编码测试
  • 总结


前言

图数据库先驱者 neo4j:neo4j官网地址

  • 可以选择桌面版安装等多种方式,我这里采用的是docker安装

  • 直接执行docker安装命令:

    docker run -d -p 7474:7474 -p 7687:7687 --name neo4j -e "NEO4J_AUTH=neo4j/password"  neo4jchina/neo4j-chs
    

    如果无法下载的话,请更新下docker仓库镜像源地址

  • 可以参考 docker镜像源地址


一、neo4j是什么

  1. Neo4j 是一个高性能、开源的图数据库管理系统,主要用于存储、管理和查询具有复杂关系的数据。它采用属性图模型来处理数据,其中数据被表示为节点(Nodes)和关系(Relationships)的集合,形成了图(Graph)结构。
  2. Neo4j 使用 Cypher 查询语言,是一种图形查询语言。写的比较好的一遍关于 Cypher语法 的文章

二、开始编码

组件版本
springboot2.7.6
spring-boot-starter-data-neo4j2.7.6
hutool-all5.8.4

1. yml 配置

server:port: 8080
spring:neo4j:uri: bolt://localhost:7687authentication:username: neo4jpassword: passworddata:neo4j:database: neo4j
logging:level:org.springframework.data.neo4j: DEBUG

这里连接的是我本地docker 安装的neo4j
本地安装截图

有多个端口默认7474为管理页面,7687为服务端口,所以yml这里用7687端口


  • 桌面安装也很好用,这里采用windows安装
    桌面版本

可以自己新建数据库,而docker中是无法自己创建数据库的

2. crud 测试

  1. 构思graph 的结构
  2. 确定多个relation 关系
  3. 确定各个关系的两个node 节点
    首先要规划好这些关系,然后构造出一幅图出来
    例如:
    最终的图

这是一个电影关系

  1. 导演拍摄电影白蛇传
  2. 白蛇传中有主演 小青 法海
  3. 主演的穿着

3. node relation 与java中对象的关系

  • 我想构造 node 节点的 人(导演) ,电影(白蛇传) ; 人和电影的 “关系”

分析如下: 人和电影有关系,人和衣服有关系
由于人中的关系较多,所以这里分散下,我把人和电影的关系,放到电影中
这个图中,只有三个node,即是 人 电影 衣服
有三个关系 关系 关系1 穿着

  • 我现在构造下 人和电影的关系
  1. node 人
@Node("Person")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person extends BaseNode {@Id@GeneratedValueprivate Long id;@Propertyprivate Integer born;@Propertyprivate String name;public Person(Integer born, String name) {this.born = born;this.name = name;}
}
  1. node 电影
@Data
@Node("Movie")
@NoArgsConstructor
@AllArgsConstructor
public class Movie extends BaseNode {@Id@GeneratedValueprivate Long id;@Propertyprivate Integer released;@Propertyprivate String tagline;@Propertyprivate String title;@Relationship(type = "关系", direction = Relationship.Direction.INCOMING)private List<Relation> relations;@Relationship(type = "关系1", direction = Relationship.Direction.OUTGOING)private List<Relation> relationList;
}

将关系放在电影中,电影和人有两种关系, 导演和主演两种关系(这个是relatio 的意义)
“关系” “关系1” 是relation 的type
有两种关系类型,而且每种关系可能有多种,所以这里用集合,如果确认关系为单个,用单个对象也可以

  1. relation 关系/ 关系1
@Data
@RelationshipProperties
public class Relation extends BaseRelation {@Id@GeneratedValueprivate Long id;private List<String> roles;@TargetNodeprivate Person person;
}

这个是关系的定义 relation
由于是任何电影的对应关系,我将关系放到了电影中,所以这里要声明一下目标节点为人 person

  1. 开始定义人和衣服的关系
@Data
@Node("Clothe")
@NoArgsConstructor
@AllArgsConstructor
public class Clothe extends BaseNode {@Id@GeneratedValueprivate Long id;@Propertyprivate String remark;public Clothe(String name) {this.remark = name;}
}

衣服是节点 人是节点 人和衣服是关系

@Node("Person")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person extends BaseNode {@Id@GeneratedValueprivate Long id;@Propertyprivate Integer born;@Propertyprivate String name;public Person(Integer born, String name) {this.born = born;this.name = name;}@Relationship(type = "穿着", direction = Relationship.Direction.OUTGOING)private List<Chuan> chuanList;}

改造之前的人,将关系放到人中 chuanList type 为穿着,这里确定一定是多个,一个人可能穿很多件衣服
接下来是 Chuan 的relation 所以内容中应该有目标节点

  1. 穿的relation
@Data
@RelationshipProperties
public class Chuan extends BaseRelation {@Id@GeneratedValueprivate Long id;@Propertyprivate String brand;@TargetNodeprivate Clothe clothe;public Chuan(String brand, Clothe clothe) {this.brand = brand;this.clothe = clothe;}
}

是的,这里有目标节点 Clothe

  1. 构造完毕
    大家可以仔细体会下,这个图和java对象的对应关系,只要理解了,那么后续的图就可以自己构造了~~

4. 编码测试

  • dao层,给出一个示例,剩下都一样,与spring-data-jpa一样
@Repository
public interface ClotheRepository extends Neo4jRepository<Clothe, Long> {
}
  • 测试用例
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.xuni.neo4j.entity.Clothe;
import com.xuni.neo4j.entity.Movie;
import com.xuni.neo4j.entity.Person;
import com.xuni.neo4j.relation.Chuan;
import com.xuni.neo4j.relation.Relation;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Arrays;
import java.util.List;/*** @author fulin* @since 2024/8/13 9:32* <p>* 参考文档* <a href="https://docs.spring.io/spring-data/neo4j/docs/6.1.7/reference/html/#sdn-mixins"> Spring Data Neo4j </a>* </p>*/
@SpringBootTest
@Slf4j
class MovieRepositoryTest {@Autowiredprivate MovieRepository movieRepository;@Autowiredprivate PersonRepository personRepository;@Autowiredprivate RelationRepository relationRepository;/*** //     * @see 数据库效果.png* 初始化数据*/@Testvoid initData() {Movie movie = new Movie();movie.setTagline("民间故事");movie.setTitle("白蛇传");movie.setReleased(2024);// 吴家骀>>>导演了>>> 白蛇传Relation relation = new Relation();relation.setRoles(Arrays.asList("导演", "编剧"));movie.setRelations(Arrays.asList(relation));Person person = new Person(34, "吴家骀");relation.setPerson(person);// 白蛇传的主演是法海Person person1 = new Person(35, "法海");Relation relation1 = new Relation();relation1.setRoles(Arrays.asList("主演"));relation1.setPerson(person1);movie.setRelationList(Arrays.asList(relation1));personRepository.save(person1);personRepository.save(person);movieRepository.save(movie);addRelationship();}void addRelationship() {Person person1 = new Person(18, "小青");personRepository.save(person1);Movie movie = movieRepository.findAll().get(0);List<Relation> relationList = movie.getRelationList();Relation relation1 = new Relation();relation1.setRoles(Arrays.asList("主演"));relation1.setPerson(person1);relationList.add(relation1);movieRepository.save(movie);addClothe();}@Autowiredprivate ClotheRepository clotheRepository;void addClothe() {List<Clothe> clotheList = CollUtil.newArrayList();clotheList.add(new Clothe("T恤"));clotheList.add(new Clothe("牛仔"));clotheList.add(new Clothe("衬衫"));clotheList.add(new Clothe("帽子"));clotheRepository.saveAll(clotheList);Person person = personRepository.findAll().get(2);List<Chuan> chuanList = CollUtil.newArrayList();chuanList.add(new Chuan("阿迪", clotheRepository.findAll().get(1)));chuanList.add(new Chuan("安踏", clotheRepository.findAll().get(2)));person.setChuanList(chuanList);personRepository.save(person);}/*** 查询所有数据*/@Testvoid movieQuery() {List<Movie> movieList = movieRepository.findAll();log.info("movieList:{}", JSONUtil.toJsonPrettyStr(movieList));}/*** 删除所有数据*/@Testvoid deleteAll() {movieRepository.deleteAll();personRepository.deleteAll();relationRepository.deleteAll();clotheRepository.deleteAll();}@Testvoid 单步自定义查询() {// MATCH (n:Movie)-[r:`关系`|`关系1`]-(p:Person) return n,p;// MATCH (n:Movie)-[r:`关系`]-(p:Person) return n,p;List<Movie> movieList = movieRepository.queryMovie();log.info("movieList:{}", JSONUtil.toJsonPrettyStr(movieList.get(0)));}@Testvoid 关系自定义查询() {// MATCH ()-->() RETURN count(*);Long count =  movieRepository.queryRelations();log.info("count:{}", count);}
}

总结

spring-boot-starter-data-neo4j 2.7.6 与之前的版本使用还是有很多区别的,在网上找了很多,没有找到合适的,自己摸索了两天,搞了一个出来,希望可以帮助到你

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git之如何删除Untracked文件(六十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

基于Springboot的助学金管理系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 一、研究背景 利用计算机来实现助学金管理系统&#xff0c;已经成为一种趋势&#xff0c;相比传统的手工管理方式&#xff0c;利用软件进行助学金管理系统&#xff0c;有着执行快&#xff0c;可行性高、容量存储大&#xff0c;…

【C#】内存的使用和释放

在 C# 中&#xff0c;内存管理主要是由 .NET 的垃圾回收器&#xff08;Garbage Collector, GC&#xff09;自动处理的。然而&#xff0c;了解如何正确地使用和释放内存对于编写高效且可靠的代码非常重要。以下是一些关键点和最佳实践&#xff1a; 1. 内存分配 托管资源&#x…

CSS——弹性盒子布局(display: flex)

CSS——弹性盒子布局&#xff08;display: flex&#xff09; 我们经常听说一种布局&#xff1a;Flexbox或者是弹性布局&#xff0c;它的全称叫做弹性盒子布局&#xff08;Flexible Box Layout&#xff09;&#xff0c;那么它到底该如何实现呢&#xff1f;从我们熟悉的 display…

大模型训练实战经验总结

在当今AI技术飞速发展的背景下&#xff0c;定制化大模型的自主训练已成为满足特定行业需求、保障数据安全、提升模型应用效能的关键途径。本文将深度剖析这一过程的核心价值与实践智慧&#xff0c;从数据隐私保护、模型透明度增强&#xff0c;到数据预处理的精细操作&#xff0…

Packet Tracer - IPv4 ACL 的实施挑战(完美解析)

目标 在路由器上配置命名的标准ACL。 在路由器上配置命名的扩展ACL。 在路由器上配置扩展ACL来满足特定的 通信需求。 配置ACL来控制对网络设备终端线路的 访问。 在适当的路由器接口上&#xff0c;在适当的方向上 配置ACL。…

Python编码系列—Python外观模式:简化复杂系统的快捷方式

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

ZYNQ FPGA自学笔记~操作PLL

一 时钟缓冲器、管理和路由 垂直时钟中心&#xff08;clock backbone&#xff09;将设备分为相邻的左侧和右侧区域&#xff0c;水平中心线将设备分为顶部和底部两侧。clock backbone中的资源镜像到水平相邻区域的两侧&#xff0c;从而将某些时钟资源扩展到水平相邻区域。BUFG不…

windows下编译MicroRTS-Py

1.microRTS&#xff08;java&#xff09; microRTS是java写的跨平台的小型即时战略模拟器。 Farama-Foundation/MicroRTS: A simple and highly efficient RTS-game-inspired environment for reinforcement learning (github.com)https://github.com/Farama-Foundation/Micr…

Kubeadm快速安装 Kubernetes集群

1. Kubernetes简介 Kubernetes&#xff08;k8s&#xff09;是谷歌开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它具有以下特点&#xff1a; 开源容器化自动部署扩展高可用 2. Kubernetes架构 Kubernetes遵循主从式架构设计&#xff0c;主要分…

Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码...

原文链接&#xff1a;https://tecdat.cn/?p37724 在当今世界&#xff0c;粮食系统的稳定性至关重要。尽管现有的全球粮食系统在生产和分配方面表现出较高的效率&#xff0c;但仍存在大量人口遭受饥饿以及诸多粮食安全隐患。与此同时&#xff0c;在学术领域&#xff0c;准确评估…

OpenAI GPT o1技术报告阅读(3)-英文阅读及理解

✨继续阅读报告&#xff1a;使用大模型来学习推理(Reason) 原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个英文阅读理解的案例。 原问题&#xff1a; The following passage is the draft of an excerpt from a contempora…

基于OpenCV的YOLOv5图片检测

利用OpenCV的DNN模块加载onnx模型文件进行图片检测。 1、使用的yolov5工程代码&#xff0c;调用export.py导出onnx模型。 2、下载opencv版本&#xff0c;https://opencv.org/releases/ 使用opencv版本4.5.3或以上&#xff0c;本文使用的opencv4.6.0 3、使用vc20…

css设置overflow:hiden行内元素会发生偏移的现象

父级元素包含几个行内元素 <div id"box"><p><span>按钮</span><span>测试文字文字文字测试文字文字文字</span><span>看这里</span></p></div>#box p{width: 800px;font-size: 30px;}#box p span{disp…

VMware启动时报错: “另一个程序已锁定文件的一部分,进程无法访问” 分析记录

项目场景&#xff1a; VMware启动时报错: “另一个程序已锁定文件的一部分,进程无法访问” 问题描述 VMware启动时报错: “另一个程序已锁定文件的一部分,进程无法访问” 原因分析&#xff1a; 虚拟机开启后会对部分文件继续加密&#xff0c;关闭时虚拟机会自动对其解密&…

css设置动态数组渲染及中间线平均分开显示

效果图&#xff1a; <template><div class"container"><div v-for"(item, index) in items" :key"index" class"item-container"><span class"item">{{ item }}</span><span v-if"in…

二级C语言2023-9易错题

1 二叉树结点数计算&#xff1a; 一棵二叉树有10个度为1的结点&#xff0c;7个度为2的结点&#xff0c;则该二叉树共有____个结点。 解&#xff1a; 2 指针&#xff1a; 有以下程序 #inctude<stdio.h> #include<stdlib.h> main() { int *a&#xff0c;*b&…

Unity数据持久化4——2进制

概述 基础知识 各类型数据转字节数据 文件操作相关 文件相关 文件流相关 文件夹相关 练习题 using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using UnityEngine;public class Exercises1 : MonoBehaviour {/…

6. Python 输出长方形,直角三角形,等腰三角形

使用Python输出长方形&#xff0c;直角三角形&#xff0c;等腰三角形 这里主要使用python语言里的循环知识&#xff0c;具体说是Python语言里的循环嵌套&#xff0c; 注意&#xff0c;在实际使用中&#xff0c;循环嵌套一般最多到达3层&#xff0c;嵌套太多会影响到程序执行。…

详解ChatBI Agent架构:打造高效数据统计系统

随着人工智能技术的迅猛发展&#xff0c;智能对话系统在各行各业中的应用越来越广泛。本文将介绍一种名为ChatBI Agent的架构设计&#xff0c;并以电信运营商系统的经分数据统计Agent为案例&#xff0c;结合具体的代码实现&#xff0c;帮助读者了解这一系统的设计理念和实现方式…