SQL查询语句转换成图结构的算法设计与实现

2020-08-31 05:41谢锦霞甘宇健喻光继
机电信息 2020年17期
关键词:转换

谢锦霞 甘宇健 喻光继

摘要:随着深度学习的迅猛发展,图神经网络作为一种强大而实用的工具逐渐被广泛应用于图分析中,且效果显著。与此同时,信息时代对于数据的查询需求越来越大,SQL查询语句在数据查询方面起着非常重要的作用,人们开展了许多关于SQL的相关研究。为此,针对图神经网络的使用特征和用途,设计并实现了一种算法,用于将SQL查询语句转换成图结构,能够利用图神经网络进行SQL查询语句相关方面的研究。

关键词:SQL查询语句;图结构;图神经网络;转换

0 引言

近年来深度学习(Deep Learning,DL)在学术界和工业界发展迅猛[1],除了传统的深度学习方法以外,图神经网络[2](Graph Neural Networks,GNN)也是当前AI领域最为火爆的研究热点之一。图神经网络能够学习到图的结构信息和节点特征,凭借着极好的性能和解释能力被称为“AI新贵”[3],近年来已成为一种广泛应用的图分析方法,同时也是机器学习任务中使用的强大而实用的工具[4]。

随着大数据时代的到来以及互联网的快速发展产生了大量数据[5],关系型数据库作为主流数据库承担着存储数据的重任。结构化查询语言(Structured Query Language),简称SQL,是一种特殊目的的编程语言,用于存取数据以及查询、更新和管理关系型数据库系统[6]。在SQL中用于查询数据的查询语句在关系型数据库中的使用频率最高[7],所以对于SQL查询语句的研究非常重要。若能运用图神经网络对SQL查询语句进行相关研究,充分发挥图神经网络的优越性来研究SQL查询语句,可能会有意想不到的收获。

诚然,图神经网络有着强大的解析能力,能够很好地完成解析任务,而使用图神经网络进行训练需要输入图结构类型数据。针对此问题,本文将设计并实现一种算法,将SQL查询语句转换成图结构的数据表示形式。未来图神经网络有望用于SQL查询语句的各项研究。

1 SQL查询语句的图结构设计

1.1    概念定义

本文先给出SQL子句和节点的定义。SQL子句是从一个特殊关键字开始到下一个特殊关键字(或末尾)的SQL查询语句子串(字符串中的任意个连续的字符组成的序列),特殊关键字包括“SELECT”“FROM”“WHERE”“ORDER”“GROUP”“JOIN”“HAVING”和“LIMIT”。用開始的特殊关键字命名SQL子句,如“SELECT name , age FROM students WHERE age >= 15 and age <= 25”中的“SELECT name , age”称为SELECT子句,“FROM students”称为FROM子句,“WHERE age >= 15 and age <= 25”则称为WHERE子句。

节点是指线相交或分支的点[8],节点与连接节点的线共同构成图。节点有6种类型,分别为:字段、表格、函数、操作符、值、关键字和特殊节点。关键字节点包括SQL子句中开头的特殊关键字和集合操作符(在SQL中通常位于两个查询的中间),有特殊关键字“SELECT”“FROM”“WHERE”等和常用的集合操作符“INTERSECT”“UNION”和“EXCEPT”。特殊节点有QUERY和SubQUERY。

1.2    图结构的设计思路

一条SQL查询语句中出现的字段往往来源于同一张表格或者来源于不同的表格,这些表格间存在某些关联,比如存在主外键关系。所以本文通过表格间接建立字段间的联系,如图1、图2所示。

显然图1中字段1和字段2存在联系,而图2中字段3和字段4也通过表格间接地建立了联系。按照这个方法,当把一条SQL中字段间的联系都标注出来后,就会初步呈现出网状结构。为了更好地描述SQL查询语句,本文设计的网状图由各子句分解而成,网状图中的节点就是表名、字段、函数、值和关键字等。图中各节点均代表着SQL查询语句的组成,并且节点之间的连接都是有迹可寻的。

1.3    网状图的节点及其连接情况

SQL查询语句网状图是一张能够清楚描述SQL查询语句的图,经过转换后形成的网状图中的节点类型有字段、表名、函数、操作符、值、关键字和特殊节点。类型为字段、表名、函数、操作符和关键字的节点都来自于待转换的SQL查询语句中。特殊节点有QUERY节点和SubQUERY节点,QUERY节点是网状图的起始节点,SubQUERY节点是引导子查询的节点。网状图中各节点的后继节点如表1所示。

所有的字段节点都应有其来源的表格作为后继节点,如果字段节点找不到来源表格,它的表格节点可不出现。例如,SELECT * FROM teacher AS T1 JOIN professor AS T2 ON T1.id = T2.Tid,“*”在图中是作为一个字段节点存在的,但它并不是真实存在的字段名称,所以它没有来源的表格,进而就没有表名作为后继节点。另外,每个表名和字段在图中都只出现一次。

除JOIN、FROM和LIMIT子句外,子句在网状图中由对应的开始关键字节点进行引导。JOIN子句和FROM子句的表达方式比较特殊,这两种子句表达在节点间的连线上。JOIN子句在网状图中表示为两个字段相互连接,例如,字段节点col1与col2相互连接,表示连接条件为“T1.col1 = T2.col2”。FROM子句在网状图中表示为QUERY(或SubQUERY)节点与表格节点的连接,例如,SQL中有FROM子句为“FROM concerts AS T1”,在网状图中表示为QUERY节点连接表格节点T1。

1.4    SQL查询语句转换成网状图示例

SQL查询语句转换成网状图的起始节点是QUERY,由各子句共同组成。除FROM和JOIN等有特殊表示方式的子句外,各子句在图中由对应的开始特殊关键字进行引导。有SQL查询语句如下:SELECT T1.l_name FROM Owners AS T1 JOIN Dogs AS T2 ON T1.owner_id = T2.owner_id WHERE T2.age = ( SELECT max(age) FROM Dogs),转换成的网状图如图3所示。

2 算法设计与实现

首先,识别SQL的句型结构,根据识别出来的句型进行模块划分,如子查询模块、主查询模块、集合操作的左边(或右边)查询等。然后,分离各个模块中的子句,包括SELECT子句、WHERE子句和GROUP子句等8种。之后,对各子句中的内容进行处理,例如,SELECT子句有多个列的要进行分离;WHERE子句中有or或者and连接的两个条件的,需要对条件进行分析。最后,获取进行分离处理后的各项内容的字段、表名、函数、操作符、值。完成上述操作之后,结合网状结构图的设计就可以实现将SQL查询语句转换成图结构。

2.1    SQL查询语句的模块划分和子句分离

首先,对SQL查询语句的句型进行识别,识别内容包括是否嵌套查询,若是,判断嵌套的层数;是否进行集合操作,若是,寻找其所在的位置(主查询或子查询)。然后,根据句型进行模块的划分。每个模块从关键字“SELECT”开始,到下一个“SELECT”前结束,可划分为主查询、子查询、集合操作左(右)边部分等模块。最后,分离各模块的子句。分离子句要对SQL查询语句进行切割,切割点为“SELECT”“WHERE”“JOIN”“HAVING”“GROUP BY”“ORDER BY”“LIMIT”等关键字,切割后的子串(字符串中的任意个连续的字符组成的序列)就是SQL查询语句的子句。在模块划分后再进行子句的分离,可以使得各子句在图结构中的表达更加准确。例如,如果待转换的SQL查询语句是嵌套查询,那么经过子句分离处理之后会得到两个SELECT子句,其中一个属于主查询模块,在网状图中表示为SELECT节点连接QUERY节点;另一个属于子查询模块,在网状图中表示为SELECT节点连接SubQUERY节点。

2.2    SQL查询语句子句内容的处理

SQL查询语句中的子句中可能会含有好几项内容,对各子句中的多项内容分开来。在SELECT、GROUP、ORDER子句中可能不止含有一个列,而是含有由“,”隔开的几个列,需要把这些列分开;在WHERE、HAVING、JOIN子句中也有可能不止含有一个条件,而是含有由关键字“AND”或者“OR”隔开的几个条件,需要把这些条件分开。例如,WHERE子句为“WHERE students.age < 20 and sudents.name like ‘%ly”,对这个子句的两项内容分开为“WHERE students.age < 20”和“sudents.name like ‘%ly”。对SQL查询语句各个子句内容进行上述处理,将有利于后续步骤的进行,比如可以通过构造函数来快速、批量获取子句中各项内容的字段、表名、操作符和值等。

2.3    获取字段、表名、函数、值、操作符

对各子句进行处理后,需要获取字段名、字段来源的表、函数、值、操作符。其中操作符包括排序时用到的“DESC”和“ASC”以及查询条件中用到的“IN”“>”“<”“LIKE”和“BETWEEN”等。操作符、函数相对固定,容易获取,直接判断就可以知道函数和操作符的内容。字段来源的表格在语句中也很有特征,只有一个表格的在关键字“FROM”后面可以直接获取,若是有几个表,可以根据关键字“AS”后的重命名和字段前标示的表名进行来源表格的锁定。字段名和值的获取较为繁琐,对不同的子句要采用不同的方法获取,需要根据它们与操作符的相对位置或其所属子句特点来确定方法。比如,SELECT子句中都是字段(可能有函数),可以直接获取;HAVING子句中,操作符的左边是字段(可能有函数),操作符的右边是值,锁定操作符的位置即可获取到对应的字段和值。

3 结语

本文研究了如何将SQL查询语句转换成为网状图,对其算法进行了设计和实现。本文设计的网状图由SQL查询语句转换而成,可以较好地描述SQL查询语句,并且其过程是可逆的,即由该图也能够准确推断出对应的SQL查询语句,这或许能给自然语言生成SQL查询语句的研究提供一种新的思路。另外,图结构的数据也很好地适应图神经网络的运用,这样就可以使用图神经网络进行SQL查询语句的相关研究。同时,也希望它可以帮助其他SQL查询语句相关的研究,能成为其他相关课题研究的辅助工具。

目前,本文所设计的网状图可以表达大多数的SQL查询语句,包括嵌套查询、多表查询、派生表查询等,对于少数特殊句型的SQL查询语句存在不适用的情况。例如,对于JOIN子句中连接条件的操作符不是“=”的句型,目前设计的算法不能表达,但是这种句型较为少见,也不常使用。未来我们将继续完善此项研究,争取可以表达更多的句型。

[参考文献]

[1] GAYATHRI K D,MAMATA R,NGUYEN T D L.Artificial Intelligence Trends for Data Analytics Using Machine Learning and Deep Learning Approaches[M].Boca Raton:CRC Press:2020.

[2] 白铂,刘玉婷,马驰骋,等.图神经网络[J].中国科学(数学),2020,50(3):367-384.

[3] 支付宝技术团队.深度学习之上,图神经网络(GNN)崛起[EB/OL].[2019-08-13].http://blog.itpub.net/69904796/viewspace-2653498/.

[4] 王佳.图神经网络浅析[J].现代计算机,2019(23):58-62.

[5] 中国互联网络信息中心.第44次《中国互联网络发展状况统计报告》[EB/OL].[2019-08-30].http://www.cnnic.net.cn/hlwfzyj/hlwxzbg/hlwtjbg/201908/t20190830_70800.htm.

[6] 百度百科.结构化查询语句[EB/OL].[2020-6-1].https://baike.baidu.com/item/%E7%BB%93%E6%9E%84%E5%8C%96%E6%9F%A5%E8%AF%A2%E8%AF%AD%E8%A8%80/10450182?fromtitle=sql&fromid=86007&fr=aladdin.

[7] 彭學君.SELECT语句在SQL中的应用实例[J].电脑学习,2002(1):38-39.

[8] 百度百科.节点[EB/OL].[2020-06-01].https://baike.baidu.com/item/节点/865052?fr=aladdin.

收稿日期:2020-06-03

作者简介:谢锦霞(1998—),女,广西钦州人,研究方向:电子商务、计算机应用。

甘宇健(1986—),男,广西玉林人,讲师,研究方向:自然语言处理。

喻光继(1968—),男,广西资源人,副教授,副院长,研究方向:电子商务、信息系统及粗糙集理论。

猜你喜欢
转换
初中语文课堂如何做好教师角色的转换
变式教学法在高中数学中的应用
自动温度补偿原理与调节方法
浅议长期股权投资核算方法的转换
对当代书法艺术性的思考
大数据时代档案管理模式的转换与创新
浅谈平面图与立体图的思维培养
高中化学教学中研究性学习的应用探究
“三步法”在球柱处方转环曲面处方中的运用