謝錦霞 甘宇健 喻光繼



摘要:隨著深度學習的迅猛發展,圖神經網絡作為一種強大而實用的工具逐漸被廣泛應用于圖分析中,且效果顯著。與此同時,信息時代對于數據的查詢需求越來越大,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—),男,廣西資源人,副教授,副院長,研究方向:電子商務、信息系統及粗糙集理論。