Springboot集成neo4j实现知识图谱关系图

news2024/11/16 9:42:50

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、neo4j是什么?
  • 二、安装步骤
    • 1.启动
    • 2.使用
    • 2.简单命令
  • 二、使用springboot集成neo4j
    • 1.引入依赖
    • 2.功能实现
    • 3.查询关系节点
    • 4. 查询指定评委和指定选手中,存在指定关系,并返回关系集合


前言

使用neo4j来完成人员关系

公司项目有一个功能需要将各个人员关系列出,在参加评选的时候,进行展示和筛选


一、neo4j是什么?

neo4j是高性能的NOSQL图形数据库,在neo4j中,社区版本只能使用一个database。在neo4j中不存在表的概念,我们只需要注意两个东西,一个是节点,一个是关系。不同节点和相同节点都可以产生关系。

二、安装步骤

https://neo4j.com/download-center/

在这里插入图片描述

我下载的是3.5.28,超过4.x,jdk版本需要11

1.启动

在bin目录下使用cmd命令 在命令框中执行 neo4j.bat console启动数据库

2.使用

1.登录管理页面 http://localhost:7474
2.第一次登录账号密码都是neo4j

2.简单命令

1.创建节点 create (:node1{nodeId:1,name:'王大'})
2.修改节点 merge (a:node1{nodeId:1}) set a.name='王小二' return a  //如果节点不存在就创建
3.删除节点 match (a:node1{nodeId:1}) delete a
4.查询节点 match (a:node1{nodeId:1}) return a
5.创建关系 create (a:node1{nodeId:1})-[:relationShip{shipId:1,shipName:'好友'}]->(b:node1{nodeId:2})
6.查询关系 match (a:node1)-[r:relationShip]->(b:node1) return a.name,r.shipName,b.name
7.在查询关系时可以在a和关系以及b中设置查询条件,或者在b后跟where条件来筛选

二、使用springboot集成neo4j

1.引入依赖

本项目是springboot框架进行开发的,所以在项目中添加pom依赖

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

2.功能实现

这个功能是对人员进行关系筛选,人员身份是两类,一种是评委,一种是选手,所以,我们使用PersonNode对象,并且使用type来区分
可以使用neo4j框架自带的注解进行标注,NodeEntity是存在neo4j数据库种node的节点名称,Property是存放在数据库的名称,Relationship是节点关系的属性,包括节点类型和指向。指向默认是向外,也可以向内和双向。personRelationship是另一个关系类的名称

@Data
@NodeEntity(label = "PersonNode")
public class PersonNode {

    @Id
    @GeneratedValue
    private Long id;

    @Property(name = "type")
    private Integer type; 

    @Property(name = "personId")
    private String personId;

    @Property(name = "name")
    private String name;

    @Property(name = "idCard")
    private String idCard;

    @Relationship(type = "personRelationship",direction = Relationship.OUTGOING) //这是关系
    private List<PersonRelationship> relationship;

}
@Data
@RelationshipEntity(type = "personRelationship")
public class PersonRelationship {

    @Id
    @GeneratedValue
    private Long id;

    @StartNode
    private PersonNode startNode;

    @EndNode
    private PersonNode endNode;

    /**
     @Property 注解用于定义单个属性,通常用于标注在实体类的字段上,指定该字段映射到节点或关系的一个属性
     @Properties 注解用于定义多个属性,通常用于标注在实体类的方法上,指定该方法返回一个 Map<String, Object>
     使用@Property注解时,如果属性名与注解的值相同,则可以省略注解的值
     */
    @Property
    private String relationName;  //关系类型

    private String typeName;  //分类名称

    private String level;   //等级

}

3.查询关系节点

1.创建一个PersonNodeRepository继承Neo4jRepository

2.在PersonNodeRepository可以使用注解@query来写cql语句

3.比如创建人员信息:我使用MERGE来实现,存在就更新

MERGE (n:PersonNode{personId: $personNode.personId}) SET n.name= $personNode.name,n.idCard=$personNode.idCard,n.type=$personNode.type return n
PersonNode saveOrUpdate(@Param("personNode")PersonNode personNode);

4.创建关系:先根据条件进行查询,在使用merge创建关系

    @Query("Match (s:PersonNode{personId: $relationExcel.startPersonId}),(e:PersonNode{personId:$relationExcel.endPersonId})" +
            "MERGE (s)-[:personRelationship {relationName:${relationExcel.relationName},typeName:${relationExcel.typeName},relationId:${relationExcel.relationId}]->(e) ")
    void createPersonRelation(PersonRelationExcel relationExcel);

5.在neo4j种,查询后的数据是一个特殊的格式类型。所以往往需要对这个格式进行处理,我们可以使用apoc插件来使返回的结果呈现多层关系一样 的树状结构,在这个查询条件中,使用p来接收查询的结果,with将单个元素组组成列表,最后使用apoc生成树状数据。personRelationship中带有*表示查询所有层级的数据。如果不带 * ,那么只会返回两层数据

MATCH p=(n:PersonNode)-[:personRelationship*]->(m:PersonNode) 
with collect(p) as ps call apoc.convert.toTree(ps) yield value return value

4. 查询指定评委和指定选手中,存在指定关系,并返回关系集合

为什么要这样,因为前端的框架需要所有的节点list和所有的关系list

1.首先返回node节点,根据relationName,relationIdList,expertIdList,auditPersonIdList来筛选,ALL(rel IN r WHERE rel.relationName IN $dto.relationName ) ,r是一个列表,需要遍历r来判断是否存在。使用关系后,使用WITH和relationships ,relationship将获取到p中所有 的关系,并且形成集合。UNWIND 将集合展开。可能有人问,集合展开和集合有什么关系:

有的集合长这样['a','b','c','d','e']  ,有的集合长这样:[['a','b','c'],['d','e']]
对于with形成的集合就长[['a','b','c'],['d','e']] , UNWIND 展开的集合长:['a','b','c','d','e']

最后我们得到了rs这样的集合,rs存在startNode和endNode的id,我们可以通过这两个属性来查询节点
我们使用collect来生成集合,并且使用distinct去重来获取到startNode的节点和endNode的节点
最后我们将这两个集合展开成一个集合返回

    @Query("MATCH p=(n:PersonNode)-[r:personRelationship*]->(m:PersonNode) " +
            "WHERE 1=1 " +
            "AND CASE WHEN size($dto.relationName) <> 0 THEN ALL(rel IN r WHERE rel.relationName IN $dto.relationName ) ELSE true END " +
            "AND CASE WHEN size($dto.relationIdList) <> 0  THEN ALL(rel IN r WHERE rel.relationId IN $dto.relationIdList ) ELSE true END " +
            "AND CASE WHEN size($dto.expertIdList) <> 0 THEN n.personId IN $dto.expertIdList ELSE true END " +
            "AND CASE WHEN size($dto.auditPersonIdList) <> 0 THEN m.personId IN $dto.auditPersonIdList ELSE true END " +
            "AND CASE WHEN $dto.other ='Y' THEN length(p) > 1 ELSE true END " +
            "WITH n, m, relationships(p) AS rels " +
            "UNWIND rels AS rs " +
            "match (a:PersonNode{personId:startNode(rs).personId}),(b:PersonNode{personId:endNode(rs).personId}) "+
            "WITH collect(distinct {personId:a.personId,type:a.type,name:a.name}) + collect(distinct {personId:b.personId,type:b.type,name:b.name}) as nodes1 "+
            "UNWIND nodes1 as nodes " +
            "RETURN DISTINCT nodes")
    List getNode(@Param("dto") RelationConditionDto dto);

2.获取关系的集合

和获取对象一样,注意,我们将r展开,还需要去重。match的结果关系可能有很多重复项

    @Query("MATCH p=(n:PersonNode)-[r:personRelationship*]->(m:PersonNode) " +
            "WHERE 1=1 " +
            "AND CASE WHEN size($dto.relationName) <> 0 THEN ALL(rel IN r WHERE rel.relationName IN $dto.relationName )  ELSE true END " +
            "AND CASE WHEN size($dto.relationIdList) <> 0  THEN ALL(rel IN r WHERE rel.relationId IN $dto.relationIdList )  ELSE true END " +
            "AND CASE WHEN size($dto.expertIdList) <> 0 THEN n.personId IN $dto.expertIdList ELSE true END " +
            "AND CASE WHEN SIZE($dto.auditPersonIdList) <> 0 THEN m.personId IN $dto.auditPersonIdList ELSE true END " +
            "AND CASE WHEN $dto.other ='Y' THEN length(p) > 1 ELSE true END " +
            "UNWIND r AS rels " +
            "with distinct(rels) as rs "+
            "match (a:PersonNode{personId:startNode(rs).personId}),(b:PersonNode{personId:endNode(rs).personId}) "+
            "return a.personId as startId,a.name as startName,b.personId as endId,b.name as endName,rs.typeName as typeName,rs.relationName as relationName,rs.relationId as relationId")
    List<Map> getRelationList(@Param("dto") RelationConditionDto dto);

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

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

相关文章

基于matlab使用光线追踪自定义 CDL 通道模型

一、前言 此示例演示如何使用光线追踪分析的输出自定义 CDL 通道模型参数。该示例演示如何&#xff1a; 指定发射器和接收器在 3D 环境中的位置。 使用光线追踪来计算通道的几何方面&#xff1a;光线数量、角度、延迟和衰减。 使用光线追踪分析的结果配置 CDL 通道模型。 使用相…

KDYZ-YM晶闸管伏安特性测试仪

一、概述 晶闸管的伏安特性是晶闸管的基本特性&#xff0c;这项特性的好坏&#xff0c;直接影响到器件在整机上的正常使用。因此&#xff0c;检测晶闸管的伏安特性在晶闸管器件的生产、经销及使用过程中都是十分重要的。 测试方法符合国标JB/T7624-94《整流二极管测试方法》和J…

深入理解Go语言中的函数【单元测试】14

文章目录 go test工具测试函数测试函数的格式测试函数示例 测试组子测试测试覆盖率基准测试基准测试函数格式基准测试示例性能比较函数重置时间并行测试 Setup与TearDownTestMain子测试的Setup与Teardown 示例函数示例函数示例 go test工具 Go语言中的测试依赖go test命令。编…

Three.js+TypeScript+Webpack学习记录(一)

使用环境参考 Node.js v16.19.1 VSCode 插件&#xff1a;Live Server 正文 初始化新工程 安装好 node 环境后&#xff0c;新建一个空项目文件夹&#xff0c;执行 npm init 一路回车即可。 然后配置 npm 所需要的包&#xff0c;直接列一下 package.json {"name":…

SpringBoot集成模板引擎Thymeleaf

本博文重点内容共3个方面&#xff0c;分别是&#xff1a; 在SpringBoot中使用thymeleaf自定义thymeleaf工具类导出静态网页thymeleaf常用的标签 一、在SpringBoot中使用thymeleaf pom.xml <!--Thymeleaf 启动器--><dependency><groupId>org.springframewo…

java基础总结-java技术栈快速复习

java基础 java基础概念 java概述和语言背景 java语言是没有sun公司&#xff08;Stanford University Network&#xff1a;斯坦福大学网络&#xff09;在1995年推出的计算机语言java之父&#xff1a;詹姆斯高斯林&#xff08;James Gosling&#xff09;2009年&#xff0c;sun公…

2021地理设计组二等奖:基于多源数据的黑龙江省森林康养适宜性评价及康养产品设计

一、作品背景 1.森林康养产业蓬勃发展 为适应逐渐增加的康养需求&#xff1b;国家草原局印发《关于促进森林康养产业发展的意见》&#xff0c;在《意见》中指出到2022年&#xff0c;建成基础设施基本完善、产业布局较为合理的区域性森林康养服务体系&#xff1b;到2035年&…

网络工程师的水平检测1

水平测试 文章目录 水平测试填空题&#xff08;11分&#xff09;判断题&#xff08;9分&#xff09;选择题&#xff08;8分&#xff09;简答题&#xff08;26分&#xff09;子网划分&#xff08;24分&#xff09;实验拓扑&#xff08;19分&#xff09;填空题&#xff08;5分&am…

变压器绕制

变压器同名端 1、变压器同名端&#xff0c;是指在变压器绕制的时候&#xff0c;各绕组方向统一&#xff0c;同名端同时都为进线&#xff08;起始端&#xff09; 或出线&#xff08;结束端)。若某一个绕组骨架插入夹头方向反向&#xff0c;则相应该绕组进出线同时反向。同名端&a…

CCTV-TIME特别关注:首届医药港国际健康美食文化嘉年华

“食在广州 味在方舟”首届医药港国际健康美食文化嘉年华4月28日在健康方舟盛大开幕! 【央媒时代TOP中国时代周刊中国品牌万里行CCTV-TIME特别关注】健康美食、滋补靓汤、异国风情、非遗文化、治愈萌宠、灯光夜市、亲子玩乐、浪漫许愿树……五一长假,广州的这场精彩嘉年华活动…

vue3+ts+pinia+vite一次性全搞懂

vue3tspiniavite项目 一&#xff1a;新建一个vue3ts的项目二&#xff1a;安装一些依赖三&#xff1a;pinia介绍、安装、使用介绍pinia页面使用pinia修改pinia中的值 四&#xff1a;typescript的使用类型初识枚举 一&#xff1a;新建一个vue3ts的项目 前提是所处vue环境为vue3&…

springboot文件上传

1.新建文件上传页面 在static目录中新建upload-test.html&#xff0c;上传页面代码如下所示&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>springboot文件上传测试</title> <…

编译时报Clang SA is not enabled问题解决

报此问题应该是swap不足导致的&#xff0c;原因是用的虚拟机&#xff0c;改为16G内存问题排除 具体解决如下&#xff1a; 1.free -h 查看当前分区大小和使用情况 2.扩展分区大小 2.1首先删除系统默认分区 sudo swapoff /swapfile sudo rm /swapfile 2.2新建swap分区&#xf…

ROS学习第十六节—— 头文件与源文件

https://download.csdn.net/download/qq_45685327/87708569 1.自定义头文件调用 新建功能包 在该路径下创建头文件 /home/xiaoming/demo0/src/hello_head/include/hello_head 编写以下代码 #ifndef _HELLO_H #define _HELLO_Hnamespace hello_ns{class HelloPub {public:vo…

分享10个值得推荐的技巧,提升JavaScript 的性能

JavaScript 在网页开发中非常重要&#xff0c;它控制了大部分网页上的活动和动画效果。但是&#xff0c;如果代码编写不当&#xff0c;JavaScript 可能会导致网站速度变慢。代码的不足可能导致网页加载缓慢&#xff0c;渲染速度也会变慢。 按照以下策略来提高您网站的速度和性能…

基于web的病号康复训练系统asp.net+sqlserver+C#

本系统主要内容分为病号管理模块,康复师管理模块,管理员管理模块等三大模块 1,病号管理模块主要分为:用户管理,在线问答,在线预约,用户中心,信息查询. 2. 康复师管理模块主要有:康复师信息管理,病人信息管理&#xff0c;预约信息管理&#xff0c;留言信息管理&#xff0c;训练计…

自然语言处理实战项目3-利用CNN做语义分析任务

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来自然语言处理实战项目3-利用CNN做语义分析任务&#xff0c;深度学习在自然语言处理领域中的应用越来越广泛&#xff0c;其中语义分析是其中一个重要的应用。本文将为读者介绍语义分析的任务以及如何用深度学习方法实现该…

​​2021遥感应用组二等奖:基于机器学习回归算法的鄱阳湖水质遥感定量反演及时序变化监测研究

作品介绍 一、作品背景 鄱阳湖是中国第一大淡水湖&#xff0c;也是中国第二大湖&#xff0c;它在调节长江水位、涵养水源、改善当地气候等方面起着重大的作用。但近年来受围垦、环境污染等人类活动影响&#xff0c;鄱阳湖湿地退化严重&#xff0c;同时使鄱阳湖的容量减少&…

JdbcTemplate总结

JdbcTemplate总结 JdbcTemplate技术是 Spring技术里面提供的一种数据库访问技术。之前学习的数据库技术是 JdbcUtils类完成的&#xff0c;现在用JdbcTemplate新技术了。 使用JdbcTemplate技术的本质就是&#xff1a;通过 IOC容器配置一个 JdbcTemplate对象&#xff0c;使用它来…

choco-slover安装

一. 基础知识 1. 起步资料 choco-slover github源代码以及工具下载网址:https://github.com/chocoteam/choco-solverchoco-slover 官网文档:https://choco-solver.org/choco-slover安装eclipse视频:https://www.youtube.com/watch?v=qz6ATkEI_F8视频所采用的资源网址:htt…