图形数据库的实战应用:如何在 Neo4j 中有效管理复杂关系

关系数据库管理系统( RDBMS ) 代表了最先进的技术,这在一定程度上要归功于其由周边技术、工具和广泛的专业技能组成的完善的生态系统。

在这个涵盖信息技术(IT) 和运营技术(OT) 的技术革命时代,人们普遍认识到性能方面出现了重大挑战,特别是在NoSQL 解决方案优于传统方法的特定用例中。事实上,市场提供了许多解释和利用各种不同数据模型的NoSQL DBMS解决方案:

  • 键值存储(例如,最简单的存储,其中对持久数据的访问必须是即时的,并且通过像哈希映射或字典这样的键进行检索);

  • 面向文档(例如,在无服务器解决方案和 lambda 函数架构中广泛采用,其中客户端需要直接从数据库获取结构良好的 DTO);

  • 面向图的(例如,对于知识管理、语义网或社交网络有用);

  • 面向列(例如,在查询驱动的建模方法中提供高度优化的“即用型”数据投影);

  • 时间序列(例如,用于处理物联网场景中的传感器和样本数据);

  • 多模型存储(例如,组合不同类型的数据模型以实现混合功能目的)。

“与那些完全不使用数据的人相比,使用不充分的数据时出现错误要少得多。” 

一个较少被研究的问题是依赖于关系解决方案的软件架构能够灵活地适应软件领域和功能需求快速而频繁的变化。类似敏捷的软件开发方法加剧了这一挑战,这些方法旨在满足客户处理由其业务市场主导的不断出现的需求。

特别是,RDBMS 就其本质而言,当软件需求随着时间的推移而变化时,可能会受到影响,通过引入新的关联表(也替换预先存在的外键)并在 SQL 查询中生成新的 JOIN 子句,对数据库表格模式产生快速影响,从而导致更复杂且更难维护的解决方案。

根据我们的企业经验,我们已经成功实施并试验了基于Neo4j 图形数据库的面向图形的 DBMS 解决方案,以便在具有不同用户和角色的数字社交社区的典型操作环境中减轻需求变更的架构后果。

在这篇文章中,我们:

  • 举例说明面向图形的 DBMS 如何更能满足功能需求;

  • 讨论在经典的N层(分层)架构中采用面向图的DBMS的可行性,提出一些克服主要困难的方法;

  • 强调在各种环境和用例中采用它们的优点和缺点以及威胁。

Neo4j 图形数据库

面向图的数据模型背后的思想是采用原生方法来处理实体(即节点)及其背后的关系(即边),以便通过导航实体之间的关系来查询知识库(即知识 图)。

Neo4j 图形数据库适用 于面向属性图,其中节点和边都拥有不同类型的属性属性。

我们选择它作为 DBMS,主要是为了:

  • 它的“本机”实现是通过数字图元模型具体建模的,其运行时实例由节点(包含具有域属性的实体)和边(表示互连概念之间的可导航关系)组成。这样,关系的遍历时间为O(1);

  • Cypher查询语言被采用为图形中持久知识的非常强大且直观的查询系统。

此外,Neo4j 图形数据库还提供用于对象图形映射(OGM) 的Java 库,可帮助开发人员实现映射、持久化和管理模型实体、节点和关系的自动化过程。实际上,OGM 对于面向图形的 DBMS 的解释与对象关系映射( ORM )模式对于关系持久层的作用相同。

与为 RDBMS 设计的 ORM 模式相比,OGM 模式用于简化数据访问对象( DAO )的实现。它的主要功能是在源代码中正确配置和注释的持久域模型实体中启用半自动细化。

相对于被广泛认为是领先的 ORM 技术的Java Persistence API ( JPA )/Hibernate,Neo4j的 OGM 库以独特的方式运行:

写操作

  • OGM 在托管实体的所有关系中传播持久性更改(从托管对象开始分析整个对象关系树);

  • JPA从托管实体开始逐表执行更新,并基于级联配置处理关系。

读操作

  • OGM通过查询检索一整棵具有固定深度的“关系树”,从指定节点开始,充当“树的根”;

  • JPA允许配置EAGER和LAZY加载方法之间的关系。

示例性案例研究的解决方案优势

为了举例说明我们分析的意义,我们引入一个简单的操作场景:图 1.1 中的 UML 类图描述了一个与实体 Auth(授权的缩写)具有 1 对 N 关系的 User 实体,该实体定义了应用程序内的权限和授权。这种领域模型可以通过类似于表 1.1 和表 1.2 的架构在关系型数据库管理系统(RDBMS)中支持,或者在面向图形的数据库管理系统中,如图 1.2 中的知识图所示。

图 1.1:领域模型的 UML 类图。

USERS TABLE
idfirstNamelastName
.........

表 1.1:在 RDBMS 架构中为 User 实体映射的表格。

AUTHS TABLE

idnameleveluser_fk
............

表 1.2:在 RDBMS 架构中为 Auth 实体映射的表格。

图1.2:与图1.1 的领域模型相关的知识图 。

现在,想象一下,在应用程序的生产生命周期期间出现了一个新的需求:出于管理原因,客户需要将授权限定在特定时间段内(即有效期的开始和结束日期),如图 2.1 所示,将 User 和 Auth 之间的关系转变为 N 对 N。这种领域模型可以通过类似于表 2.1 的架构在关系型数据库管理系统(RDBMS)中支持,或者在面向图形的数据库管理系统中,如图 2.2 中的知识图所示。

图 2.1:在定义新要求后的领域模型 UML 类图。

USERS TABLE

idfirstNamelastName
.........

表 2.1:在 RDBMS 架构中为 User 实体映射的表格。

USERS_AUTHS TABLE

user_fkauth_fkfromuntil
............

表 2.2:在 RDBMS 架构中用于存储 User 和 Auth 实体之间关联的表格。

AUTHS TABLE

idnamelevel
.........

表 2.3:在 RDBMS 架构中为 Auth 实体映射的表格。

图 2.2:与图 2.1 领域模型相关的知识图。

在架构层面上的优势已经很明显:实际上,面向图形的方法没有改变架构,只是在边缘(建模关系)上定义了两个新属性,而 RDBMS 方法则创建了新的关联表 users_auths,替代了 auths 表中引用用户表的外键。

进一步深入分析,我们可以尝试分析 SQL 查询和用 Cypher 查询语言语法编写的查询在这两种方法下的区别:我们想要识别名为“Paul”的用户,他们拥有名为“admin”的 Auth,并且级别大于或等于 3。

一方面,在 SQL 中,所需的查询(分别是第一个查询用于从表 1.1 和表 1.2 检索数据,第二个查询用于表 2.1、表 2.2 和表 2.3)是:

SELECT users.*FROM usersINNER JOIN auths ON users.id = auths.user_fkWHERE users.firstName = 'Paul' AND auths.name = 'admin' AND auths.level >= 3
SELECT users.*FROM usersINNER JOIN users_auths ON users.id = users_auths.user_fkINNER JOIN auths ON auths.id = users_auths.auth_fkWHERE users.firstName = 'Paul' AND auths.name = 'admin' AND auths.level >= 3

另一方面,在Cypher 查询语言中,所需的查询(对于这两种情况) 是:

MATCH (u:User)-[:HAS_AUTH]->(auth:Auth)WHERE u.firstName = 'Paul' AND auth.name = 'admin' AND auth.level >= 3RETURN u

虽然 SQL 查询需要多一个 JOIN 子句,但值得注意的是,在这种特定情况下,不仅用 Cypher 查询语言编写的查询没有额外的子句或 MATCH 路径的变化,而且它也保持不变。后端的“查询系统”上没有必要进行任何更改!

结论 

楔形工程作为国际项目中的技术合作伙伴,设计了一个协作社交平台,作为一个解耦的 Web 应用程序,在 3 层架构中由以下部分组成:

  1. 后端模块,一个分层的 RESTful 架构,利用 JakartaEE 框架; 

  2. 知识图,由 Neo4j 图形数据库提供的 NoSQL; 

  3. 前端模块,一个基于 HTML、CSS 和 JavaScript 的单页应用程序,利用 Angular 框架。 

我们面临的最具挑战性的设计选择是使用原生利用 Cypher 查询语言的驱动程序还是利用 OGM 库简化 DAO 实现:我们发现使用 Cypher 查询语言编写的自定义查询构建整个应用程序既不可行也不可扩展,而 OGM 在处理涉及大量涉及引用外部实体的关系的大型数据层次结构时可能不够高效。

我们最终选择了一种自定义方法,利用 OGM 作为映射节点和边缘的参考解决方案,以 ORM 类型的视角,并支持特定 DAO 的实现,因此通过无法表现良好的自定义查询方法优化了时间上的优化。

总之,我们可以说采用的软件架构很好地响应了知识图模式的变化,并完全满足了客户需求,同时减轻了楔形工程开发团队的努力。

然而,在采用这种架构之前,必须考虑一些威胁:

  • SQL 比 Cypher 查询语言更为常见 → 因此,更容易找到(并因此纳入开发团队)能够维护 RDBMS 而不是 Neo4j 图形数据库的代码的专家; 

  • ​Neo4j 的本地生产系统要求很高(即对于基于服务器的环境,至少推荐 8 GB)→ 这种解决方案可能不适合资源有限的场景和低成本实施; 

  • 在我们的最大努力下,我们没有找到任何“随时可以使用且易于使用”的开源编辑器来浏览 Neo4j 图形数据库的数据结构(Neo4j 的官方数据浏览器不允许通过 GUI 进行数据修改,除非自定义 MERGE/CREATE 查询),就像 RDBMS 有很多一样 → 这可能是由于特定的数据模型本身导致的,使得实现数据的表格视图变得困难。

作者:Cosimo Giani

更多技术干货请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

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

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

相关文章

【广州华锐互动】Web3D云展编辑器能为展览行业带来哪些便利?

在数字时代中,传统的展览方式正在被全新的技术和工具所颠覆。其中,最具有革新意义的就是Web3D云展编辑器。这种编辑器以其强大的功能和灵活的应用,正在为展览设计带来革命性的变化。 广州华锐互动开发的Web3D云展编辑器是一种专门用于创建、编…

关于网站的favicon.ico图标的设置需要注意的几点

01-必须在网页的head标签中放上对icon图标的说明语句&#xff1a; 比如下面这样的语句&#xff1a; <link rel"shortcut icon" href"/favicon.ico">否则&#xff0c;浏览器虽然能读到图标&#xff0c;但是不会把图标显示在标签上。 02-为了和本地开…

DHCP、ARP、FTP、DNS、VRRP、STP、报文交互流程

目录 一、DHCP 1、DHCP终结 1、DHCP discover 2、DHCP offer 3、DHCP request 4、DHCP ack 5、DHCP request 6、DHCP 续租 2、DHCP终结 二、ARP 1、ARP类型 动态ARP 静态ARP ARP代理 ARP代理的分类&#xff1a;路由式代理、VLAN内的ARP代理、VLAN间的ARP代理。 6…

【Hadoop】分布式文件系统 HDFS

目录 一、介绍二、HDFS设计原理2.1 HDFS 架构2.2 数据复制复制的实现原理 三、HDFS的特点四、图解HDFS存储原理1. 写过程2. 读过程3. HDFS故障类型和其检测方法故障类型和其检测方法读写故障的处理DataNode 故障处理副本布局策略 一、介绍 HDFS &#xff08;Hadoop Distribute…

electron调用dll问题总汇

通过一天的调试安装&#xff0c;electron调用dll成功&#xff0c;先列出当前的环境&#xff1a;node版本: 18.12.0&#xff0c;32位的&#xff08;因为dll为32位的&#xff09; VS2019 python node-gyp 1、首先要查看报错原因&#xff0c;通常在某一行会有提示&#xff0c;常…

C#常见的设计模式-行为型模式

前言 行为型模式是面向对象设计中的一类设计模式&#xff0c;它关注对象之间的通信和相互作用&#xff0c;以实现特定的行为或功能。在C#中&#xff0c;有许多常见的行为型模式&#xff0c;下面将对其中10种行为型模式进行介绍&#xff0c;并给出相应的代码示例。 目录 前言1.…

什么是网络爬虫技术?它的重要用途有哪些?

网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化的网页浏览程序&#xff0c;能够根据一定的规则和算法&#xff0c;从互联网上抓取和收集数据。网络爬虫技术是随着互联网的发展而逐渐成熟的一种技术&#xff0c;它在搜索引擎、数据挖掘、信息处理等领域发挥着越来越重…

线性分组码的奇偶校验矩阵均匀性分析

回顾信道编解码知识&#xff0c;我们知道信道编码要求编码具有检纠错能力&#xff0c;作为FEC&#xff08;forward error correction&#xff09;前向纠错编码的一类&#xff0c;线性分组码表示校验位与信息位的关系能够线性表示。 在这篇文章中&#xff0c;并不是要讨论信道编…

【古月居《ros入门21讲》学习笔记】09_订阅者Subscriber的编程实现

目录 说明&#xff1a; 1. 话题模型 图示 说明 2. 实现过程&#xff08;C&#xff09; 创建订阅者代码&#xff08;C&#xff09; 配置发布者代码编译规则 编译并运行 编译 运行 3. 实现过程&#xff08;Python&#xff09; 创建订阅者代码&#xff08;Python&…

MYSQL索引使用注意事项

索引使用注意事项&#xff1a; 1.索引列运算 不要在索引列上进行运算操作&#xff0c;否则索引将失效&#xff1b; 2.字符串不加引号 字符串类型使用时&#xff0c;不加引号&#xff0c;否则索引将失效&#xff1b; 3.模糊查询 如果仅仅是尾部模糊匹配&#xff0c;索引将不会失…

WSL中安装的Pycharm如何在Windows的开始菜单中新建图标?或WSL中的Pycharm经常花屏

WSL中安装的Pycharm如何在Windows的开始菜单中新建图标&#xff1f;或WSL中的Pycharm经常花屏 ⚙️1.软件环境⚙️&#x1f50d;2.问题描述&#x1f50d;&#x1f421;3.解决方法&#x1f421;&#x1f914;4.结果预览&#x1f914; ⚙️1.软件环境⚙️ Windows10 教育版64位 W…

【云栖 2023】姜伟华:Hologres Serverless 之路——揭秘弹性计算组

云布道师 本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;姜伟华 | 阿里云计算平台事业部资深技术专家、阿里云实时数仓 Hologres 研发负责人 演讲主题&#xff1a;Hologres Serverless 之路——揭秘弹性计算组 实时化成为…

牛客算法心得——abb(dp)

大家好&#xff0c;我是晴天学长&#xff0c;传智杯的题&#xff0c;我准备写一个题解&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .abb leafee 最近爱上了 abb 型语句&#xff0c;比如“叠词词”、…

【物联网与大数据应用】Hadoop数据处理

Hadoop是目前最成熟的大数据处理技术。Hadoop利用分而治之的思想为大数据提供了一整套解决方案&#xff0c;如分布式文件系统HDFS、分布式计算框架MapReduce、NoSQL数据库HBase、数据仓库工具Hive等。 Hadoop的两个核心解决了数据存储问题&#xff08;HDFS分布式文件系统&#…

【Java学习笔记】75 - 算法优化入门 - 马踏棋盘问题

一、意义 1.算法是程序的灵魂&#xff0c;为什么有些程序可以在海量数据计算时&#xff0c;依然保持高速计算? 2.拿老韩实际工作经历来说&#xff0c;在Unix下开发服务器程序&#xff0c;功能是要支持上千万人同时在线&#xff0c;在上线前&#xff0c; 做内测&#xff0c;一…

常用服务注册中心与发现(Eurake、zookeeper、Nacos)笔记(一)基础概念

基础概念 注册中心 在服务治理框架中&#xff0c;通常都会构建一个注册中心&#xff0c;每个服务单元向注册中心登记自己提供的服务&#xff0c;将主机与端口号、版本号、通信协议等一些附加信息告知注册中心&#xff0c;注册中心按照服务名分类组织服务清单&#xff0c;服务…

OpenGL之Mesa3D编译for Ubuntu20.04(三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

vue3中的Fragment、Teleport、Suspense新组件

Fragment组件 在Vue2中: 组件必须有一个根标签 在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中 好处: 减少标签层级, 减小内存占用 <template><div style"font-size: 14px;"><p> 组件可以没有根标签</p&g…

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训 在当今数字化时代&#xff0c;大数据技术的迅猛发展带来了前所未有的数据增长&#xff0c;同时也催生了对数据安全和网络安全的更为迫切的需求。本篇博客将聚焦于大数据技术背景下的数据安全与网络安全&#xff…

Cascader 级联选择器动态加载数据的回显

如果后端没有只返回第三级的id,而是同时把第三级的名字一起返回了&#xff0c;那么就可以通过下面的方法来实现 1.在级联选择器里面加上这句代码 placeholder"请选择" 2.注册一个字符串 pleasett:"" 3.赋值 如过后端返回的有第三级的选项名 直接进行赋…