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

为什么 SQL 不适合图数据库

背景

“为什么你们的图形产品不支持 SQL 或类似 SQL 的查询语言?”

过去,我们的一些客户经常问这个问题,但随着时间的推移,这个问题变得越来越少。

尽管一度被忽视,但图数据库拥有无缝设计并适应其底层数据结构的查询语言的必要性已被创新产品所明确证明并受到市场的欢迎。图数据库在数据模型、数据存储、性能等方面与关系数据库存在显著差异,适合不同的应用场景和业务目标。这些区别表明SQL不适合用作本机图计算引擎的查询语言。

为了进行更全面的比较,我们将演示针对存储在 SQL Server 中的表格数据集的 SQL 查询,以及在 UQL 中编写的等效查询,以针对加载到 Ultipa 中的相同内容的图形数据集运行。这两个数据集在另一篇文章《分步指南:如何将表格转换为图形》中进行了分析。

数据集

如果您还没有机会查看它,我们将使用的表格数据集包含来自医院信息管理系统内的六个表的数据:医生、患者、科室、病床、诊断和住院患者。该数据集相对较小,由大约 60 行记录组成。每个表的数据字段概述如下,重点关注它们的互连(从外键指向主键的箭头):

表结构的简洁可视化,强调从外键到主键的 连接。

SQL Server 连接中的分层数据管理结构表示为“数据库表字段”,在 Ultipa 图形系统中可以将其转换为“图形架构属性”。换句话说,Ultipa图系统中的模式对应于关系数据库中的表,模式属性类似于表字段。

图数据集是从上述表格数据集通过将表结构转换为节点模式(具有 _id 等属性)和边模式(具有 _from、_to 等属性)而派生出来的。此过程涉及相当于对原始表进行修改的任务,如下所述:

图片

通过对原始表结构的修改来说明图模型的全面描述

生成的图形数据集包含五个节点模式:DOCTOR、PATIENT、DEPARTMENT、BED 和 ROOM,以及三个边缘模式:DIAGNOSIS、INPATIENT 和 BELONGTO。节点 ID 是从表的主键中提取的,而边的 FROM 和 TO 是从表的外键中导出的,并在必要时进行补充。

表查询与架构查询

鉴于 SQL Server 中表的概念与 Ultipa 中架构的概念相对应,我们首先比较一下 DOCTOR 表和 DOCTOR 节点架构的查询过程。

  • 查询目标:检索每位医生的所有信息。

SQL:

SELECT * FROM guest.DOCTOResult of single-table query using SQL

UQL:

n({@DOCTOR} as N) RETURN N{*}

图片

使用 UQL 的单模式查询结果

尽管两个查询同样清晰并产生相同的结果,但 SQL 类似于请求“从 DOCTOR 表中选择所有数据字段”的英语句子,而 UQL 故意偏离这种基于自然语言的语法,利用符号来传达其执行逻辑,即“n()”,表示图中的节点。

这种方法符合图的本质,其中节点和边是基本组件,这与表作为核心数据模型存在的关系数据库不同。在下一轮中,我们将遇到 UQL 中表示边缘的“e()”。

连接查询与路径查询

图数据通过忠实地复制现实世界的复杂性而赢得赞誉。例如,可以轻松地查询图形数据之间的链式关系(称为路径查询) ,特别是与关系表的JOIN 查询相比。

  • 查询目标:检索Michael Roberts医生治疗过的所有患者的详细信息,包括诊断结果和医生姓名。

SQL:

SELECT      PATIENT.PNO,      PATIENT.PNAME,      PATIENT.PSEX,      DIAGNOSIS.DIAGNOSISRESULT,      DIAGNOSIS.DNAMEFROM      guest.DIAGNOSIS      JOIN guest.PATIENT ON guest.DIAGNOSIS.PNO = guest.PATIENT.PNOWHERE      DNAME = 'James Anderson'

图片

使用SQL进行表JOIN查询的结果

UQL:​​​​​​​

n({@DOCTOR.DNAME == "James Anderson"} AS D)   .e({@DIAGNOSIS} AS A)   .n({@PATIENT } AS P)RETURN table(   P._id,   P.PNAME,   P.PSEX,   A.DIAGNOSISRESULT,   D.DNAME)

图片

使用UQL的路径查询结果

虽然在前面用于查询单个表或模式的代码中可能没有突出强调这一点,但在这些更广泛的代码摘录中出现了一个有趣的观察结果:这两种查询语言的语法表达式是相反的。SQL 首先定义要检索的数据,然后概述数据必须满足的过滤条件。另一方面,UQL 首先描述数据应满足的标准,然后指定要检索的数据。这种语法顺序的颠倒会影响开发人员的思维过程,从而带来不同的编程体验。

图片

语法顺序比较,SQL(左)与 UQL(右)

让我们将焦点转移回数据关系的表示。SQL 使用 JOIN 来链接表,并应用 ON 来锚定关键字段(主键、外键)。相比之下,UQL 采用路径模板 n().e().n() 来系统地定义互连的节点和边,基本上消除了额外锚定步骤的需要。

图片

关系表达式的比较,SQL(左)与 UQL(右)

为什么图查询语言(这里是UQL)能够实现如此精简的表达?这是因为表之间固有的锚定关系,即从外键到主键的链接,无缝嵌入到边缘数据(_from 和 _to)中。这种基本的集成正是图数据库在有效管理关联关系方面优于关系数据库的原因。

此外,UQL 直接将过滤条件合并到每个节点和边声明 n() 和 e() 中,这与 SQL 的 WHERE 子句不同,后者在连接所有表并锚定后添加过滤条件。这种方法使 UQL 语法更加简洁、有凝聚力,并增强了代码的可读性。

UQL巧妙地将每个节点和边缘及其过滤条件整合成一个自然的链状路径模型。

值得强调的是,虽然上面的 SQL 和 UQL 片段长度相似并且产生相同的结果,但它们的实际查询功能从底层来看是不同的。在上面的示例中,SQL 仅完成 PATIENT 和 DIAGNOSIS 两个表之间的连接,从 DIAGNOSIS 表中检索医生的姓名 (DNAME)。相比之下,UQL 在 PATIENT、DIAGNOSIS 和 DOCTOR 之间建立关系,本质上是跨三个表(模式)执行 JOIN。它返回 D.DNAME,这是节点模式 DOCTOR 的属性。了解这些潜在的区别给性能比较增添了讽刺:SQL 查询花费了 3 毫秒,而处理更多数据关联的 UQL 查询只花费了 0.5 毫秒。

从 3 毫秒到 0.5 毫秒的转变可能看起来无关紧要,但随着查询的链式关系数量的增加,它变得非常明显。SQL 中针对 10,000 行的小表的递归 5 表 JOIN 查询将需要 38 秒,而 UQL 中的 5 步路径模板实现的等效查询仅需要 0.001 秒。在更一般的情况下,SQL 在针对大型数据集执行冗长的链表 JOIN 时往往会遇到困难。虽然并发性的低效利用确实造成了这种显著差异,但与 UQL 相比,所有 JOIN 过程中表记录的笛卡尔积是 SQL 查询性能指数级下降的根本原因。

使用图查询的技巧

到目前为止,我们一直以传统的表格格式呈现UQL的查询结果,以便与SQL进行比较。然而,我们强烈建议使用 2D/3D 可视化在小规模图上表示路径查询的结果。这种方法有助于更直观地理解和分析数据。

本文中实现的查询目标表示图中的一步路径。将提供的 UQL 的返回值重新配置到这些路径并执行查询后,Ultipa Manager 中获得的 2D 结果如下所示:​​​​​​​

n({@DOCTOR.DNAME == "James Anderson"})   .e({@DIAGNOSIS})   .n({@PATIENT}) AS p RETURN p{*}

结论

在本文中,我们的目标不是全面展示图查询语言与结构化数据查询语言的不同之处。相反,我们的目标是传达图数据库应该如何从根本上设计其查询语言以及为什么 SQL 可能不适合查询图数据。

代码组合的简单性和针对本机图的查询效率提供了宝贵的见解——也许在处理数据时,我们应该采用更直观、更自然的方法,类似于通过图来理解世界,而不是陷入抽象的数据网络中关系数据库。


作者:Ricky Sun

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

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

irds.cn,多数据库管理平台(私有云)。

相关文章:

为什么 SQL 不适合图数据库

背景 “为什么你们的图形产品不支持 SQL 或类似 SQL 的查询语言?” 过去,我们的一些客户经常问这个问题,但随着时间的推移,这个问题变得越来越少。 尽管一度被忽视,但图数据库拥有无缝设计并适应其底层数据结构的查询…...

【Rust日报】2023-12-02 深度学习框架 Burn 发布 v0.11.0

深度学习框架 Burn 发布 v0.11.0 深度学习框架 Burn 发布 v0.11.0,新版本引入了自动内核融合(Kernel Fusion)功能,大大提升了访存密集型(memory-bound)操作的性能。同时宣布成立 Tracel AI (https://tracel…...

MySQL性能调优-1-实际优化案例

关于SQL优化的思路,一般都是使用执行计划看看是否用到了索引,主要可能有两大类情况: 对业务字段建立了二级联合索引,但是MySQL错误地觉得走主键聚族索引全表扫描效率更高,而没有走二级索引 走二级索引,但…...

JavaScript空值合并运算符

The Nullish Coalescing Operator(空值合并运算符)是一种 JavaScript 的新运算符,用于解决默认值设定中存在的一些问题。它的语法为 ??(两个问号),表示当左侧的操作数为 null 或 undefined 时&#xff0c…...

Spring Boot 集成 spring security 01

一、导入依赖&#xff08;pom.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…...

C 编程中使用字符串

理解字符串&#xff1a; C 中的字符串是使用字符数组来操作的。数组中的每个字符对应字符串的一个元素&#xff0c;字符串的结尾由空字符&#xff08;\0&#xff09;标记。这个空字符至关重要&#xff0c;因为它表示字符串的结尾&#xff0c;并允许函数确定字符串在内存中的结…...

【GD32307E-START】04 使用TinyMaix进行手写数字识别

【GD32307E-START】04 使用TinyMaix进行手写数字识别 参考博客 【GD32F427开发板试用】使用TinyMaix进行手写数字识别 https://blog.csdn.net/weixin_47569031/article/details/129009839 软硬件平台 GD32F307E-START Board开发板GCC Makefile TinyMaix简介 TinyMaix是国…...

qt-C++笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解

qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解 code review! 文章目录 qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解1.示例运行2.event->pos();详解3.event->pos()的坐标系原点4.Qt中的坐标系详解5.QMainWindow::mousePressEvent(event);详解 1.示例…...

小程序开发平台源码系统:搭建新的商业体系 附带完整的搭建教程

小程序开发平台源码系统是在移动互联网快速发展的背景下诞生的。随着微信小程序的普及&#xff0c;越来越多的人开始关注小程序的开发与运营。然而&#xff0c;对于很多初学者和小型企业来说&#xff0c;开发一个小程序需要专业的技术知识和大量的时间投入&#xff0c;这无疑是…...

css3新增的伪类有哪些?

CSS3新增的伪类有&#xff1a; :first-of-type&#xff0c;选择属于其父元素的特定类型的第一个子元素。:last-of-type&#xff0c;选择属于其父元素的特定类型的最后一个子元素。:only-of-type&#xff0c;选择属于其父元素的特定类型的唯一子元素。:only-child&#xff0c;选…...

开源软件license介绍与检测

开源License介绍 通俗来讲&#xff0c;开源许可证就是一种允许软件使用者在一定条件内按照需要自由使用和修改软件及其源代码的的法律条款。借此条款&#xff0c;软件作者可以将这些权利许可给使用者&#xff0c;并告知使用限制。这些许可条款可以由个人、商业公司或非赢利组织…...

【LeeCode】142.环形链表II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数…...

nodejs微信小程序+python+PHP健身房信息管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…...

springboot集成springsecurity

转载自&#xff1a;www.javaman.cn 1、整合springsecurity 添加pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>2、springsecurity认证授权流程…...

脏读、不可重复读、幻读

一、脏读 A事务读取B事务尚未提交的数据&#xff0c;此时如果B事务发生错误并执行回滚操作&#xff0c;那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹&#xff0c;此时由于B事务更改了它&#xff0c;这个数据变得不再纯粹。这个时候A事务立即读取了这个脏…...

思维模型 反馈效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。反馈促进改进。 1 反馈效应的应用 1.1 反馈效应在营销中的应用 1 “可口可乐与百事可乐之战” 在 20 世纪 80 年代&#xff0c;可口可乐公司是全球最大的饮料公司之一&#xff0c;其市场…...

【PyTorch】线性回归

文章目录 1. 模型与代码实现2. Q&A 1. 模型与代码实现 模型 y ^ w 1 x 1 . . . w d x d b w ⊤ x b . \hat{y} w_1 x_1 ... w_d x_d b \mathbf{w}^\top \mathbf{x} b. y^​w1​x1​...wd​xd​bw⊤xb. 代码实现 import torch from torch import nn from to…...

硝烟弥漫的科技战场——GPT之战

没想到2023年的双11之后&#xff0c;还能看到如此多的科技圈大佬针对GPT提出火药味十足的讨论和极具戏剧性的表演。 历史回顾&#xff1a; 11月6日&#xff0c;OpenAI发布会&#xff1a;GPT-4 Turbo模型、GPT应用商店、开源Whisper-large-v3等&#xff1b;11月17日&#xff0…...

re:Invent 构建未来:云计算生成式 AI 诞生科技新局面

文章目录 前言什么是云计算云计算类型亚马逊云科技云计算最多的功能最大的客户和合作伙伴社区最安全最快的创新速度最成熟的运营专业能力 什么是生成式 AI如何使用生成式 AI后记 前言 在科技发展的滚滚浪潮中&#xff0c;我们见证了云计算的崛起和生成式 AI 的突破&#xff0c…...

oneApi实现并⾏排序算法

零、OneApi简介 oneAPI是由英特尔推出的一个开放、统一的编程模型和工具集合&#xff0c;旨在简化跨不同硬件架构的并行计算。oneAPI的目标是提供一个统一的编程模型&#xff0c;使开发人员能够使用相同的代码在不同类型的硬件上进行并行计算&#xff0c;包括CPU、GPU、FPGA和…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...