專利名稱::一種在關(guān)系型數(shù)據(jù)庫中無縫集成純xml查詢引擎的系統(tǒng)的制作方法一種在關(guān)系型數(shù)據(jù)庫中無縫集成純XML查詢引擎的系統(tǒng)
技術(shù)領(lǐng)域:
:本發(fā)明屬于XML數(shù)據(jù)庫管理
技術(shù)領(lǐng)域:
。
背景技術(shù):
:可擴展標記語言XML是W3C組織推薦的一種通用標記語言,它憑借可自描述、擴展性高、半結(jié)構(gòu)化、具有層次結(jié)構(gòu)等特點,已成為Web應(yīng)用程序中表示和交換數(shù)據(jù)的標準格式。隨著XML技術(shù)的不斷發(fā)展和完善以及大量XML文檔的出現(xiàn),如何有效管理大規(guī)模XML文檔數(shù)據(jù),如何對XML文檔進行高效率的查詢已經(jīng)成為當(dāng)前數(shù)據(jù)庫領(lǐng)域中一個亟待解決的問題。當(dāng)前的數(shù)據(jù)庫管理系統(tǒng)主要使用兩種方案來存儲XML文檔。一種方案是在傳統(tǒng)的關(guān)系數(shù)據(jù)庫管理系統(tǒng)的基礎(chǔ)上擴展XML處理功能而形成的"XML使能"數(shù)據(jù)庫,通常采用的方式是將XML數(shù)據(jù)拆分并映射為多張關(guān)系表,試圖用關(guān)系模型模擬XML數(shù)據(jù)的原生存儲。這種方法忽略了XML數(shù)據(jù)模型特有的樹形結(jié)構(gòu),從而導(dǎo)致XML結(jié)構(gòu)語義丟失、XML查詢表達力下降和查詢性能下降等問題;另一種方案是純XML數(shù)據(jù)庫,它以XML數(shù)據(jù)模型為中心,用更加自然的方式管理XML數(shù)據(jù)。純XML數(shù)據(jù)庫系統(tǒng)面臨的最大問題是,必須重新實現(xiàn)關(guān)系數(shù)據(jù)庫已經(jīng)非常成熟的理論和技術(shù),造成大量人力物力的浪費。為了既體現(xiàn)XML數(shù)據(jù)模型,又重用關(guān)系數(shù)據(jù)庫已有的基礎(chǔ)模塊,本發(fā)明提出了一種在關(guān)系型數(shù)據(jù)庫中無縫集成純XML查詢引擎的系統(tǒng)。隨著XML文檔的廣泛應(yīng)用,XML數(shù)據(jù)量急劇增長,用戶迫切地希望通過查詢快速獲取到滿足某些條件的XML數(shù)據(jù)。因此,XML查詢處理成為近幾年數(shù)據(jù)庫領(lǐng)域的一個研究熱點。在研究者們提出的眾多XML查詢語言中,XPath和XQuery脫穎而出,并最終成為W3C的推薦標準。這兩種語言均使用路徑表達式作為在XML數(shù)據(jù)中定位節(jié)點的基本手段,XPath可以作為XML查詢語言單獨使用,XML查詢語言XQuery1.0是XPath2.0的擴展版本,它在XPath的基礎(chǔ)上增加了FLOWR表達式等內(nèi)容,功能更加強大。要支持XML查詢,就要實現(xiàn)這兩種XML標準查詢語言。近年來,在XML結(jié)構(gòu)連接方面,研究者們提出了一系列計算XML結(jié)構(gòu)關(guān)系的連接算法。但是,這些連接算法均假設(shè)XML數(shù)據(jù)存在于DBMS環(huán)境之外。由于沒有索引結(jié)構(gòu)的支持,這些算法只能利用最簡單的倒排表去尋找具有指定標簽的節(jié)點,這種方式成為了結(jié)構(gòu)連接的效率瓶頸。要提高XML查詢操作的執(zhí)行效率,必須將XML數(shù)據(jù)置于數(shù)據(jù)庫管理系統(tǒng)的環(huán)境中,充分設(shè)計并利用各種索引,使XML查詢效率有質(zhì)的飛躍。本發(fā)明針對XML文檔數(shù)據(jù)模型的特點,充分利用了元素索引、值索引和路徑索引,實現(xiàn)了適用于關(guān)系數(shù)據(jù)庫的XPath和XQuery查詢語言的查詢處理方法。
發(fā)明內(nèi)容本發(fā)明的目的是在重用關(guān)系數(shù)據(jù)庫已有模塊的基礎(chǔ)上,體現(xiàn)XML數(shù)據(jù)模型的特點,提供一種在關(guān)系型數(shù)據(jù)庫中無縫集成純XML查詢引擎的系統(tǒng)。本發(fā)明針對XML文檔數(shù)據(jù)模型的特點,設(shè)計了XML文檔在關(guān)系表中的存儲方式,充分利用了元素索引、值索引和路徑索引,設(shè)計并實現(xiàn)了充分利用多種索引結(jié)構(gòu)的XPath和XQuery查詢語言的查詢處理方法。本發(fā)明提供的在關(guān)系型數(shù)據(jù)庫中無縫集成純XML查詢引擎的系統(tǒng)包括1、將XML文檔存入關(guān)系數(shù)據(jù)庫關(guān)系表的模塊1.1、為關(guān)系數(shù)據(jù)庫增加XML類型為體現(xiàn)與關(guān)系數(shù)據(jù)庫的無縫集成,本發(fā)明中以增加XML數(shù)據(jù)類型的方式來體現(xiàn)對XML的支持。聲明為XML類型的字段表示該字段為XML文檔,在插入數(shù)據(jù)的時候會將該字段的內(nèi)容按照XML的方式存儲。XML類型中的兩個關(guān)鍵內(nèi)容為relationID和docID,其中relationID表示存儲該用戶表中所有XML節(jié)點的關(guān)系表的唯一標識,docID用于標識所存儲的XML文檔。XML類型的使用方法與int等內(nèi)置數(shù)據(jù)類型相同。createtableBookstore{BookStoreIDint,BookStoreNamenvarchar(50),BooksSoldxml}上述SQL語句創(chuàng)建了Bookstore表。該表中的BooksSold字段為XML類型,則在創(chuàng)建Bookstore表的同時創(chuàng)建一個XML節(jié)點表XMLTable,XMLTable表的唯一標識記作relationID。1.2、存儲XML文檔向Bookstore表插入數(shù)據(jù)時,插入到BooksSold字段的XML文檔會被分配一個docID,以docID為前綴對每個節(jié)點進行DLN編碼,分析節(jié)點內(nèi)容,將每個節(jié)點存為關(guān)系表中的一個元組。每個節(jié)點由四元組(NodeID,tagname,type,val)表示。其中NodeID為節(jié)點的DLN編碼,是節(jié)點的唯一標識;tagname表示節(jié)點名稱;typeG{Document,Element,Attribute,Value},表示節(jié)點類型;val表示節(jié)點值。1.3、將用戶表中的XML類型字段映射到XmlTable表的方法本發(fā)明提供了一個名為XMLpointer的指針結(jié)構(gòu),該結(jié)構(gòu)將用戶表中XML類型字段映射到存儲XML文檔的關(guān)系表中。XMLpointer結(jié)構(gòu)包含relationID和docID,通過relationID可以查詢到存儲該XML文檔的關(guān)系表,而通過docID可以找到該XML文檔的所有節(jié)點一以該docID為前綴的所有NodeID所對應(yīng)的節(jié)點都隸屬于該XML文檔。2、為XML文檔建立元素索引、值索引及路徑索引的模塊本發(fā)明中,為了加速節(jié)點的獲取速度,在將XML文檔存入關(guān)系表的同時,為XML文檔建立元素索引、值索引、路徑索引。通過各種索引,可以迅速獲得符合要求的節(jié)點集合。需要指出的是,此發(fā)明中出現(xiàn)的索引都是基于XML文檔對應(yīng)的關(guān)系表的相關(guān)內(nèi)容。也就是說,本發(fā)明中的所有索引結(jié)構(gòu)都是利用關(guān)系數(shù)據(jù)庫的索引機制對XML數(shù)據(jù)查詢進行效率改善,這應(yīng)與其它基于原生的XML數(shù)據(jù)索引方法所區(qū)別。2.1、元素索引根據(jù)元素名稱(name)和元素類型(type)獲得符合條件的節(jié)點集合。2.2、值索引根據(jù)元素值(val)獲得查詢條件的節(jié)點集合。2.3、路徑索引路徑索引用于對由多個連續(xù)父子關(guān)系連接的st印進行快速求值,返回符合該路徑的節(jié)點集合。對于XPath路徑表達式/bib/book/author,利用路徑索引可直接查詢到所有符合上述路徑的book節(jié)點集,而不需要每步都進行二元連接操作。3、XML查詢引擎關(guān)系數(shù)據(jù)庫的查詢引擎主要由解析器、分析器和執(zhí)行器三個組件構(gòu)成。我們對關(guān)系數(shù)據(jù)庫查詢引擎的解析器、分析器和執(zhí)行器進行了擴充和重造,使其支持XML查詢。3.1、在關(guān)系數(shù)據(jù)庫SQL查詢語言中無縫集成XQuery的語法形式要實現(xiàn)在關(guān)系數(shù)據(jù)庫中集成XML查詢引擎,就必須考慮如何按照用戶習(xí)慣的關(guān)系數(shù)據(jù)庫的查詢方式來實現(xiàn)對XML查詢的支持,即實現(xiàn)"無縫集成"關(guān)系數(shù)據(jù)庫的查詢引擎。要體現(xiàn)"無縫集成"的特性,就需要在SQL語法中實現(xiàn)XPath/XQuery的內(nèi)嵌式查詢。這項工作需要開發(fā)完整的XQuery語法解析器和語義生成器,并將它們無縫融合到SQL解析器層中。本發(fā)明中,遵照SQL/XML標準,為了體現(xiàn)出"無縫集成"查詢引擎的特性,確定在關(guān)系數(shù)據(jù)庫中進行XML查詢的表達式語法形式selectXmlQuery('/bib/book,,BooksSold)fromBookstorewhereBookStoreID=1其中,XmlQuery為SQL/XML標準中的標準函數(shù),第一個參數(shù)是XQuery或者XPath表達式,第二個參數(shù)為用戶表中XML類型的列。XmlQuery這樣的語法形式遵循SQL/XML標準并符合關(guān)系數(shù)據(jù)庫用戶SQL語言的使用習(xí)慣。在處理表達式的過程中,關(guān)系數(shù)據(jù)庫系統(tǒng)自身的解析模塊能夠?qū)QL表達式進行解析,得到SQL語法樹;XML查詢引擎的解析器對XmlQuery的XML查詢表達式進行解析,將解析得到的語法子樹掛接到關(guān)系查詢語言SQL語法樹的target—list節(jié)點上,這樣,即實現(xiàn)將XML查詢無縫地融合到SQL解析器層中。融合方式如說明書附圖4所示。3.2、解析器將XQuery查詢語句解析為查詢語法樹解析器的功能是處理用戶輸入的字符串形式的查詢語句,并根據(jù)規(guī)定的文法將其轉(zhuǎn)換為相應(yīng)的語法樹供進一步處理。本發(fā)明中的查詢語言解析模塊根據(jù)XPath2.0和XQuery1.0標準,制定了XQuery文法;將根據(jù)XQuery文法生成的語法樹掛接到關(guān)系查詢語言SQL的target—list上。在解析器設(shè)計過程中,添加XmlQuery結(jié)構(gòu)來存儲XmlQuery函數(shù)解析后的內(nèi)容,具體形式如下typedefstructXmlQueryNodeTagtype;Node*xmlqueryParseTree;Node*target;list*stepList;}XmlQuery;其中,xmlqueryParseTree表示XmlQuery函數(shù)第一個參數(shù),存放對解析查詢語言后形成的語法樹結(jié)構(gòu);target表示XmlQuery函數(shù)的第二個參數(shù)即關(guān)系表中的xml列;st印List在解析器階段暫不進行填充。解析器對字符串處理完畢后,返回一棵語法樹,供分析器處理。本發(fā)明根據(jù)XPath2.0和XQuery1.0的標準,解析器中能夠識別出的核心模塊如下(1)基本表達式包括字符、字符串、整數(shù)、浮點數(shù)、布爾值、變量、標識符、關(guān)鍵字、算術(shù)運算符、邏輯運算符、結(jié)點運算符、通配符等。這些基本表達式由詞法分析器分析出來,并將其值與屬性傳遞給文法分析器,根據(jù)上下文判斷其語義。(2)路徑表達式XPath中的路徑表達式是本發(fā)明中解析器的重要分析對象,包括相對定位路徑和絕對定位路徑。每個定位路徑都是由一個或多個定位步組成,每個定位步之間由'7"分開。絕對路徑以'7"開始,從文檔的根結(jié)點開始定位路徑;相對路徑則以某個定位步開始定位路徑。每個定位步由三部分組成①軸值指定了定位步選擇結(jié)點和上下文選擇結(jié)點之間的關(guān)系。根據(jù)W3C的標準,本發(fā)明能夠識別包括前向軸和反向軸在內(nèi)的13種軸值,每種軸值都有一個基本結(jié)點類型。同時,本發(fā)明中的解析器能夠識別定位路徑表達式的縮寫形式。②結(jié)點測試(NodeTest):指定定位步選擇結(jié)點的結(jié)點類型或結(jié)點名。本發(fā)明中的解析器能夠判斷結(jié)點是類型還是名稱測試。類型測試包括text(),判斷是否為文本結(jié)點;comment(),判斷是否為注釋結(jié)點processing-instruction(),判斷是否為處理指令結(jié)點;node()。名稱測試則判斷上下文結(jié)點是否與該名稱相符。③謂詞,使用專有的謂詞表達式來進一步篩選定位步選擇的結(jié)點集合。謂詞位于定位步末端的方括號中,可以是路徑表達式、比較表達式、函數(shù)等。對于上下文結(jié)點中每一個結(jié)點計算謂詞的值,若為假則剔除該結(jié)點。(3)序列表達式序列是XQuery中的一個基本概念,XQuery提供了序列的構(gòu)造、過濾、合并等操作。序列由一個或多個項組成,各項之間用逗號操作符隔開,或是使用范圍表達式,例如(1,2,3)或(1to3)。同時,解析器能夠識別序列的合并(Union或|)、交(intersect)和差(except)操作。[OO54](4)算術(shù)表達式XPath支持數(shù)值運算,本發(fā)明能夠識別加(+)、減(_)、乘(*)、除(div)、取模(mod)運算,在執(zhí)行每個運算前總是把操作數(shù)轉(zhuǎn)化為一個數(shù)字。[OO56](5)比較表達式比較表達式進行兩個值之間的比較。本發(fā)明能夠識別XQuery標準中的3種比較類型——值比較、一般比較和結(jié)點比較。值比較用來比較單個值,使用操作符eq、ne、lt、le、gt、ge;—般比較用來在兩個任意長度的序列間進行比較,使用操作符"="、"!="、"<"、"<="、">"、">=";結(jié)點比較用來在兩個結(jié)點間根據(jù)結(jié)點的id或者文檔序進行比較,使用操作符18、"<<"、">>"。(6)邏輯表達式解析器能夠識別與(and)和或(or)邏輯運算符。例如,對于表達式1<2andnot(3>4),經(jīng)過解析后比較表達式1<2和表達式not(3>4)作為and的兩個子結(jié)點,為重寫器做好準備。[OOSO](7)函數(shù)調(diào)用本發(fā)明為用戶提供了[XQuery1.0andXPath2.0FunctionsandOperators]文檔中的常用函數(shù)調(diào)用。解析器能夠生成函數(shù)結(jié)點,將函數(shù)名及其參數(shù)填入語法樹,供后面處理。內(nèi)置函數(shù)包括結(jié)點集合函數(shù)、字符串函數(shù)、布爾函數(shù)、數(shù)字函數(shù)、上下文函數(shù)等。(8)FLW0R表達式XQuery查詢包含但不僅限于FLW0R表達式。但FLW0R作為XQuery的主體,是XQuery最有特色且最重要的語法。其特點是包含完整的XPath路徑表達式,支持靈活循環(huán)嵌套。每個FLW0R表達式都由一個或多個for子句、一個或多個let子句、一個可選的where子句、一個可選的order子句和一個return子句構(gòu)成。在本發(fā)明的解析器中,F(xiàn)LW0R模塊下有若干子模塊①for子句模土央將一個或多個變量同表達式結(jié)合在一起,每一個變量都會被賦予一個序列;②let子句模塊將變量直接與一個完整的表達式綁定在一起,將變量綁定到整個結(jié)點序列;③where子句模塊依據(jù)一些條件對綁定的變量進行過濾;@order子句模塊根據(jù)用戶輸入的排列方式指定結(jié)果的順序;⑤ret證子句模塊構(gòu)建FLW0R表達式中的結(jié)果,并對where過濾子句中符合條件的每一個捆綁變量進行一次操作。(9)條件表達式條件表達式由if-then-else語句組成,它的作用就像在傳統(tǒng)編程語言中一樣。條件表達式的值應(yīng)為布爾型,或者它能夠被轉(zhuǎn)換為布爾值。解析器還能支持條件表達式的嵌套。(10)定量表達式定量表達式支持存在量詞some和全稱量詞every。其以量詞開頭,后跟若干個in子句,然后是關(guān)鍵詞satisfies和一個測試表達式,每個in子句將一個變量和一個表達式關(guān)聯(lián)。(11)構(gòu)造器本發(fā)明中能夠解析XQuery標準中的兩種構(gòu)造器-直接構(gòu)造器和計算式構(gòu)造器。直接構(gòu)造器使用XML式的表示法;計算式構(gòu)造器使用閉合表達式的表示法,值一般是動態(tài)計算生成的。3.3、分析器將查詢語法樹填充為執(zhí)行器可分析的Query結(jié)構(gòu)原關(guān)系查詢引擎中分析器的功能是將原始語法樹進行初步分類處理,遍歷原始語法樹,檢出相關(guān)表項、目標列、目標表項以及排序方式等,同時生成整個查詢的全局信息,包括命名空間,Query類型等,并將這些信息填充到Query結(jié)構(gòu)中。對于XML查詢引擎,本發(fā)明中重新構(gòu)造了分析器。分析器的主要任務(wù)是(1)遍歷XmlQuery原始語法子樹,檢查子樹中的XQuery表達式;此處的語法子樹即為XmlQuery結(jié)構(gòu)中的xmlqueryParseTree域。(2)檢出XQuery中的st印并填充至XmlQuery類型的st印List域。st印List是執(zhí)行器中進行二元結(jié)構(gòu)連接算法的基礎(chǔ),它是由多個順序執(zhí)行的st印構(gòu)成的鏈表。對于st印List中的每個st印,需要填充查詢需要的相關(guān)信息,主要填充的內(nèi)容包括軸值、名稱、謂詞等域。例如對于for子句for$bookin〃book,在解析器階段得到ForClause節(jié)點,F(xiàn)orClause的InExpression域指向其中的XPath部分"〃book"。但是這樣的結(jié)構(gòu)無法體現(xiàn)具體執(zhí)行過程中需要的軸值關(guān)系和文檔結(jié)點信息,因此本發(fā)明中在分析器階段將這些需要的內(nèi)容提取出來填充到一個st印結(jié)構(gòu)中,該結(jié)構(gòu)中包含XPath查詢需要的全部信息。(3)對于FLW0R表達式,整個FLW0R節(jié)點被解析后作為一個st印填充到st印List中。FLW0R節(jié)點有若干子句,每個子句都被遞歸地進行分析,其中的所有XPath路徑表達式都被解析成st印List,分別成為各自子句的一個成員。這些工作完成之后,即可得到如說明書附圖5所示的結(jié)構(gòu)。圖6所示的結(jié)構(gòu)中,F(xiàn)L0WR表達式中的各個子句是平行結(jié)構(gòu),這樣的結(jié)構(gòu)不利于執(zhí)行器的執(zhí)行。因此,本發(fā)明中在分析器的最后階段,對上述由鏈表表示循環(huán)的平行結(jié)構(gòu)進行調(diào)整,將內(nèi)層循環(huán)遞歸掛接到外層的Return子句上,最終得到如說明書附圖7所示的結(jié)構(gòu),交由執(zhí)行器執(zhí)行。3.4、執(zhí)行器3.4.1執(zhí)行器執(zhí)行步驟在關(guān)系數(shù)據(jù)庫的查詢引擎中,執(zhí)行器的主要工作為接受分析器傳下來的Query結(jié)構(gòu)并對它進行處理,完成一條查詢語句最終的執(zhí)行。執(zhí)行器包括準備執(zhí)行階段和實際執(zhí)行階段。(1)準備執(zhí)行階段準備執(zhí)行階段的工作是處理Query結(jié)構(gòu)中的target—list及其他執(zhí)行前準備。在執(zhí)行器中設(shè)置execInitExpr函數(shù),為每個Expr生成一個ExpressionState用以最終執(zhí)行。E鄧ressionState主要包含通過函數(shù)指針指定的這個表達式的實現(xiàn)函數(shù),以及經(jīng)過遞歸execInitE鄧r處理過的函數(shù)所需要的參數(shù)。執(zhí)行器在執(zhí)行階段調(diào)用這個函數(shù)來對XmlQuery函數(shù)進行求值。一般這個函數(shù)會調(diào)用最終實際的處理函數(shù)。[OO94](2)實際執(zhí)行階段實際執(zhí)行階段進行真正的XQuery求值工作。實際執(zhí)行工作如下①執(zhí)行最外層For/Let子句的in表達式,得到一個結(jié)果序列Seq;②對于Seq中的每個節(jié)點分別將其賦給所指定的綁定變量$i;③對于$i表示的每個節(jié)點進行Where條件判斷;對于$i表示的每個節(jié)點執(zhí)行一次Return表達式;⑤獲得最終結(jié)果,通過Datum格式包裝執(zhí)行結(jié)果,納入關(guān)系查詢引擎處理流程。3.4.2基于路徑索引的XPath專用查詢算法在執(zhí)行器的實際執(zhí)行階段,進行對XPath表達式的實際求值工作,本發(fā)明中采用二元結(jié)構(gòu)連接算法進行XPath表達式求值。在通常情況下,我們對于XPath表達式中的每個st印,應(yīng)用元素索引和值索引求出符合要求的節(jié)點集,作為下一步求值的上下文。這樣的方式簡單易用,但是由于每一步都需要讀取索引及調(diào)用節(jié)點關(guān)系判斷函數(shù)進行計算,極大地影響了XPath的執(zhí)行效率。在本發(fā)明的XML索引模塊中提到,為了加速求值,為XML文檔建立了路徑索引,用于對由多個連續(xù)父子關(guān)系連接的st印進行快速求值。例如,對于XPath路徑表達式/bib/books/book,利用路徑索引可直接查詢到所有符合上述路徑的book節(jié)點集{1.1.2,1.2.2,1.3.2},而不需要每步都讀取索引并根據(jù)軸值關(guān)系進行二元連接計算。在以往的研究中也有應(yīng)用路徑索引的相關(guān)文獻,但是對于路徑索引的應(yīng)用有諸多的限制,例如,只能對僅包含父子軸值且無謂詞的XPath表達式(如/bib/book/author/first)應(yīng)用路徑索引,而其他形式的XPath表達式(如/bib/book〃author/first)仍然要利用二元結(jié)構(gòu)連接算法。本發(fā)明中針對路徑索引設(shè)計了專用XPath查詢算法,對st印List進行分割,使其能夠最大程度的應(yīng)用路徑索引,加速XPath求值。例如,對于XPath表達式/bib/book〃author/first,將表達式劃分為/bib/book和author/first兩個部分,分別應(yīng)用路徑索引求值,再將結(jié)果做連接計算,得到最終的查詢結(jié)果。應(yīng)用本發(fā)明所提出的XPath專用查詢算法后,對于可以應(yīng)用路徑索引的部分,讀取一次索引可以直接獲得查詢結(jié)果,最大程度減少了頻繁應(yīng)用普通元素索引所造成的開銷,使查詢速度獲得了很大提升,當(dāng)可應(yīng)用路徑索引的部分較長時,提升效果更為明顯。在獲得最終的節(jié)點集之后,將節(jié)點集的所有子樹轉(zhuǎn)換為XML文檔片段的形式返回給用戶。對于XQuery查詢語句for$bookin//booklet$author:=$book/authorwhereposition()=2return$author其返回的結(jié)果為〈author>PerBothner〈/Wthor>至此,XML查詢引擎的工作全部完成。本發(fā)明的優(yōu)點和積極效果本發(fā)明避免了"XML使能"數(shù)據(jù)庫XML結(jié)構(gòu)語義丟失、XML查詢性能下降和純XML數(shù)據(jù)庫必須重新開發(fā)基礎(chǔ)模塊的問題,充分利用了關(guān)系數(shù)據(jù)庫的現(xiàn)有模塊,利用DLN編碼,將XML文檔存儲在關(guān)系表中,實現(xiàn)了無縫集成關(guān)系數(shù)據(jù)庫的XML查詢引擎系統(tǒng)。本發(fā)明在關(guān)系數(shù)據(jù)庫查詢引擎的各個組件中,分別加入了對XML查詢語言XQuery和XPath的支持,實現(xiàn)了XQuery的全部功能,實現(xiàn)了完整的XML查詢引擎。本發(fā)明充分利用了數(shù)據(jù)庫底層建立的元素索引、值索引,特別是路徑索引,打破了路徑索引只能應(yīng)用于僅包含父子軸值且無謂詞的XPath表達式的限制,針對路徑索引設(shè)計了專用XML查詢算法,對st印List進行分割,使其能夠最大程度的應(yīng)用路徑索引,加速XPath求值。應(yīng)用了本發(fā)明提出的XPath專用查詢算法后,對于可以應(yīng)用路徑索引的部分,讀取一次索引直接獲得查詢結(jié)果,最大程度減少了頻繁應(yīng)用普通元素索引所造成的開銷,使查詢速度獲得了很大提升,當(dāng)可應(yīng)用路徑索引的部分較長時,提升效果更為明顯。圖1是系統(tǒng)框架圖;其中,圖1A是XML文檔存儲流程,圖IB是XQuery執(zhí)行流程;圖2是擴展XML數(shù)據(jù)類型后的用戶表結(jié)構(gòu);圖3是XML節(jié)點關(guān)系表結(jié)構(gòu);圖4是在SQL語法樹中掛接XmlQuery節(jié)點的示意圖;圖5是實施例3語法樹結(jié)構(gòu)示意圖;圖6是FLOWR語句平行結(jié)構(gòu)框圖;圖7是FLOWR語句嵌套結(jié)構(gòu)圖;圖8是實施例4語法樹結(jié)構(gòu)示意圖;圖9是st印List填充方式框圖;圖10是基于路徑索引的XPath專用查詢算法的實施例。具體實施方式實施例1:創(chuàng)建含有XML類型字段的用戶表創(chuàng)建用戶表BookStore,該表中的BooksSold字段為XML類型,用來存放保存書籍信息的XML文檔。建表SQL語句如下createtableBookStore{BookStoreIDint,BookStoreNamenvarchar(50),BooksSoldxml}創(chuàng)建BookStore表的同時創(chuàng)建存儲BooksSold字段的關(guān)系表,假設(shè)該關(guān)系表的relationID為17003。擴展XML數(shù)據(jù)類型后的用戶表如說明書附圖2所示。向該表中插入一條記錄insertintoBookstorevalue(210310001,'XinHuaBookStore','〈bib>:0139]:0140]:0141]〈bookcategory=〃COOKING">〈titlelang=〃en">EverydayItalian〈/title>〈author>GiadaDeLaurentiis〈/author>:0142]〈year>2005〈/year>:0143]〈price〉30.00〈/price>:0144]〈/book>:0145]〈bookcategory=〃CHILDREN">:0146]〈titlelang=〃en">HarryPotter〈/title>〈/book>〈/bib〉')則插入記錄的過程中,對BooksSold字段中包含的XML文檔進行解析,對文檔中的每個節(jié)點進行DLN編碼,將每個節(jié)點的四元組形式作為一條記錄插入到XML節(jié)點關(guān)系表中,插入后XML節(jié)點關(guān)系表中的內(nèi)容如說明書附圖3所示。實施例2:索引使用方法對于說明書附圖3中所示XML文檔,分別應(yīng)用三種索引(1)元素索引:輸入name=,book,,type=1輸出{1.l,l.2,1.3}(2)值索引:輸入name='en'輸出{1.1.2.1,1.2.2.1,1.3.2.1}(3)路徑索引輸入bib_>book->author輸出:{1.1.3,1.2.3,1.3.3,1.3.4,1.3.5,1.3.6,1.3.7}實施例3:XQuery表達式語法樹形式及結(jié)構(gòu)轉(zhuǎn)換我們給出如下形式的XQuery表達式:0147]:0148]:0149]:0150]:0151]:0152]:0153]:0154]:0155]:0156]:0157]:0158]:0159]〈bookcategory〈titlelang=en">XQueryKickStart〈/title>for$bookin//booklet$title:=$book/titlewhereposition()=2return$title用戶輸入上述XQuery表達式后,解析器會調(diào)用lex&feyacc工具接口,根據(jù)本發(fā)明中制定的XQuery文法產(chǎn)生式,對用戶輸入語句進行解析,形成查詢語法樹。查詢語法樹的形式如說明書附圖5所示。此時形成的語法樹為如說明書附圖6所示的平行結(jié)構(gòu),這樣的結(jié)構(gòu)不利于執(zhí)行器的進一步處理。本發(fā)明對上述由鏈表表示循環(huán)的平行結(jié)構(gòu)進行調(diào)整,將內(nèi)層循環(huán)遞歸掛接到外層的Return子句上,最終得到如說明書附圖7所示的結(jié)構(gòu),交由執(zhí)行器執(zhí)行。實施例4:分析器st印List填充方法我們給出如下形式的XPath表達式/bib/book/author[last()]采用與實施例2中相同的方法獲得該查詢語句的語法樹,如說明書附圖8所示。在分析器階段,根據(jù)語法樹填充Query結(jié)構(gòu),主要是st印List結(jié)構(gòu)的填充。st印List是由多個st印構(gòu)成的鏈表,每個st印由軸值(axis)、節(jié)點測試(node-test)禾口謂詞(predicate)構(gòu)成,st印中需要的信息可從語法樹中分析獲得。st印List的填充工作主要包括(1)分析每個st印的各項內(nèi)容,包括軸值、節(jié)點測試、謂詞等;(2)將每個st印按照順序形成鏈表st印List。對于實施例4中給出的示例,st印List填充過程如說明書附圖9所示。實施例5:基于路徑索引的XPath專用查詢算法,具體算法如下算法.利用路徑索引的專用XPath查詢算法輸入一條XPath查詢語句的st印List輸出符合該查詢語句的節(jié)點集①記FirstSt印、CurSt印為st印List中的首個st??;記KeyPath鏈表保存路徑索引關(guān)鍵字,ResultSet為最終節(jié)點集,CurResult為當(dāng)前節(jié)點集,TempResult為臨時節(jié)點集,均初始化為空;②從CurSt印開始依次向后遍歷st印List,若CurSt印中包含謂詞,則將CurSt印添加到KeyPath鏈表末尾,并將CurSt印賦值為st印List中的下一個st印,轉(zhuǎn)向③;若CurSt印的軸值類型為父子關(guān)系,則將CurSt印添加到KeyPath鏈表末尾,轉(zhuǎn)向②,否則記AxisType為CurSt印的軸值類型,轉(zhuǎn)向③;③以KeyPath為關(guān)鍵字,調(diào)用路徑索引接口,獲得對應(yīng)節(jié)點集賦值給CurResult,若CurResult為空,清空ResultSet并轉(zhuǎn)向⑥;若最終結(jié)果集ResultSet為空,將ResultSet賦值為CurResult,轉(zhuǎn)向②,否則轉(zhuǎn)向④;記KeyPathLen為KeyPath鏈表長度,對CurResult中的每個節(jié)點(記CurResultNode為當(dāng)前節(jié)點),對ResultSet中的每個節(jié)點(記CurResultSetNode為當(dāng)前節(jié)點),獲取CurResultNode前KeyPathLen-l層祖先節(jié)點,記為{Ancestor},若CurResultSetNode與Ancestor滿足AxisType指定的軸值類型,則將CurResultNode添加到臨時結(jié)果集TempResult中,否則繼續(xù)下一次循環(huán);⑤清空ResultSet,若TempResult為空,轉(zhuǎn)向;若TempResult不為空,則將TempResult中的節(jié)點全部添加到ResultSet中,清空TempResult,轉(zhuǎn)向②;⑥算法結(jié)束,返回結(jié)果節(jié)點集ResultSet。對于XPath查詢語句/bib/book〃author/first,應(yīng)用基于路徑索引的XPath專用查詢算法,其求值過程為①將查詢語句根據(jù)軸值類型和是否存在謂詞,分為bib/book和author/first兩部分,兩部分間的AxisType為AXIS_ASCENDANT(祖先后裔)。②對于bib/book和author/first分別應(yīng)用路徑索引,獲得book節(jié)點集{Book}禾口first節(jié)點集{First};③author/first的長度為KeyPathLen=2,計算{First}中每個節(jié)點的前1(KeyPathLen-l)層祖先,記為{Ancestor};對于{Book}禾P{Ancestor},根據(jù)AxisType=AXIS_ASCENDANT進行計算,求出{Ancestor}集合中所有與{Book}中節(jié)點滿足祖先后裔關(guān)系的節(jié)點,記為{Tmp};{First}中與{Tmp}存在映射關(guān)系的節(jié)點即為最終結(jié)果,記為ResultSet。具體求值過程如說明書附圖10所示。權(quán)利要求一種在關(guān)系型數(shù)據(jù)庫中無縫集成純XML查詢引擎的系統(tǒng),該系統(tǒng)包括第1、將XML文檔存入關(guān)系數(shù)據(jù)庫關(guān)系表的模塊;第1.1、為關(guān)系數(shù)據(jù)庫增加XML類型;第1.2、存儲XML文檔的方法;第1.3、將用戶表中的XML類型字段映射到關(guān)系表的方法;第2、為XML文檔建立元素索引、值索引及路徑索引的模塊;第2.1、元素索引;第2.2、值索引;第2.3、路徑索引;第3、XML查詢引擎;第3.1、在關(guān)系數(shù)據(jù)庫SQL查詢語言中無縫集成XQuery的方法;第3.2、解析器中將XQuery查詢語句解析為查詢語法樹的方法;第3.3、分析器中將查詢語法樹填充為執(zhí)行器可分析的Query結(jié)構(gòu)的方法;第3.4、執(zhí)行器中設(shè)置掛載函數(shù),實現(xiàn)基于路徑索引的XPath專用查詢算法。2.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征在于步驟第1.1中所述的為關(guān)系數(shù)據(jù)庫增加XML類型,具體方法為創(chuàng)建新的數(shù)據(jù)類型,存儲XML文檔。3.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征在于步驟第1.2中所述的存儲XML文檔的具體方法為系統(tǒng)在讀入XML文檔時,對每個節(jié)點進行DLN編碼,分析節(jié)點內(nèi)容,將每個節(jié)點存儲為關(guān)系表中的一個元組;每個節(jié)點由四元組(NodeID,tagname,type,val)表示,其中,NodeID為該節(jié)點的DLN編碼,是節(jié)點的唯一標識;tagname表示節(jié)點名稱;type表示節(jié)點類型;val表示節(jié)點值;將節(jié)點DLN編碼、節(jié)點名稱、節(jié)點類型及節(jié)點值作為元組的屬性、每個節(jié)點作為一個元組存儲在一張關(guān)系表中,同一張用戶表中的xml字段存儲在同一張關(guān)系表中。4.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征在于步驟第1.3中所述的將用戶表中的XML類型字段映射到關(guān)系表的方法提供一個名為XMLpointer的指針結(jié)構(gòu),包含relationID和docID兩個字段,通過relationID可以找到存儲該XML文檔的關(guān)系表,通過docID可以找到該XML文檔的所有節(jié)點一以該docID為前綴的所有NodeID所對應(yīng)的節(jié)點都隸屬于該XML文檔。5.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征在于步驟第2在該系統(tǒng)中實現(xiàn)了元素索引、值索引及路徑索引;元素索引指給定元素名稱,通過元素索引返回節(jié)點名稱為指定值的節(jié)點集合;值索引指給定元素值,通過元素索引返回節(jié)點值為指定值的節(jié)點集合;路徑索引用于對由多個連續(xù)父子關(guān)系連接的查詢進行快速求值,返回符合該路徑的節(jié)點集合。6.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征在于步驟第3.1中所述的在關(guān)系數(shù)據(jù)庫SQL查詢語言中無縫集成XQuery的方法,具體語法形式為selectXmlQuery('/bib/book',BooksSold)fromBookstorewhereBookStoreID=1其中XmlQuery為SQL/XML標準中的標準函數(shù),第一個參數(shù)為XQuery或者XPath表達式,第二個參數(shù)為用戶表中XML類型的列。7.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征在于步驟第3.2中所述的在解析器中將XQuery查詢語句解析為查詢語法樹的具體方法為根據(jù)XPath2.0和XQuery1.0標準,制定XQuery文法,接受用戶輸入的字符串形式的查詢語句,根據(jù)文法將其解析為相應(yīng)的語法樹供進一步處理;本發(fā)明中能夠識別出的XQuery核心模塊包括今基本表達式今路徑表達式今序列表達式今算術(shù)表達式今比較表達式今邏輯表達式今函數(shù)調(diào)用令FLWOR表達式今條件表達式今定量表達式今構(gòu)造器8.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征在于步驟第3.3中所述的在分析器中將查詢語法樹填充為執(zhí)行器可分析的Query結(jié)構(gòu)的具體方法為(1)遍歷XmlQuery原始語法子樹,檢查子樹中的XQuery表達式;(2)對于FLWOR表達式,整個FLWOR節(jié)點作為一個st印±真充到st印List中;(3)對于FLWOR表達式中的每個子句,檢出其中的st印并填充至XmlQuery類型的st印List域。9.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征在于步驟第3.4中所述執(zhí)行器的執(zhí)行步驟包括第3.4.1、準備執(zhí)行階段和實際執(zhí)行階段,準備執(zhí)行階段處理Query結(jié)構(gòu)中的targetJist,完成執(zhí)行前準備工作,實際執(zhí)行階段進行真正的XQuery求值工作。10.根據(jù)權(quán)利要求1所述的系統(tǒng),其特征在于步驟第3.4中所述執(zhí)行器的基于路徑索引的XPath專用查詢算法是第3.4.2、本發(fā)明中打破路徑索引只能應(yīng)用于僅包含父子軸值且無謂詞的XPath表達式的限制,針對路徑索引設(shè)計了專用XPath查詢算法,主要方法為將st印List分割成多個可以應(yīng)用路徑索引的片段,對每個片段分別求值后進行連接,獲得最終查詢結(jié)果,該算法能夠最大程度的應(yīng)用路徑索引,加速XPath求值。全文摘要本發(fā)明屬于數(shù)據(jù)庫
技術(shù)領(lǐng)域:
,公開了一種在關(guān)系型數(shù)據(jù)庫中無縫集成純XML查詢引擎的系統(tǒng)。該系統(tǒng)建立了XML文檔存儲機制,引入了XML數(shù)據(jù)類型;為XML文檔建立了多種索引,提高了查詢效率;實現(xiàn)了XML標準查詢語言XPath和XQuery;設(shè)計了基于多種索引結(jié)構(gòu)的XML專用高效查詢算法,實現(xiàn)對用戶輸入的XQuery查詢語句的最終執(zhí)行,得到最終結(jié)果返回給用戶。文檔編號G06F17/30GK101719156SQ20091024520公開日2010年6月2日申請日期2009年12月30日優(yōu)先權(quán)日2009年12月30日發(fā)明者張海威,張路,王敏輝,胡翔宇,袁曉潔申請人:南開大學(xué)