这篇文章主要讲解了“SQL和nGQL区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL和nGQL区别有哪些”吧!

SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言,这种语言是一种特定目的编程语言,用于管理关系数据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。

nGQL 是一种类 SQL 的声明型的文本查询语言,相比于 SQL, nGQL 为可扩展、支持图遍历、模式匹配、分布式事务(开发中)的图数据库查询语言。

概念对比对比项SQLnGQL点\点边\边点类型\tag边类型\edge type点 ID主键vid边 ID复合主键起点、终点、rank列列点或边的属性行行点或边语法对比数据定义语言 (DDL)

数据定义语言(DDL)用于创建或修改数据库的结构,也就是 schema。

索引对比项SQLnGQL创建索引CREATE INDEXCREATE {TAG | EDGE} INDEX删除索引DROP INDEXDROP {TAG | EDGE} INDEX列出索引SHOW INDEX FROMSHOW {TAG | EDGE} INDEXES重构索引ANALYZE TABLEREBUILD {TAG | EDGE} INDEX <index_name> [OFFLINE]数据操作语言(DML)

数据操作语言(DML)用于操作数据库中的数据。

数据查询语言(DQL)

数据查询语言(DQL)语句用于执行数据查询。本节说明如何使用 SQL 语句和 nGQL 语句查询数据。

SELECT[DISTINCT]select_expr[,select_expr]...[FROMtable_references][WHEREwhere_condition][GROUPBY{col_name|expr|position}][HAVINGwhere_condition][ORDERBY{col_name|expr|position}[ASC|DESC]]

GO[[<M>TO]<N>STEPS]FROM<node_list>OVER<edge_type_list>[REVERSELY][BIDIRECT][WHEREwhere_condition][YIELD[DISTINCT]<return_list>][|ORDERBY<expression>[ASC|DESC]][|LIMIT[<offset_value>,]<number_rows>][|GROUPBY{col_name|expr|position}YIELD<col_name>]<node_list>|<vid>[,<vid>...]|$-.id<edge_type_list>edge_type[,edge_type...]<return_list><col_name>[AS<col_alias>][,<col_name>[AS<col_alias>]...]数据控制语言(DCL)

数据控制语言(DCL)包含诸如 GRANTREVOKE 之类的命令,这些命令主要用来处理数据库系统的权限、其他控件。

对比项SQLnGQL创建用户CREATE USERCREATE USER删除用户DROP USERDROP USER更改密码SET PASSWORDCHANGE PASSWORD授予权限GRANT <priv_type> ON [object_type] TO <user>GRANT ROLE <role_type> ON <space> TO <user>删除权限REVOKE <priv_type> ON [object_type] TO <user>REVOKE ROLE <role_type> ON <space> FROM <user>数据模型

查询语句基于以下数据模型:

RDBMS 关系结构图

Nebula Graph 最小模型图

本文将使用 NBA 数据集。该数据集包含两种类型的点,也就是两个标签,即 playerteam ;两种类型的边,分别是 servefollow

在关系型数据管理系统中(RDBMS)中,我们用表来表示点以及与点相关的边(连接表)。因此,我们创建了以下表格:playerteamservefollow。在 Nebula Graph 中,基本数据单位是顶点和边。两者都可以拥有属性,相当于 RDBMS 中的属性。

在 Nebula Graph 中,点之间的关系由边表示。每条边都有一种类型,在 NBA 数据集中,我们使用边类型 servefollow 来区分两种类型的边。

示例数据在 RDBMS 插入数据

首先,让我们看看如何在 RDBMS 中插入数据。我们先创建一些表,然后为这些表插入数据。

CREATETABLEplayer(idINT,nameVARCHAR(100),ageINT);CREATETABLEteam(idINT,nameVARCHAR(100));CREATETABLEserve(player_idINT,team_idINT,start_yearINT,end_yearINT);CREATETABLEfollow(player_id1INT,player_id2INT,degreeINT);

然后插入数据。

INSERTINTOplayerVALUES(100,'TimDuncan',42),(101,'TonyParker',36),(102,'LaMarcusAldridge',33),(103,'RudyGay',32),(104,'MarcoBelinelli',32),(105,'DannyGreen',31),(106,'KyleAnderson',25),(107,'AronBaynes',32),(108,'BorisDiaw',36),(109,'TiagoSplitter',34),(110,'CoryJoseph',27);INSERTINTOteamVALUES(200,'Warriors'),(201,'Nuggets'),(202,'Rockets'),(203,'Trail'),(204,'Spurs'),(205,'Thunders'),(206,'Jazz'),(207,'Clippers'),(208,'Kings');INSERTINTOserveVALUES(100,200,1997,2016),(101,200,1999,2010),(102,200,2001,2005),(106,200,2000,2011),(107,200,2001,2009),(103,201,1999,2018),(104,201,2006,2015),(107,201,2007,2010),(108,201,2010,2016),(109,201,2011,2015),(105,202,2015,2019),(109,202,2017,2019),(110,202,2007,2009);INSERTINTOfollowVALUES(100,101,95),(100,102,91),(100,106,90),(101,100,95),(101,102,91),(102,101,75),(103,102,70),(104,103,50),(104,105,60),(105,104,83),(105,110,87),(106,100,88),(106,107,81),(107,106,92),(107,108,97),(108,109,95),(109,110,78),(110,109,72),(110,105,85);在 Nebula Graph 插入数据

在 Nebula Graph 中插入数据与上述类似。首先,我们需要定义好数据结构,也就是创建好 schema。然后可以选择手动或使用 Nebula Graph Studio (Nebula Graph 的可视化工具)导入数据。这里我们手动添加数据。

在下方的 INSERT 插入语句中,我们向图空间 NBA 插入了球员数据(这和在 MySQL 中插入数据类似)。

INSERTVERTEXplayer(name,age)VALUES100:('TimDuncan',42),101:('TonyParker',36),102:('LaMarcusAldridge',33),103:('RudyGay',32),104:('MarcoBelinelli',32),105:('DannyGreen',31),106:('KyleAnderson',25),107:('AronBaynes',32),108:('BorisDiaw',36),109:('TiagoSplitter',34),110:('CoryJoseph',27);

考虑到篇幅限制,此处我们将跳过插入球队和边的重复步骤。你可以点击此处下载示例数据亲自尝试。

增删改查(CRUD)

本节介绍如何使用 SQL 和 nGQL 语句创建(C)、读取(R)、更新(U)和删除(D)数据。

插入数据

mysql>INSERTINTOplayerVALUES(100,'TimDuncan',42);nebula>INSERTVERTEXplayer(name,age)VALUES100:('TimDuncan',42);查询数据

查找 ID 为 100 的球员并返回其 name 属性:

mysql>SELECTplayer.nameFROMplayerWHEREplayer.id=100;nebula>FETCHPROPONplayer100YIELDplayer.name;更新数据

mysql>UPDATEplayerSETname='Tim';nebula>UPDATEVERTEX100SETplayer.name="Tim";删除数据

mysql>DELETEFROMplayerWHEREname='Tim';nebula>DELETEVERTEX121;nebula>DELETEEDGEfollow100->200;建立索引

返回年龄超过 36 岁的球员。

SELECTplayer.nameFROMplayerWHEREplayer.age<36;

使用 nGQL 查询有些不同,因为您必须在过滤属性之前创建索引。更多信息请参见 索引文档。

CREATETAGINDEXplayer_ageONplayer(age);REBUILDTAGINDEXplayer_ageOFFLINE;LOOKUPONplayerWHEREplayer.age<36;示例查询

本节提供一些示例查询供您参考。

示例 1

在表 player 中查询 ID 为 100 的球员并返回其 name 属性。

SELECTplayer.nameFROMplayerWHEREplayer.id=100;

接下来使用 Nebula Graph 查找 ID 为 100 的球员并返回其 name 属性。

FETCHPROPONplayer100YIELDplayer.name;

Nebula Graph 使用 FETCH 关键字获取特定点或边的属性。本例中,属性即为点 100 的名称。nGQL 中的 YIELD 关键字相当于 SQL 中的 SELECT

示例 2

查找球员 Tim Duncan 并返回他效力的所有球队。

SELECTa.id,a.name,c.nameFROMplayeraJOINservebONa.id=b.player_idJOINteamcONc.id=b.team_idWHEREa.name='TimDuncan'

使用如下 nGQL 语句完成相同操作:

CREATETAGINDEXplayer_nameONplayer(name);REBUILDTAGINDEXplayer_nameOFFLINE;LOOKUPONplayerWHEREplayer.name=='TimDuncan'YIELDplayer.nameASname|GOFROM$-.VertexIDOVERserveYIELD$-.name,$$.team.name;

这里需要注意一下,在 nGQL 中的等于操作采用的是 C 语言风格的 ==,而不是SQL风格的 =

示例 3

以下查询略复杂,现在我们来查询球员 Tim Duncan 的队友。

SELECTa.id,a.name,c.nameFROMplayeraJOINservebONa.id=b.player_idJOINteamcONc.id=b.team_idWHEREc.nameIN(SELECTc.nameFROMplayeraJOINservebONa.id=b.player_idJOINteamcONc.id=b.team_idWHEREa.name='TimDuncan')

nGQL 则使用管道将前一个子句的结果作为下一个子句的输入。

GOFROM100OVERserveYIELDserve._dstASTeam|GOFROM$-.TeamOVERserveREVERSELYYIELD$$.player.name;

感谢各位的阅读,以上就是“SQL和nGQL区别有哪些”的内容了,经过本文的学习后,相信大家对SQL和nGQL区别有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!