当前位置: 首页 > news >正文

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 与之前的版本使用还是有很多区别的,在网上找了很多,没有找到合适的,自己摸索了两天,搞了一个出来,希望可以帮助到你

相关文章:

neo4j(spring) 使用示例

文章目录 前言一、neo4j是什么二、开始编码1. yml 配置2. crud 测试3. node relation 与java中对象的关系4. 编码测试 总结 前言 图数据库先驱者 neo4j&#xff1a;neo4j官网地址 可以选择桌面版安装等多种方式,我这里采用的是docker安装 直接执行docker安装命令: docker run…...

链接升级:Element UI <el-link> 的应用

链接升级&#xff1a;Element UI 的应用 一 . 创建文字链接1.1 注册路由1.2 创建文字链接 二 . 文字链接的属性2.1 文字链接的颜色2.2 是否显示下划线2.3 是否禁用状态2.4 填写跳转地址2.5 加入图标 在本篇文章中&#xff0c;我们将深入探索Element UI中的<el-link>组件—…...

简单题26 - 删除有序数组中的重复项(Java)20240917

问题描述&#xff1a; java代码&#xff1a; class Solution {public int removeDuplicates(int[] nums) {if (nums.length 0) return 0; // 处理空数组情况int i 0; // 指向新数组中的最后一个不重复元素for (int j 1; j < nums.length; j) {if (nums[j] ! nums[i]) { …...

DFS:深搜+回溯+剪枝实战解决OJ问题

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 排列、子集问题 1.1 全排列I 1.2 子集I 1.3 找出所有子集的异或总和 1.4 全排列II 1.5 字母大小写全排列 1.6 优美的排列 二 组合问题 2.1 电话号码的数字组合 …...

命令语境中的“可以”的字词含义分析

摘要 在语言交流中&#xff0c;词汇的使用经常受到语境的影响。本文探讨了“可以”一词在上司与下属之间的互动中所表达的命令含义。通过分析语料和实例&#xff0c;发现“可以”在某些情况下并不传达许可的含义&#xff0c;而是被用作一种隐性命令。本文讨论了这一现象的成因…...

直播相关03-录制麦克风声音, ffmpeg 命名,使用命令行完成录音

一 ffmpeg 命令 ffmpeg arg1 arg2 -i arg3 arg4 arg5ffmpeg 全局参数 输入文件参数 -i 输入文件 输出文件参数 输出文件arg1&#xff1a;全局参数 arg2&#xff1a;输入文件参数 arg3&#xff1a;输入文件 arg4&#xff1a;输出文件参数 arg5&#xff1a;输出文件 二 ffprobe …...

VUE3中ref与reactive

ref&#xff1a;支持所有类型reactive&#xff1a;只支持引用类型(Obj&#xff0c;Array...)两者都是实现数据视图响应式 JS逻辑使用中 ref&#xff1a;需要使用.value reactive&#xff1a;不需要使用.value <el-button click"handle()" type"primary"…...

高职院校人工智能技术和无人机技术实训室建设方案

一、方案背景与需求分析 1.1 人工智能与无人机技术发展概况 人工智能&#xff08;AI&#xff09;和无人机技术作为当今科技领域的两大热点&#xff0c;正以前所未有的速度发展和渗透到各行各业中。根据国际数据公司(IDC)的报告&#xff0c;全球人工智能市场规模预计将在2024年…...

x-cmd pkg | shtris: 在终端体验经典的俄罗斯方块游戏

目录 简介首次用户技术特点竞品和相关项目进一步阅读 简介 shtris 是一个由 shell 脚本&#xff0c;参考 俄罗斯方块指南 (2009) 实现的俄罗斯方块游戏。 首次用户 本文的 demo 展现了如何通过 x-cmd 快速启动使用 shtris 。x-cmd也提供了1分钟教程可以帮你快速入门。 技术…...

Linux基础---07文件传输及解决yum安装失效的方法

Linux文件传输地图如下&#xff0c;先选取你所需的场景&#xff0c;若你是需要Linux和Linux之间传输文件就查看SCP工具即可。 一.下载网站文件 前提是有网&#xff1a; 检查网络是否畅通命令&#xff1a;ping www.baidu.com&#xff0c;若有持续的返回值就说明网络畅通。Ctr…...

[项目][WebServer][Makefile Shell]详细讲解

目录 1.Makefile2. build.sh3.test.sh 1.Makefile 为了方便构建项目&#xff0c;并将其发布&#xff0c;使用Makefile来管理构建项目 bin httpserver cgi test_cgi cc g GLD_FLAGS -stdc11 -D DEBUG_SHOW LD_FLAGS $(GLD_FLAGS) -lpthread src main.cc curr $(shell p…...

ElementUI大坑Notification修改样式

默认<style lang"scss" scoped>局部样式&#xff0c;尝试用deep透传也无效 实践成功方法&#xff1a;单独写一个style <style> .el-notification{position: absolute !important;top: 40% !important;left: 40% !important; } </style> 也支持自…...

vivado中的diagram

在 Vivado 中&#xff0c;“Diagram” 选项卡是 IP Integrator 的一部分&#xff0c;它用于创建和编辑 Block Design。Block Design 是一种图形化的设计方法&#xff0c;它允许设计者通过拖放组件&#xff08;如 IP 核和自定义模块&#xff09;并连接它们来构建复杂的数字电路设…...

项目实现:云备份②(文件操作、Json等工具类的实现)

云备份 前言文件操作实用工具类设计文件属性的获取文件的读写操作文件压缩与解压缩的实现文件目录操作 Json 实用工具类设计编译优化 前言 如果有老铁不知道当前项目实现的功能是什么的话&#xff0c;可以先移步这篇文章内容&#xff1a; 云备份项目的介绍 其中介绍了云备份项…...

‌内网穿透技术‌总结

内网穿透是一种网络技术&#xff0c;通过它可以使外部网络用户访问内部网络中的设备和服务。一般情况下&#xff0c;内网是无法直接访问的&#xff0c;因为它位于一个封闭的局域网中&#xff0c;无法从外部访问。而通过内网穿透&#xff0c;可以将内部网络中的设备和服务暴露在…...

Git使用—把当前仓库的一个分支push到另一个仓库的指定分支、基于当前仓库创建另一个仓库的分支并推送到对应仓库(mit6828)

把学习过程中遇到的Git问题汇总如下&#xff08;后续学习遇到问题会及时更新此专栏&#xff09;&#xff1a; Git原理及常用命令小结——实用版&#xff08;ing......&#xff09;、Git设置用户名邮箱-CSDN博客 解决git每次push代码到github都需要输入用户名以及密码-CSDN博客…...

windows11+ubuntu20.04.6双系统安装

记录win11和ubuntu20.04.6在单个硬盘上安装的主要流程 系统说明 BIOS模式&#xff1a; UEFI 硬盘&#xff1a; 1TB固态 内存&#xff1a; 32GB 步骤 1、 准备两个不小于16GB的U盘&#xff0c;一个用于装Windows&#xff0c;一个用于装ubuntu&#xff0c;注意8G的U盘虽然能够…...

如何通过 PhantomJS 模拟用户行为抓取动态网页内容

引言 随着网页技术的不断进步&#xff0c;JavaScript 动态加载内容已成为网站设计的新常态&#xff0c;这对传统的静态网页抓取方法提出了挑战。为了应对这一挑战&#xff0c;PhantomJS 作为一个无头浏览器&#xff0c;能够模拟用户行为并执行 JavaScript&#xff0c;成为了获…...

ARM驱动学习之8 动态申请字符类设备号

ARM驱动学习之8 动态申请字符类设备号 KernelCode: • 字符设备函数在文件“include/linux/fs.h”中 • alloc_chrdev_region() 是动态分配主次设备号。 • 宏定义MAJOR提取dev_t数据中的主设备号源码&#xff1a; /*** alloc_chrdev_region() - register a range of char dev…...

TCP.IP四层模型

一、TCP/IP模型协议分层 1、应用层&#xff1a; 2、传输层&#xff1a; TCP&#xff1a;传输控制协议 UDP&#xff1a;用户数据报协议 3、网络层&#xff1a; IP: 国际协议&#xff08;IP地址&#xff09; ICMP&#xff1a; 互联网控制消息协议&#xff08;互联网…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...