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

这篇具有很好参考价值的文章主要介绍了Springboot集成neo4j实现知识图谱关系图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


前言

使用neo4j来完成人员关系

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


一、neo4j是什么?

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

二、安装步骤

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

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

我下载的是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的结果关系可能有很多重复项文章来源地址https://www.toymoban.com/news/detail-432415.html

    @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);

到了这里,关于Springboot集成neo4j实现知识图谱关系图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 知识图谱项目——红色文化之张学良人物知识图谱(Neo4j+vue+flask+mysql实现)

    本项目为人工智能专业大三知识图谱课程期末作业。意在完成一个以张学良为背景的红色文化类知识图谱。文末放上本项目的代码地址。 🚀前端 Vue.js d3.js jQuery html/css/js 🚀后端 Flask 🚀中间件 🅰️axios 🅱️neo4j-driver 🚀数据库 MySQL Neo4j 🚀服务器 腾讯云轻量应用服务器 互

    2024年02月09日
    浏览(50)
  • 医疗知识图谱 neo4j

    开源项目: https://github.com/liuhuanyong/QASystemOnMedicalKG pip install pyahocorasick pip install py2neo 需要改的点: 1.改连接的方式 2.改读文件的方式 MedicalGraph 运行: build_medicalgraph.py 时间很长,几个小时 关闭neo4j客户端 导入文件 文件见网盘 1.首先通过ahocorasick提取出,属于哪种疾病

    2024年02月09日
    浏览(50)
  • Neo4j简单构建知识图谱实例

    目录  一、需要两组数据 二、提取所需专题数据 三、利用结巴分词将专题数据分词 四、连接并绘制知识图谱 五、消除重复节点及重复关系 六、结果展示 Ps:在使用Neo4j前,需要先在该安装路径文件下cmd运行,输入neo4j console 即可启动,可根据关闭时输入neo4j stop,如下图所示

    2023年04月12日
    浏览(58)
  • (知识图谱学习1)neo4j基础

    目录 一、neo4j安装与环境配置 官网:https://neo4j.com/download-center/ 下载社区版neo4j服务 neo4j环境变量配置 jdk下载 jdk版本: 启动neo4j 二、cypher语句基本增删改查 增 删除 改 查 三、Py2neo连接neo4j 安装pip install py2neo 连接neo4j 建立节点 建立关系 匹配节点 匹配关系 删除节点 删除关系

    2024年02月10日
    浏览(53)
  • Vue2下使用neovis.js实现neo4j知识图谱可视化

    Vue2下使用neovis.js实现neo4j知识图谱可视化 知识图谱展示: 但目前查询功能还有BUG,不能使用,有大佬的话请教一下

    2024年02月06日
    浏览(54)
  • 知识图谱构建: Neo4j 常见实例应用

    社交网络图:存储用户之间的关系和联系,如朋友关系、粉丝关系等。 产品推荐系统:利用用户的历史购买记录和评分数据,推荐相似的产品。 客户关系管理:存储企业和客户之间的联系,包括联系信息、交易记录等。 知识图谱:存储各种实体之间的关系,如人物、事件、

    2024年02月10日
    浏览(53)
  • 基于neo4j的宠物知识图谱问答系统

    在当前数字化的时代,人工智能技术的迅速发展为信息检索和数据处理带来了革命性的变化。特别是在宠物领域,一个智能的宠物关系图谱问答系统能够为宠物爱好者提供全面、精准的信息服务。本文将详细介绍一个基于Python、Django、Flask、Neo4j以及py2neo等技术栈实现的宠物关

    2024年02月20日
    浏览(94)
  • 再相逢【知识图谱】中文医学知识图谱CMeKG,中文产科医学知识图谱COKG | 附:图数据库Neo4j下载安装教学(遇到问题并解决) + Neo4j基本操作

      无论结果如何,请相信那些你努力游向岸的日子都有它的意义。   🎯 作者主页 : 追光者♂ 🔥          🌸 个人简介 : 计算机专业硕士研究生 💖、 2022年CSDN博客之星人工智能领域TOP4 🌟、 阿里云社区特邀专家博主 🏅、 CSDN-人工智能领域新星创作者 🏆、 预期20

    2024年02月14日
    浏览(82)
  • 毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前言

    资源链接:https://download.csdn.net/download/m0_46573428/87796553 前言:毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前言_人工智能技术小白修炼手册的博客-CSDN博客 首页与导航:毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前端:首页与导航栏_人工智

    2024年02月14日
    浏览(48)
  • 知识图谱实战(03):python操作neo4j实战

    Neo4j 提供了一个Python版本的驱动包,用来连接Neo4j数据库,从而完成图数据库的增删改查操作。 1、安装指定版本的驱动包(我们这里采用Neo4.x版本,同neo4j安装包保持一致即可) $ pip install neo4j==4.4.8  --upgrade

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包