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