• 沒有找到結果。

SQL 查詢語句產生

第五章 SQL 查詢語句產生與查詢結果摘要

5.1 SQL 查詢語句產生

SQL 基本查詢條件句型是由 SELECT、FROM、WHERE 三個子句組成的。

在此階段,我們必須先處理查詢資料表之間的鍵結關係,再依序將三個子句分別 確立,並且合併成 SQL 查詢語句。之後執行於關聯式資料庫當中執行。此節將會 介紹資料表連結關係及如何完成 SQL 基本查詢條件句型的三個子句。

5.1.1 資料表鍵結關係

在條件組合的處理階段中已確立所要查詢的資料表和查詢條件,但資料表之 間會有外來鍵(foreign key)的關係,必須透過圖形追蹤(Graph Traversal)的概念找出

資料表之間的鍵結關係。

關聯式資料庫綱目可用圖形表示,圖形中的節點(node)代表資料庫的資料表

(Relation),例如資料表 Person、Paper、Journal 等皆有對應的節點。邊(Edge)代表 資料表和資料表之間的連結關係,例如資料表 Paper 對於資料表 Proceeding、Paper 及 Journal 都有外來鍵的關係,如圖 5.1 所示。我們使用廣度優先搜尋(breadth-first

search)來找出資料表和資料表之間可能的連結路徑,不同的路徑也可視為解釋 (interpretation)查詢關鍵字表達的不同意思。例如依據圖 5.2 的圖形,關鍵字對應 到的兩個資料表為 Person 和 Journal,假設起點設為 Person、終點設為 Journal,

根據廣度優先搜尋策略走訪路徑,就會找出 Person → Paper → Journal,表示某 作者所發表的論文為期刊論文。或是 Person → Book → Paper → Journal,表示 某作者所發表的論文為期刊論文且也發表在專門書籍上。這些不同資料表連結路 徑對應到對於查詢關鍵字不同的解釋。

在可找出多種候選資料表連結路徑情況下,必須透過一個計算分數評斷不同 路徑表示查詢條件語意的可能性分數,以便從中找出最可能表示查詢條件語意的 資料表連結路徑。本研究參考論文[3]所提出的方法加以修改,用來評估一個路徑 表示查詢語意可能性的分數,我們所使用的方法考慮兩個部分:<1>依據查詢關 鍵字在資料表中的出現頻率特徵。其特徵又可細分成三個部份:(1)該屬性值出現 在該資料表對應欄位中的資料筆數、(2)該屬性值出現在該資料表中的資料筆數、

(3)該屬性值的長度。運用資訊檢索中以字詞的 TF-IDF 代表其在文章中重要性的

概念,若字詞在對應欄位及該資料表中出現的頻率高,表示該字詞較可能是針對 該資料表指定的查詢條件,因此包含該資料表的資料表連結路徑應該得到比較高 的分數。<2>資料表連結圖形結構的大小及緊密度。資料表連結路徑圖形範圍小,

連結緊密度高,表示資料表間的關係程度比較高,因此比較可能是查詢關鍵字想 表示的查詢語意。最後我們會選擇候選資料表連結路徑最高分的當作所搜尋的資 料表之間的連結關係。

不同資料表連結路徑,這些資料表連結路徑對應到對查詢關鍵字不同的解釋。

在不同路徑的解釋中,最後在 WHERE 子句產生階段會選擇最適當路徑作為 join 條件的組合,SQL 查詢語句才得以完成。

圖 5.1 資料庫綱目依據圖形表示範例

5.1.2 SQL 語句產生

<1> SELECT 子句

SELECT 子句是描述要取得哪些欄位資料。在查詢關鍵字中若有無法組成一 個(a-v pair)這種格式的查詢條件單位,只有對應到屬性欄位,那我們就會猜測此 關鍵字是使用者透漏想要搜尋的資料型態資訊,例如:查詢關鍵字{car blue and 2

doors Honda},car 只對應到資料表,而無法組成一個(a-v pair)查詢條件單位,因 此我們會把 car 視為使用者所要搜尋的欄位資訊,在查詢關鍵字分解的處理階段 中會標記成 Target,其欄位會被並列在 SELECT 子句中。若查詢關鍵字中沒有

Target 的標記提示,查詢條件單位都是完整組合而成,則系統內部處理是取出 FROM 資料表中所有的欄位(例:SELECT *)。在下一階段的查詢結果摘要中,我 們會對每一個欄位做統計資訊的運算分析,以便於挑選出適合摘要的屬性欄位。

表 5.1 查詢關鍵字中有僅為屬性名稱範例

Keyword

Query car blue and 2 doors Honda a-v pairs

format Target <color, blue> <door , 2> <model, Honda>

<2> FROM 子句

FROM 子句是描述資料從資料庫的哪些資料表取得。在查詢拆解階段的步驟 -查詢字前處理,有建立一個查詢字相關資訊的表格,記錄著每一個查詢關鍵字 所對應到的類型,以及該查詢關鍵字是屬於哪一個資料表及哪一個屬性欄位。可

得知哪些資料表該被列在 FROM 子句中。除此之外,在處理資料表之間鏈結關係

在 SELECT、FROM、WHERE 三組子句依序完成後,就可組合成為我們所 產生的 SQL 查詢語句,如圖 5.2。即可於關聯式資料庫執行。

 Query:

George cinematographer year > 2008 or Julia actress year > 2010

 SQL Format:

SELECT *

FROM Role , Person , Movie , Cast

WHERE ( (Role.id = Cast.roleId) and (Person.id = Cast.personId) and (Movie.id = Cast.movieID) ) and

( ( ( (Person.name like '%george%') and (Role.role like '%cinematographer%') )and (Movie.year > 2008) ) ) or

( ( ( (Person.name like '%Julia%') and (Role.role like '%actress%' ) ) and (Movie.year > 2010) ) ) )

圖 5.2 產生的 SQL 查詢語句結果範例