謝錦霞 甘宇健 喻光繼
摘要:隨著深度學(xué)習(xí)的迅猛發(fā)展,圖神經(jīng)網(wǎng)絡(luò)作為一種強(qiáng)大而實(shí)用的工具逐漸被廣泛應(yīng)用于圖分析中,且效果顯著。與此同時(shí),信息時(shí)代對(duì)于數(shù)據(jù)的查詢需求越來(lái)越大,SQL查詢語(yǔ)句在數(shù)據(jù)查詢方面起著非常重要的作用,人們開(kāi)展了許多關(guān)于SQL的相關(guān)研究。為此,針對(duì)圖神經(jīng)網(wǎng)絡(luò)的使用特征和用途,設(shè)計(jì)并實(shí)現(xiàn)了一種算法,用于將SQL查詢語(yǔ)句轉(zhuǎn)換成圖結(jié)構(gòu),能夠利用圖神經(jīng)網(wǎng)絡(luò)進(jìn)行SQL查詢語(yǔ)句相關(guān)方面的研究。
關(guān)鍵詞:SQL查詢語(yǔ)句;圖結(jié)構(gòu);圖神經(jīng)網(wǎng)絡(luò);轉(zhuǎn)換
0 引言
近年來(lái)深度學(xué)習(xí)(Deep Learning,DL)在學(xué)術(shù)界和工業(yè)界發(fā)展迅猛[1],除了傳統(tǒng)的深度學(xué)習(xí)方法以外,圖神經(jīng)網(wǎng)絡(luò)[2](Graph Neural Networks,GNN)也是當(dāng)前AI領(lǐng)域最為火爆的研究熱點(diǎn)之一。圖神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí)到圖的結(jié)構(gòu)信息和節(jié)點(diǎn)特征,憑借著極好的性能和解釋能力被稱為“AI新貴”[3],近年來(lái)已成為一種廣泛應(yīng)用的圖分析方法,同時(shí)也是機(jī)器學(xué)習(xí)任務(wù)中使用的強(qiáng)大而實(shí)用的工具[4]。
隨著大數(shù)據(jù)時(shí)代的到來(lái)以及互聯(lián)網(wǎng)的快速發(fā)展產(chǎn)生了大量數(shù)據(jù)[5],關(guān)系型數(shù)據(jù)庫(kù)作為主流數(shù)據(jù)庫(kù)承擔(dān)著存儲(chǔ)數(shù)據(jù)的重任。結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language),簡(jiǎn)稱SQL,是一種特殊目的的編程語(yǔ)言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)[6]。在SQL中用于查詢數(shù)據(jù)的查詢語(yǔ)句在關(guān)系型數(shù)據(jù)庫(kù)中的使用頻率最高[7],所以對(duì)于SQL查詢語(yǔ)句的研究非常重要。若能運(yùn)用圖神經(jīng)網(wǎng)絡(luò)對(duì)SQL查詢語(yǔ)句進(jìn)行相關(guān)研究,充分發(fā)揮圖神經(jīng)網(wǎng)絡(luò)的優(yōu)越性來(lái)研究SQL查詢語(yǔ)句,可能會(huì)有意想不到的收獲。
誠(chéng)然,圖神經(jīng)網(wǎng)絡(luò)有著強(qiáng)大的解析能力,能夠很好地完成解析任務(wù),而使用圖神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練需要輸入圖結(jié)構(gòu)類型數(shù)據(jù)。針對(duì)此問(wèn)題,本文將設(shè)計(jì)并實(shí)現(xiàn)一種算法,將SQL查詢語(yǔ)句轉(zhuǎn)換成圖結(jié)構(gòu)的數(shù)據(jù)表示形式。未來(lái)圖神經(jīng)網(wǎng)絡(luò)有望用于SQL查詢語(yǔ)句的各項(xiàng)研究。
1 SQL查詢語(yǔ)句的圖結(jié)構(gòu)設(shè)計(jì)
1.1? ? 概念定義
本文先給出SQL子句和節(jié)點(diǎn)的定義。SQL子句是從一個(gè)特殊關(guān)鍵字開(kāi)始到下一個(gè)特殊關(guān)鍵字(或末尾)的SQL查詢語(yǔ)句子串(字符串中的任意個(gè)連續(xù)的字符組成的序列),特殊關(guān)鍵字包括“SELECT”“FROM”“WHERE”“ORDER”“GROUP”“JOIN”“HAVING”和“LIMIT”。用開(kāi)始的特殊關(guān)鍵字命名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子句。
節(jié)點(diǎn)是指線相交或分支的點(diǎn)[8],節(jié)點(diǎn)與連接節(jié)點(diǎn)的線共同構(gòu)成圖。節(jié)點(diǎn)有6種類型,分別為:字段、表格、函數(shù)、操作符、值、關(guān)鍵字和特殊節(jié)點(diǎn)。關(guān)鍵字節(jié)點(diǎn)包括SQL子句中開(kāi)頭的特殊關(guān)鍵字和集合操作符(在SQL中通常位于兩個(gè)查詢的中間),有特殊關(guān)鍵字“SELECT”“FROM”“WHERE”等和常用的集合操作符“INTERSECT”“UNION”和“EXCEPT”。特殊節(jié)點(diǎn)有QUERY和SubQUERY。
1.2? ? 圖結(jié)構(gòu)的設(shè)計(jì)思路
一條SQL查詢語(yǔ)句中出現(xiàn)的字段往往來(lái)源于同一張表格或者來(lái)源于不同的表格,這些表格間存在某些關(guān)聯(lián),比如存在主外鍵關(guān)系。所以本文通過(guò)表格間接建立字段間的聯(lián)系,如圖1、圖2所示。
顯然圖1中字段1和字段2存在聯(lián)系,而圖2中字段3和字段4也通過(guò)表格間接地建立了聯(lián)系。按照這個(gè)方法,當(dāng)把一條SQL中字段間的聯(lián)系都標(biāo)注出來(lái)后,就會(huì)初步呈現(xiàn)出網(wǎng)狀結(jié)構(gòu)。為了更好地描述SQL查詢語(yǔ)句,本文設(shè)計(jì)的網(wǎng)狀圖由各子句分解而成,網(wǎng)狀圖中的節(jié)點(diǎn)就是表名、字段、函數(shù)、值和關(guān)鍵字等。圖中各節(jié)點(diǎn)均代表著SQL查詢語(yǔ)句的組成,并且節(jié)點(diǎn)之間的連接都是有跡可尋的。
1.3? ? 網(wǎng)狀圖的節(jié)點(diǎn)及其連接情況
SQL查詢語(yǔ)句網(wǎng)狀圖是一張能夠清楚描述SQL查詢語(yǔ)句的圖,經(jīng)過(guò)轉(zhuǎn)換后形成的網(wǎng)狀圖中的節(jié)點(diǎn)類型有字段、表名、函數(shù)、操作符、值、關(guān)鍵字和特殊節(jié)點(diǎn)。類型為字段、表名、函數(shù)、操作符和關(guān)鍵字的節(jié)點(diǎn)都來(lái)自于待轉(zhuǎn)換的SQL查詢語(yǔ)句中。特殊節(jié)點(diǎn)有QUERY節(jié)點(diǎn)和SubQUERY節(jié)點(diǎn),QUERY節(jié)點(diǎn)是網(wǎng)狀圖的起始節(jié)點(diǎn),SubQUERY節(jié)點(diǎn)是引導(dǎo)子查詢的節(jié)點(diǎn)。網(wǎng)狀圖中各節(jié)點(diǎn)的后繼節(jié)點(diǎn)如表1所示。
所有的字段節(jié)點(diǎn)都應(yīng)有其來(lái)源的表格作為后繼節(jié)點(diǎn),如果字段節(jié)點(diǎn)找不到來(lái)源表格,它的表格節(jié)點(diǎn)可不出現(xiàn)。例如,SELECT * FROM teacher AS T1 JOIN professor AS T2 ON T1.id = T2.Tid,“*”在圖中是作為一個(gè)字段節(jié)點(diǎn)存在的,但它并不是真實(shí)存在的字段名稱,所以它沒(méi)有來(lái)源的表格,進(jìn)而就沒(méi)有表名作為后繼節(jié)點(diǎn)。另外,每個(gè)表名和字段在圖中都只出現(xiàn)一次。
除JOIN、FROM和LIMIT子句外,子句在網(wǎng)狀圖中由對(duì)應(yīng)的開(kāi)始關(guān)鍵字節(jié)點(diǎn)進(jìn)行引導(dǎo)。JOIN子句和FROM子句的表達(dá)方式比較特殊,這兩種子句表達(dá)在節(jié)點(diǎn)間的連線上。JOIN子句在網(wǎng)狀圖中表示為兩個(gè)字段相互連接,例如,字段節(jié)點(diǎn)col1與col2相互連接,表示連接條件為“T1.col1 = T2.col2”。FROM子句在網(wǎng)狀圖中表示為QUERY(或SubQUERY)節(jié)點(diǎn)與表格節(jié)點(diǎn)的連接,例如,SQL中有FROM子句為“FROM concerts AS T1”,在網(wǎng)狀圖中表示為QUERY節(jié)點(diǎn)連接表格節(jié)點(diǎn)T1。
1.4? ? SQL查詢語(yǔ)句轉(zhuǎn)換成網(wǎng)狀圖示例
SQL查詢語(yǔ)句轉(zhuǎn)換成網(wǎng)狀圖的起始節(jié)點(diǎn)是QUERY,由各子句共同組成。除FROM和JOIN等有特殊表示方式的子句外,各子句在圖中由對(duì)應(yīng)的開(kāi)始特殊關(guān)鍵字進(jìn)行引導(dǎo)。有SQL查詢語(yǔ)句如下: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),轉(zhuǎn)換成的網(wǎng)狀圖如圖3所示。
2 算法設(shè)計(jì)與實(shí)現(xiàn)
首先,識(shí)別SQL的句型結(jié)構(gòu),根據(jù)識(shí)別出來(lái)的句型進(jìn)行模塊劃分,如子查詢模塊、主查詢模塊、集合操作的左邊(或右邊)查詢等。然后,分離各個(gè)模塊中的子句,包括SELECT子句、WHERE子句和GROUP子句等8種。之后,對(duì)各子句中的內(nèi)容進(jìn)行處理,例如,SELECT子句有多個(gè)列的要進(jìn)行分離;WHERE子句中有or或者and連接的兩個(gè)條件的,需要對(duì)條件進(jìn)行分析。最后,獲取進(jìn)行分離處理后的各項(xiàng)內(nèi)容的字段、表名、函數(shù)、操作符、值。完成上述操作之后,結(jié)合網(wǎng)狀結(jié)構(gòu)圖的設(shè)計(jì)就可以實(shí)現(xiàn)將SQL查詢語(yǔ)句轉(zhuǎn)換成圖結(jié)構(gòu)。
2.1? ? SQL查詢語(yǔ)句的模塊劃分和子句分離
首先,對(duì)SQL查詢語(yǔ)句的句型進(jìn)行識(shí)別,識(shí)別內(nèi)容包括是否嵌套查詢,若是,判斷嵌套的層數(shù);是否進(jìn)行集合操作,若是,尋找其所在的位置(主查詢或子查詢)。然后,根據(jù)句型進(jìn)行模塊的劃分。每個(gè)模塊從關(guān)鍵字“SELECT”開(kāi)始,到下一個(gè)“SELECT”前結(jié)束,可劃分為主查詢、子查詢、集合操作左(右)邊部分等模塊。最后,分離各模塊的子句。分離子句要對(duì)SQL查詢語(yǔ)句進(jìn)行切割,切割點(diǎn)為“SELECT”“WHERE”“JOIN”“HAVING”“GROUP BY”“ORDER BY”“LIMIT”等關(guān)鍵字,切割后的子串(字符串中的任意個(gè)連續(xù)的字符組成的序列)就是SQL查詢語(yǔ)句的子句。在模塊劃分后再進(jìn)行子句的分離,可以使得各子句在圖結(jié)構(gòu)中的表達(dá)更加準(zhǔn)確。例如,如果待轉(zhuǎn)換的SQL查詢語(yǔ)句是嵌套查詢,那么經(jīng)過(guò)子句分離處理之后會(huì)得到兩個(gè)SELECT子句,其中一個(gè)屬于主查詢模塊,在網(wǎng)狀圖中表示為SELECT節(jié)點(diǎn)連接QUERY節(jié)點(diǎn);另一個(gè)屬于子查詢模塊,在網(wǎng)狀圖中表示為SELECT節(jié)點(diǎn)連接SubQUERY節(jié)點(diǎn)。
2.2? ? SQL查詢語(yǔ)句子句內(nèi)容的處理
SQL查詢語(yǔ)句中的子句中可能會(huì)含有好幾項(xiàng)內(nèi)容,對(duì)各子句中的多項(xiàng)內(nèi)容分開(kāi)來(lái)。在SELECT、GROUP、ORDER子句中可能不止含有一個(gè)列,而是含有由“,”隔開(kāi)的幾個(gè)列,需要把這些列分開(kāi);在WHERE、HAVING、JOIN子句中也有可能不止含有一個(gè)條件,而是含有由關(guān)鍵字“AND”或者“OR”隔開(kāi)的幾個(gè)條件,需要把這些條件分開(kāi)。例如,WHERE子句為“WHERE students.age < 20 and sudents.name like ‘%ly”,對(duì)這個(gè)子句的兩項(xiàng)內(nèi)容分開(kāi)為“WHERE students.age < 20”和“sudents.name like ‘%ly”。對(duì)SQL查詢語(yǔ)句各個(gè)子句內(nèi)容進(jìn)行上述處理,將有利于后續(xù)步驟的進(jìn)行,比如可以通過(guò)構(gòu)造函數(shù)來(lái)快速、批量獲取子句中各項(xiàng)內(nèi)容的字段、表名、操作符和值等。
2.3? ? 獲取字段、表名、函數(shù)、值、操作符
對(duì)各子句進(jìn)行處理后,需要獲取字段名、字段來(lái)源的表、函數(shù)、值、操作符。其中操作符包括排序時(shí)用到的“DESC”和“ASC”以及查詢條件中用到的“IN”“>”“<”“LIKE”和“BETWEEN”等。操作符、函數(shù)相對(duì)固定,容易獲取,直接判斷就可以知道函數(shù)和操作符的內(nèi)容。字段來(lái)源的表格在語(yǔ)句中也很有特征,只有一個(gè)表格的在關(guān)鍵字“FROM”后面可以直接獲取,若是有幾個(gè)表,可以根據(jù)關(guān)鍵字“AS”后的重命名和字段前標(biāo)示的表名進(jìn)行來(lái)源表格的鎖定。字段名和值的獲取較為繁瑣,對(duì)不同的子句要采用不同的方法獲取,需要根據(jù)它們與操作符的相對(duì)位置或其所屬子句特點(diǎn)來(lái)確定方法。比如,SELECT子句中都是字段(可能有函數(shù)),可以直接獲取;HAVING子句中,操作符的左邊是字段(可能有函數(shù)),操作符的右邊是值,鎖定操作符的位置即可獲取到對(duì)應(yīng)的字段和值。
3 結(jié)語(yǔ)
本文研究了如何將SQL查詢語(yǔ)句轉(zhuǎn)換成為網(wǎng)狀圖,對(duì)其算法進(jìn)行了設(shè)計(jì)和實(shí)現(xiàn)。本文設(shè)計(jì)的網(wǎng)狀圖由SQL查詢語(yǔ)句轉(zhuǎn)換而成,可以較好地描述SQL查詢語(yǔ)句,并且其過(guò)程是可逆的,即由該圖也能夠準(zhǔn)確推斷出對(duì)應(yīng)的SQL查詢語(yǔ)句,這或許能給自然語(yǔ)言生成SQL查詢語(yǔ)句的研究提供一種新的思路。另外,圖結(jié)構(gòu)的數(shù)據(jù)也很好地適應(yīng)圖神經(jīng)網(wǎng)絡(luò)的運(yùn)用,這樣就可以使用圖神經(jīng)網(wǎng)絡(luò)進(jìn)行SQL查詢語(yǔ)句的相關(guān)研究。同時(shí),也希望它可以幫助其他SQL查詢語(yǔ)句相關(guān)的研究,能成為其他相關(guān)課題研究的輔助工具。
目前,本文所設(shè)計(jì)的網(wǎng)狀圖可以表達(dá)大多數(shù)的SQL查詢語(yǔ)句,包括嵌套查詢、多表查詢、派生表查詢等,對(duì)于少數(shù)特殊句型的SQL查詢語(yǔ)句存在不適用的情況。例如,對(duì)于JOIN子句中連接條件的操作符不是“=”的句型,目前設(shè)計(jì)的算法不能表達(dá),但是這種句型較為少見(jiàn),也不常使用。未來(lái)我們將繼續(xù)完善此項(xiàng)研究,爭(zhēng)取可以表達(dá)更多的句型。
[參考文獻(xiàn)]
[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īng)網(wǎng)絡(luò)[J].中國(guó)科學(xué)(數(shù)學(xué)),2020,50(3):367-384.
[3] 支付寶技術(shù)團(tuán)隊(duì).深度學(xué)習(xí)之上,圖神經(jīng)網(wǎng)絡(luò)(GNN)崛起[EB/OL].[2019-08-13].http://blog.itpub.net/69904796/viewspace-2653498/.
[4] 王佳.圖神經(jīng)網(wǎng)絡(luò)淺析[J].現(xiàn)代計(jì)算機(jī),2019(23):58-62.
[5] 中國(guó)互聯(lián)網(wǎng)絡(luò)信息中心.第44次《中國(guó)互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告》[EB/OL].[2019-08-30].http://www.cnnic.net.cn/hlwfzyj/hlwxzbg/hlwtjbg/201908/t20190830_70800.htm.
[6] 百度百科.結(jié)構(gòu)化查詢語(yǔ)句[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] 彭學(xué)君.SELECT語(yǔ)句在SQL中的應(yīng)用實(shí)例[J].電腦學(xué)習(xí),2002(1):38-39.
[8] 百度百科.節(jié)點(diǎn)[EB/OL].[2020-06-01].https://baike.baidu.com/item/節(jié)點(diǎn)/865052?fr=aladdin.
收稿日期:2020-06-03
作者簡(jiǎn)介:謝錦霞(1998—),女,廣西欽州人,研究方向:電子商務(wù)、計(jì)算機(jī)應(yīng)用。
甘宇?。?986—),男,廣西玉林人,講師,研究方向:自然語(yǔ)言處理。
喻光繼(1968—),男,廣西資源人,副教授,副院長(zhǎng),研究方向:電子商務(wù)、信息系統(tǒng)及粗糙集理論。