springboot2.7.10整合neo4j -- 关系双向绑定(UNDIRECTED)

news2025/3/1 4:38:21

背景

依赖

springboot版本 2.7.10
本地neo4j安装的版本:4.4.19

依赖如下:

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

springboot整合neo4j官网地址:Accessing Data with Neo4j

遇到的问题:

按照官网向导本地运行后,得不到正确的关系

neo4j得到的数据如下:
在这里插入图片描述

            greg = personRepository.findByName(greg.getName());
            greg.worksWith(roy);
            greg.worksWith(craig);
            personRepository.save(greg);

            roy = personRepository.findByName(roy.getName());
            roy.worksWith(craig);
            // We already know that roy works with greg
            personRepository.save(roy);
            log.info("Lookup each person by name...");
            team.stream().forEach(person -> log.info(
                    "\t" + personRepository.findByName(person.getName()).toString()));

上面代码设置了greg的同事是roy,但是查询roy的同事确无法得到greg。
在这里插入图片描述

问题原因分析过程

参考资料1:

首先从官方github找相关issue,有人遇到同类问题,并得到回复如下(问题连接地址:https://stackoverflow.com/questions/68472313/spring-data-neo4j-6-relationship-undirected)。
在这里插入图片描述

也就是说在早期版本,我们可以在关系这里设置UNDIRECTED属性,实现数据间的双向关系。但是后来出于特别的考虑,Neo4j中的关系都是带有方向的关系,不再支持UNDIRECTORY这个属性(Neo4j-OGM支持?)

参考资料2:

官方示例代码在Person实体中也写了注释,大意和上述一致,而且给了连接(https://dzone.com/articles/modelling-data-neo4j)

   /**
     * Neo4j doesn't REALLY have bi-directional relationships. It just means when querying
     * to ignore the direction of the relationship.
     * https://dzone.com/articles/modelling-data-neo4j
     */
    @Relationship(type = "TEAMMATES",direction = Relationship.Direction.INCOMING)
    public Set<Person> teammates;

在这个连接中主要介绍了directed relationships 和 bidirectional relationships之间的区别及具体使用场景。

得到的核心信息如下:
在这里插入图片描述

这里引入了Cypher语法,也就是通过这些语法能够在neo4J中进行增删改查。通过模仿+实践得到结果如下:

MATCH (p1:Person)-[r:TEAMMATES]-(p2:Person) where p1.name = 'Roy' RETURN p2

在这里插入图片描述

此图结果表明,通过 - 查询是忽略关系方向的,能够得到roy的同事有Greg

MATCH (p1:Person)<-[r:TEAMMATES]-(p2:Person) where p1.name = 'Roy' RETURN p2

在这里插入图片描述

此图结果表明,通过 -> 查询是带有关系方向的,得不到roy的同事有Greg

解决办法

自定义查询语句,使用-查询忽略方向即可,修改如下

  @Query("MATCH (p1:Person)-[r:TEAMMATES]-(p2:Person) where p1.name = $name RETURN p2")
    List<Person> findByTeammatesName(String name);

按照官网demo的打印依然无法得到预期结果,因为数据库中虽然支持查询双向关系,但是并不能自动关联到java的Person对象的teammates中,所以我这里手动查询关系,再把关系设置到java实体中并打印即可。
在AccessingDataNeo4jApplication中修改如下

         log.info("-------------Lookup each person by name from neo4j...");
            team.forEach(p -> {
                List<Person> teammatesName = personRepository.findByTeammatesName(p.getName());
                p.setTeammates(new HashSet<>(teammatesName));
                log.info("\t" + p.toString());
            });

验证

再次运行程序,得到正确结果:
在这里插入图片描述

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

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

相关文章

Java基础(七)面向对象编程(高级)

1. 关键字&#xff1a;static 回顾类中的实例变量&#xff08;即非static的成员变量&#xff09; class Circle{private double radius;public Circle(double radius){this.radiusradius;}public double findArea(){return Math.PI*radius*radius;} }创建两个Circle对象&…

NanoPC-T4 RK3399:(一)平台与框架介绍

概述:近几年工作一直围绕Rockchip进行,手里刚好有一块NanoPC-T4的板子,本专栏将围绕友善NanoPC-T4做一个深度探究和总结,涉及uboot,kernel,rootfs定制等知识点。 一:硬件介绍 NanoPC-T4不仅是世界上最小的全功能接口RK3399一体化主板, 而且是一款完全开源的高性能计算平…

Winnolin PK参数及BE分析

文章目录一、PK参数分析一、非房室模型分析方法操作1.创建数据模型2.建立字段映射3.选择模型参数4.设置参数单位&#xff08;Units&#xff09;5.选择输出参数6.执行&#xff0c;查看结果二、生物等效性分析1.创建数据模型2.建立字段映射3.执行查看结果一、PK参数分析 药代动力…

Python机器学习:支持向量机

这是我读本科的时候第一个接触到的机器学习算法&#xff0c;但也是第一个听完就忘的。。。 他的基本思想很简单&#xff1a;想办法把一个样本集划成两个部分&#xff1a;对于空间中的样本点集合&#xff0c;我们找到一个超平面把这个样本点集合给分成两个部分&#xff0c;其中…

电源的安规设计

目录电源的安规设计1、安规的含义2、执行安规的目的3、电子产品设备可能存在的危险4、安全的基本原则5、安全防护的基本思想6、电击对人的伤害7、危险电压8、人对温度的刺激表现9、根据设备所处的环境&#xff0c;确定其污染等级10、安全距离的确定11、安规器件的要求——X、Y电…

【51单片机Task】:led十六进制控制led灯详解、按键控制流水灯、跑马灯等任务

学习目标&#xff1a; 学习普中51单片机的按键控制led灯。 电路图&#xff1a; 学习内容&#xff1a; LED灯的十六进制怎么算&#xff1f;&#xff1f;&#xff1f; 在这给大家算一下&#xff1a;首先先看一下LED模块的电路图&#xff01; 实物图&#xff1a; 可以把 D1 …

C#基础复习--枚举

枚举 目录 枚举 设置底层类型和显式值 隐式成员编号 位标志 Flags 特性 枚举是由程序员定义的类型&#xff0c;与类或结构一样 与结构一样&#xff0c;枚举是值类型&#xff0c;因此直接存储他们的数据&#xff0c;而不是分开存储成引用和数据 枚举只是一种类型的成员&#…

C语言实践——通讯录(3)(文件版)

首先感谢上一篇博客的大佬们的点赞&#xff0c;非常感谢&#xff01;&#xff01;&#xff01; 目录 前言 一、需要添加的功能 1.增加保存数据函数——可以保存数据到文件中 主要逻辑&#xff1a; 注意事项&#xff1a; 代码实现&#xff1a; 2.修改初始化函数——新…

ChatGPT全球大封号!数10万企业停摆:第一批玩AI的人,被AI给玩了

观点| Mr.K 主笔| Wendy.L 编辑| Emma来源| 技术领导力(ID&#xff1a;jishulingdaoli)3月31日&#xff0c;Open AI就开始无征兆的进行全球大封号&#xff0c;其中亚洲是重灾区&#xff0c;官方没有给出任何声明&#xff0c;具体原因不得而知。并且暂停了这些地区新账号的注…

IDEA下载数据库驱动失败解决办法

IDEA下载数据库驱动失败解决办法 在使用IDEA连接数据库的时候可能会出现驱动下载失败的情况。我们可以到数据库官网上下载驱动进行本地安装。 下面以Sql Server为例&#xff1a; 打开官网&#xff0c;下载驱动 官网地址&#xff1a;https://www.microsoft.com/zh-cn/sql-se…

如何用WordPress搭建一个属于自己的网站、让你从0-1的保姆级教程

文章目录搭建网站必备前提第一步 拉取对应的lnpm包解压lnpm服务器开放端口号配置nginx安装对应的wordPress包第一步&#xff1a;安装 wordpress 安装包并解压到 /home/wwwroot第二步&#xff1a;登录MySQL&#xff08;密码在前面 部署LNMP 时你设置过&#xff09;&#xff0c;创…

第五章 保护模式进阶,向内核迈进

获取物理内存容量 学习Linux获取内存的方法 通过调用BIOS中断0x15实现&#xff0c;分别是BIOS中断0x15的三个子功能&#xff0c;子功能号要存放到寄存器EAX或AX中&#xff1a; BIOS中断是实模式下的方法&#xff0c;只能进入保护模式前调用。可以在实模式下用这三种方法检测…

医院PACS系统源码,PACS源码,带3D重建PACS系统源码

PACS系统源码&#xff0c;带3D重建PACS源码 专门针对医院工作流程设计的&#xff0c;完全符合医院需要&#xff0c;配置灵活的放射科信息化解决方案。采用标准接口协议&#xff0c;实现预约登记、报告诊断、图像浏览和处理、信息统计等功能。 文末获取联系&#xff01; 功能介…

基于广义benders分解法的综合能源系统优化规划(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

用友U8 cloud,信创云ERP的数智先锋

编辑&#xff1a;阿冒设计&#xff1a;沐由从来未曾有过一个春天&#xff0c;能够像当下这般被如此由衷地期待。经历了漫长的1000多个日日夜夜之后&#xff0c;我们的工作与生活终于回到正轨。自2023年以来&#xff0c;中国市场迎来“开门红”&#xff0c;消费市场加速回暖&…

分类算法性能度量指标

1.简介 为了了解模型的泛化能力&#xff0c;我们需要用某个指标来衡量&#xff0c;这就是性能度量的意义。常用的评估指标有&#xff1a;混淆矩阵(Confuse Matrix)、准确率(Accuracy)、精准率(Precision)和召回率(Recall)、F1-Score、ROC曲线(Receiver Operating Characteristi…

离散数学_九章:关系(1)

关系9.1关系及其性质 1、二元关系 2、集合A上的关系 3、n元素集合 有多少个关系&#xff1f; 4、关系的性质 1. 自反 2. 对称 3. 反对称 4. 传递 5、关系的组合 关系的合成 关系的幂 9.1关系及其性质 1、二元关系 设A和B是集合&#xff0c;一个从 A 到 B 的二元关系是…

Pytorch基础 - 8. scatter() / scatter_() 函数

目录 1. scatter() 定义和参数说明 2. 示例和详细解释 3. scatter() 常见用途 1. scatter() 定义和参数说明 scatter() 或 scatter_() 常用来返回根据index映射关系映射后的新的tensor。其中&#xff0c;scatter() 不会直接修改原来的 Tensor&#xff0c;而 scatter_() 直接…

元宇宙:虚拟仿真技术的全面提升

在当今数字化的世界中&#xff0c;我们经常听到虚拟现实、增强现实、混合现实等技术的名词&#xff0c;这些技术的应用越来越成熟。其中&#xff0c;虚拟仿真技术是一种通过计算机技术来模拟实际场景和对象的过程&#xff0c;它为我们提供了更多的可能性。而最近备受瞩目的元宇…

减震无人船或波浪自适应无人船

最近我的朋友夏先生介绍了一款他们自己正在研发的一款无人减震船&#xff0c;见下图&#xff0c;与以前无人船相比&#xff0c;它增加了悬挂减震系统&#xff08;图中红框内&#xff09;。 现有无人船大多属于中小型船舶&#xff0c;没有完善的减震减摇系统&#xff0c;减震减摇…