为什么 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,多数据库管理平台(私有云)。

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

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

相关文章

SpringBoot启动流程

SpringBoot启动流程 文章目录 SpringBoot启动流程SpringBoot启动流程 SpringBoot启动流程 视频链接: https://www.bilibili.com/video/BV15b4y1a7yG/?p174&spm_id_frompageDriver&vd_sourcef6debc5a79e3f424f9dde2f13891b158 看李老师讲的吧,特…

WPF实战项目十九(客户端):修改RestSharp的引用

修改HttpRestClient,更新RestSharp到110.2.0,因为106版本和110版本的代码不一样,所以需要修改下代码 using Newtonsoft.Json; using RestSharp; using System; using System.Threading.Tasks; using WPFProjectShared;namespace WPFProject.S…

【C++】STL简介(了解)【STL的概念,STL的历史缘由,STL六大组件、STL的重要性、以及如何学习STL、STL的缺陷的讲解】

这里写自定义目录标题 一、什么是STL二、STL的版本1. 原始版本2. P. J. 版本3. RW版本★ 4. SGI版本 三、STL的六大组件四、STL的重要性五、如何学习STL六、STL的缺陷 一、什么是STL STL ( standard template libaray - 标准模板库 ):是C标准库 的重要组成部分&…

使用栈解决括号匹配问题(详解)

项目结构 项目头文件的代码或截图 头文件代码 #ifndef LINKSTACK_H #define LINKSTACK_H #include <stdio.h> #include <stdlib.h> // 链式栈的节点 typedef struct LINKNODE {struct LINKNODE* next; }LinkNode; // 链式栈 typedef struct LINKSTACK {LinkNode h…

VUE项目启动报错: ERROR Error: error:0308010C:digital envelope routines::unsupported

1.vue项目启动报错&#xff1a; 是因为新版本node造成的 方法&#xff1a;修改 packge.json文件 修改为下图&#xff1a; 添加了如下代码 SET NODE_OPTIONS--openssl-legacy-provider && 就可以正常启动了

element-ui upload组件中将file文件数据转成二进制流数据格式

方法一 handleBeforeUpload (file)const reader new FileReader()reader.readAsArrayBuffer(file)reader.onload async function (theFile) {const binary new Blob([theFile.target.result]) // 转成二进制流数据 即binary数据格式}}方法二 const aBlob new Blob([file],…

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-C

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-C 目录 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-C 需要环境或者解析可以私信 &#xff08;二&#xff09;A 模块基础设施设置/安全加固&#xff08;200 分&…

使用Java语言判断一个数据类型是奇数还是偶数

判断一个数字类型是奇数&#xff0c;还是偶数&#xff0c;只需要引入Scanner类&#xff0c;然后按照数据类型的定义方式进行定义&#xff0c;比较是按照与2进行整除后的结果&#xff1b;如果余数为零&#xff0c;则代表为偶数&#xff0c;否则为奇数。 import java.util.Scann…

ES6 import

这里 import 的文件是项目内自己 export 的对象&#xff0c;并非 package.json 里引用的包。 后者的打包策略和配置有关。 原理&#xff1a;彻底理解JavaScript ES6中的import和export - 知乎

Ruby和HTTParty库下载代码示例

ruby require httparty require nokogiri # 设置服务器 proxy_host "" proxy_port "" # 定义URL url "" # 创建HTTParty对象&#xff0c;并设置服务器 httparty HTTParty.new( :proxy > "#{proxy_host}:#{proxy_port}" ) …

CrapApi 本地部署 windows+Linux部署( maven+tomcat+idea)

目录 一、本章节所用到的资源共享&#xff0c;嫌麻烦的可以直接下载本地配置好运行使用二、idea maven tomcat启动&#xff0c;我的maven和tomcat的配置三、遇到的问题四、项目运行后效果图转载请标明出处&#xff0c;写作不易如果有用请给个赞~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

聚焦数据库Serverless创新,就在2023亚马逊云科技re:Invent

11月28日&#xff0c;亚马逊云科技在其最新的re:Invent 2023大会上宣布了三项重要的serverless创新&#xff0c;这些创新将极大地简化客户在任何规模上分析和管理数据的能力。以下是这些发布的主要要点总结和分析。 Amazon Aurora Limitless Database的新功能&#xff1a; 功能…

键入网址到网页显示,期间发生了什么?(计算机网络)

一、浏览器首先会对URL进行解析 下面以http://www.server.com/dir1/file1.html为例 当没有路径名时&#xff0c;就代表访问根目录下事先设置的默认文件&#xff0c;也就是 /index.html 或者 /default.html 对URL进行解析之后&#xff0c;浏览器确定了 Web 服务器和文件名&am…

Idea 导入Mysql8.0驱动jar包

库是模块可以依赖的已编译代码的集合。在IntelliJ IDEA中&#xff0c;可以在三个级别上定义库&#xff1a; 全局 &#xff08;可用于许多项目&#xff09;&#xff0c; 项目&#xff08;可用于项目中的所有模块&#xff09;和模块 &#xff08;可用于一个模块&#xff09; 简单…

密码学学习笔记(二十三):哈希函数的安全性质:抗碰撞性,抗第一原象性和抗第二原象性

在密码学中&#xff0c;哈希函数是一种将任意长度的数据映射到固定长度输出的函数&#xff0c;这个输出通常称为哈希值。理想的哈希函数需要具备几个重要的安全性质&#xff0c;以确保数据的完整性和验证数据的来源。这些性质包括抗碰撞性、抗第一原象性和抗第二原象性。 抗碰…

LeedCode刷题---双指针问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 双指针简介 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是左右指针。 对撞指针:一般用于顺序结构中&…

【Filament】Filament环境搭建

1 前言 Filament 是一个实时物理渲染引擎&#xff0c;用于 Android、iOS、Linux、macOS、Windows 和 WebGL 平台。该引擎旨在提供高效、实时的图形渲染&#xff0c;并被设计为在 Android 平台上尽可能小而尽可能高效。Filament 支持基于物理的渲染&#xff08;PBR&#xff09;&…

论文学习-Bert 和GPT 有什么区别?

Foundation Models, Transformers, BERT and GPT 总结一下&#xff1a; Bert 是学习向量表征&#xff0c;让句子中某个词的Embedding关联到句子中其他重要词。最终学习下来&#xff0c;就是词向量的表征。这也是为什么Bert很容易用到下游任务&#xff0c;在做下游任务的时候&a…

python pyaudio实时读取音频数据并展示波形图

python pyaudio实时读取音频数据并展示波形图 下面代码可以驱动电脑接受声音数据&#xff0c;并实时展示音波图&#xff1a; import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import pyaudio import wave import os import op…

【改进YOLOV8】融合动态蛇形卷积&DCNV2的草莓分级分割分割系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着计算机视觉技术的不断发展&#xff0c;图像分割成为了一个重要的研究领域。图像分割可以将图像中的不同对象或区域进行分离&#xff0c;从而更好地理解图像内…