本發(fā)明屬于信息交換和查詢領(lǐng)域,尤其涉及一種xml數(shù)據(jù)的快速查詢方法,具體為在xml數(shù)據(jù)中進行由多個具有復(fù)雜結(jié)構(gòu)關(guān)系的標簽路徑組成的層次融合式查詢,并返回二維結(jié)果值集合。
背景技術(shù):
xml(extensiblemarkuplanguage),即可擴展的標記語言,是一套定義語義標記的規(guī)范。xml提供統(tǒng)一的方法來描述和交換獨立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。是internet環(huán)境中跨平臺的、依賴于內(nèi)容的技術(shù),也是當今處理分布式結(jié)構(gòu)信息的有效工具。隨著網(wǎng)絡(luò)應(yīng)用的快速發(fā)展,使得xml類型的數(shù)據(jù)成為基于互聯(lián)網(wǎng)數(shù)據(jù)交換的主流數(shù)據(jù)形式。
xml格式數(shù)據(jù)具有天然的層次結(jié)構(gòu)關(guān)系即樹形結(jié)構(gòu)關(guān)系,因此在很多應(yīng)用場合下針對xml數(shù)據(jù)的查詢也具有層次關(guān)系特性。在傳統(tǒng)關(guān)系數(shù)據(jù)庫中一種常見的層次數(shù)據(jù)查詢應(yīng)用:有條件地從不同層級的數(shù)據(jù)表中檢索多個字段的數(shù)據(jù)。假定以下關(guān)系:部門(部門編號,部門名稱);員工(員工編號,部門編號,員工姓名,職位,性別,年齡),部門和員工之間是一對多的關(guān)系(樹狀結(jié)構(gòu)),對應(yīng)的簡寫:dept(dep_id,dep_name)和emp(emp_id,dep_id,name,title,gender,age)。顯然部門表和員工表是不同層次關(guān)系的表,后者是前者的子表,現(xiàn)在要檢索出“年齡大于40歲的所有的員工姓名、職位和所屬部門名稱”,那么對應(yīng)的sql腳本語句如下:
selectemp.name,emp.title,dept.dept_name
fromdept,emp
wheredept.dept_id=emp.dep_id
andage>40;
總結(jié)這種層次表聯(lián)接(融合性)查詢具有以下特點:
1)數(shù)據(jù)的循環(huán)層次,結(jié)果集是以員工層次為中心的循環(huán)數(shù)據(jù)集而不是部門,在sql中缺省以最低層次為循環(huán)中心;
2)員工表中必須要有部門編號,標注自己所屬部門;
3)連接操作體現(xiàn)出層次之間的關(guān)聯(lián)關(guān)系同時又具有隔離性,即具有相同部門編號的員工(在員工表中)的所屬部門信息(在部門表中)也相同,同時不同的部門擁有不同的員工,即使有跨部門員工,此員工信息也會出現(xiàn)多次(部門編號不同,一對多關(guān)系);
4)要查詢的字段也具有層次融合性,每個員工除了自己的專有信息外還包括所屬部門的名字。
作為數(shù)據(jù)交換的主體,xml又具有很強的層級結(jié)構(gòu)自描述特性,上面的兩張具有“父子關(guān)系”的數(shù)據(jù)表(部門表和員工表)可以很容易轉(zhuǎn)換成二級循環(huán)(部門和員工)的xml格式數(shù)據(jù),下層xml分支嵌套在上層的某個循環(huán)分支中,即多個員工信息(同一部門的員工)的下層分支嵌入到所屬部門的上層分支中,具有天然或缺省的層次聯(lián)接條件,不需要在員工層標明部門編號(部門編號作為嵌入的員工層分支的祖先節(jié)點形式存在),避免了上述特點2)節(jié)省了存儲空間?;诖?,針對此類xml數(shù)據(jù)提出上述的層次融合式查詢需求也是很自然的事情。那么目前的針對xml的查詢處理技術(shù)是不是能夠很好的解決上述問題呢?
xpath是一種在xml文檔中查找信息的語言,是w3c推薦標準,迄今為止,學術(shù)界集中討論的基于xml的處理都是圍繞著xpath展開的。xpath借助于路徑表達式來選取xml文檔中的節(jié)點、節(jié)點集合、原子值、以及節(jié)點和原子值的混合。通過沿著位置路徑表達式(path)或者步(steps)來選取相關(guān)節(jié)點。
但是由于語法上的限制,一般情況下xpath返回的都是一維的結(jié)果集,結(jié)果集的元素之間都是兄弟關(guān)系,即使使用聯(lián)合操作"|"強行合并兩個表達式返回的值集合也不能得到正確的層次融合式結(jié)果集。因此單獨使用xpath不能直接返回具有不同層次結(jié)構(gòu)關(guān)系的多個字段(或者標簽路徑)的值集合。
xquery建立在xpath表達式基礎(chǔ)之上用于xml的數(shù)據(jù)查詢語言,xquery在xpath之后成為w3c推薦標準。xquery天生支持xpath并將其作為xquery語法的一部分,xquery顯然能完成xpath所能完成的任何任務(wù)。
但是xquery是圖靈完備的(turing-complete),可以被看作是一種通用語言,因而很容易克服xpath的諸多局限,xquery提供了一批重要的內(nèi)置函數(shù)和運算符,而且還提供了表達對結(jié)果集進行任意轉(zhuǎn)換的功能。但xquery使用的復(fù)雜性明顯增加,使用xquery返回具有不同層次結(jié)構(gòu)關(guān)系的結(jié)果集往往需要編寫非常復(fù)雜多層嵌套的xquery腳本,甚至需要編程語言的幫助下才能完成融合式的查詢,而且腳本的執(zhí)行在時空效率上要依賴于所選擇的xquery查詢引擎。
技術(shù)實現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題是,提供一種xml數(shù)據(jù)的快速查詢方法,能夠滿足查詢自適應(yīng)性和較高時空效率的要求。
為實現(xiàn)上述目的,本發(fā)明采用如下的技術(shù)方案:
一種xml數(shù)據(jù)的快速查詢方法,包括以下步驟:
步驟1、查詢參數(shù)預(yù)處理:構(gòu)建謂詞表達式語法計算樹、查詢導航樹
步驟、101如果謂詞表達式不存在的話,跳轉(zhuǎn)到步驟104,如果存在,順序執(zhí)行下一步驟;
步驟102、按照表達式ebnf范式,語法分析謂詞條件表達式,并把操作數(shù)作為葉子節(jié)點,把相關(guān)的操作符作為其父節(jié)點,依次類推構(gòu)造謂詞語法計算樹;
步驟103、把每個條件表達式子項中的標簽路徑追加到查詢標簽路徑表中;
步驟104、針對查詢標簽列表中的每一個標簽路徑,分拆成一組標簽序列;
步驟105至107針對此標簽路徑的標簽序列,按照順序處理每一個標簽:如果此標簽沒在查詢樹結(jié)構(gòu)中,則創(chuàng)建新的節(jié)點結(jié)構(gòu)編入查詢樹中,在節(jié)點中放入此標簽的詳細信息,同時把導航信息放入此節(jié)點中,包括:“父子”指針、“子父”指針,按照順序檢查下一個標簽、重復(fù)執(zhí)行步驟105;如果在查詢樹結(jié)構(gòu)中已經(jīng)存在,順序查找下一個標簽,重復(fù)執(zhí)行步驟105;直到標簽序列結(jié)束執(zhí)行步驟108。
步驟108遍歷查詢導航樹,繼續(xù)豐富節(jié)點的導航信息。
步驟2、查詢處理并提供二維結(jié)果集
步驟201、解析目標xml數(shù)據(jù)讀入內(nèi)存中,構(gòu)造數(shù)據(jù)對象樹,此對象樹節(jié)點中只存在“父子關(guān)系”的向下單向指針,無“子父關(guān)系”的向上指針;
步驟202、遍歷查詢導航樹同時遍歷xml數(shù)據(jù)樹,對于查詢樹中的查詢節(jié)點和數(shù)據(jù)樹中的相關(guān)數(shù)據(jù)節(jié)點采用“雙樹剪枝”算法作遍歷檢查處理:查詢標簽節(jié)點存在但無數(shù)據(jù)標簽節(jié)點與之對應(yīng),則以此查詢節(jié)點為根節(jié)點的查詢分支不再遍歷;查詢節(jié)點和數(shù)據(jù)節(jié)點的標簽名相同,則通過此標簽節(jié)點或者收集其標簽路徑的結(jié)果值放入緩存;數(shù)據(jù)標簽節(jié)點存在但無查詢標簽節(jié)點與之對應(yīng),則遍歷跳過以此數(shù)據(jù)節(jié)點為根節(jié)點的數(shù)據(jù)分支;
步驟203和204、如果遍歷到已標注謂詞計算位置的標簽節(jié)點上,則提取表達式中的各標簽路徑對應(yīng)值,然后開始按照謂詞表達式語法計算樹結(jié)構(gòu)要求計算表達式,結(jié)果為真則執(zhí)行步驟205,結(jié)果為假則執(zhí)行步驟206;
步驟205、收集本次的標簽對應(yīng)值并放入緩存中;
步驟206、越過此指定循環(huán)點路徑的分支,繼續(xù)下一個分支,如果是最后的數(shù)據(jù)分支,則執(zhí)行步驟207,如果不是則執(zhí)行步驟202;
步驟207、收集所有緩存中的標簽對應(yīng)結(jié)果集,合并組成二維標簽結(jié)果集,并返回。
作為優(yōu)選,采用雙樹剪枝算法作遍歷檢查處理過程為:遍歷的過程中,當前標簽節(jié)點要選定下一個孩子標簽節(jié)點時:假定nq為當前查詢樹節(jié)點,nlqc為nq的所有孩子節(jié)點集合,其標簽列表為tlqc,nqc為nq的目標孩子節(jié)點,tqc為其標簽;nd為當前數(shù)據(jù)樹節(jié)點,其標簽和nq節(jié)點的標簽相同,nldc為nd的所有孩子節(jié)點集合,其標簽列表為tldc,ndc為nd的孩子節(jié)點,tdc為其標簽;對于nlqc的所有查詢子節(jié)點對應(yīng)的標簽,依次要到數(shù)據(jù)樹的nldc中查找和檢查:
a)當數(shù)據(jù)子節(jié)點標簽tdc不屬于tlqc時,意味著以ndc為根節(jié)點的數(shù)據(jù)分支無須繼續(xù)查詢,數(shù)據(jù)樹遍歷時可以剪掉此分支,即對數(shù)據(jù)樹剪枝;
b)當tdc等于tqc時,意味著以nqc和ndc為根節(jié)點的分支都需要繼續(xù)深入遍歷查詢,如果nqc為葉子節(jié)點,則收集此標簽對應(yīng)的結(jié)果,否則要對其孩子節(jié)點重復(fù)上述過程;
c)當tqc不屬于tldc時,意味著要查詢的標簽在nldc中不存在,那么以nqc為根節(jié)點的查詢分支無須繼續(xù)查詢,查詢樹遍歷時可以剪掉此分支,即對查詢樹剪枝。
本發(fā)明的種xml數(shù)據(jù)的快速查詢方法,在xml數(shù)據(jù)中進行由多個具有復(fù)雜層次結(jié)構(gòu)關(guān)系的標簽路徑組成的層次融合式查詢,構(gòu)建了解決此問題的查詢模型——xml多標簽路徑查詢(xmtq)。xmtq模型基于簡潔的查詢接口(qi)、查詢導航樹數(shù)據(jù)結(jié)構(gòu)模型(qgt)和查詢處理引擎(qe),其中在qi中只提供要查詢的標簽路徑即可,不需關(guān)注其復(fù)雜的結(jié)構(gòu)關(guān)系,可由模型自適應(yīng)標簽路徑之間的結(jié)構(gòu)關(guān)系,也支持謂詞表達式參數(shù)接口;qgt具有“樹干”標簽節(jié)點遍歷結(jié)果共享和快捷的遍歷導航路線特征,可以指導qe更快速、更精準地遍歷、跳過無關(guān)分支、查詢并獲取相關(guān)的標簽值。通過測試表明xmtq模型針對大規(guī)模xml數(shù)據(jù)查詢多個層次復(fù)雜的標簽路徑具有突出的查詢時空效率。
附圖說明
圖1:查詢參數(shù)預(yù)處理流程圖;
圖2:查詢處理流程圖。
具體實施方式
本發(fā)明提供一種xml數(shù)據(jù)的快速查詢方法,采用新的層次融合式查詢模型xmtq(xmlmultipletagsquery),該模型接收多個查詢標簽路徑,這些路徑之間的關(guān)系比較復(fù)雜,包括:“父子關(guān)系”、“兄弟關(guān)系”、“叔侄關(guān)系”、“祖先-子孫關(guān)系”、“叔公-侄孫關(guān)系”等。經(jīng)過查詢提取之后的結(jié)果集是一個二維的集合,第一維是按照xml數(shù)據(jù)中存放順序的每個指定“家族”/分支對應(yīng)的結(jié)果子集,第二維的結(jié)果子集是一個映射表,其中“鍵”對應(yīng)的是標簽路徑,“值”是標簽路徑所指定的融合后的結(jié)果值,具體技術(shù)方案如下:
1、提供簡單的查詢接口
用戶只需要簡單地提供查詢標簽路徑列表、指定的循環(huán)點標簽路徑和謂詞表達式(可選)即可,不需要額外關(guān)注多個查詢標簽路徑之間復(fù)雜的結(jié)構(gòu)關(guān)系,不需要對查詢過程進行干預(yù),不需要做“二次編程”或者“再查找”收集結(jié)果的工作。系統(tǒng)會封裝并自適應(yīng)查詢標簽路徑的復(fù)雜層次結(jié)構(gòu)關(guān)系,查詢并自動提取相應(yīng)的結(jié)果值集合,使得用戶能夠更專注自己的業(yè)務(wù)需求,快速適應(yīng)業(yè)務(wù)變化。
由于查詢請求參數(shù)同xml數(shù)據(jù)變化頻度不一致,一般地,查詢參數(shù)發(fā)生變化時系統(tǒng)必須要重新對查詢參數(shù)進行預(yù)處理,而不是每次處理xml數(shù)據(jù)之前處理查詢參數(shù),所以整個查詢過程分為以下兩大部分:
2、查詢請求參數(shù)的預(yù)處理
2.1、構(gòu)建謂詞語法計算樹
按照如下條件表達式的ebnf范式對輸入的謂詞表達式進行語法分析:
<條件>→<條件分項1>{or<條件分項1>}
<條件分項1>→<條件分項2>{and<條件分項2>}
<條件分項2>→not(<條件分項3>)|<條件分項3>
<條件分項3>→<表達式><關(guān)系運算符><表達式>|(<條件>)
<表達式>→<項>{+<項>}|<項>{-<項>}
<項>→<因子>{*<因子>}|<因子>{/<因子>}
<因子>→tag_path|num|string|false|true|(<表達式>)
<關(guān)系運算符>→<|<=|>|>=|==|?。?/p>
分解謂詞條件表達式之后構(gòu)造謂詞語法計算樹,操作數(shù)作為葉子節(jié)點,把相關(guān)的操作符作為其父節(jié)點,依次類推。同時把每個條件表達式子項中涉及到的標簽路徑追加到查詢標簽路徑列表中。
2.2、構(gòu)建查詢導航樹
1)輸入的查詢標簽路徑是絕對路徑,每個標簽路徑都是從根節(jié)點開始逐次向下,這些路徑之間存在著大量的可以共享的標簽,那么可以把這些查詢路徑進行某種程度上的合并,即構(gòu)建查詢樹,同時能夠反映出各個路徑之間的結(jié)構(gòu)層次關(guān)系。
2)每個構(gòu)成查詢樹的節(jié)點除了要有標簽的信息之外,還要有詳盡的導航信息,方便對此查詢樹的遍歷,同時還要標注可以對謂詞表達式計算的位置。
3、查詢處理并收集結(jié)果集
1)解析目標xml數(shù)據(jù)讀入內(nèi)存中,構(gòu)造數(shù)據(jù)對象樹,此對象樹節(jié)點中只存在“父子關(guān)系”的向下單向指針,無“子父關(guān)系”的向上指針,有利于節(jié)省存儲空間,減少解析時間,提高時空效率。
2)查詢導航樹和xml數(shù)據(jù)樹的遍歷過程中,采用雙樹剪枝算法(查詢樹和數(shù)據(jù)樹)。
遍歷的過程中,當前標簽節(jié)點要選定下一個孩子標簽節(jié)點時:假定nq為當前查詢樹節(jié)點,nlqc為nq的所有孩子節(jié)點集合,其標簽列表為tlqc,nqc為nq的目標孩子節(jié)點,tqc為其標簽;nd為當前數(shù)據(jù)樹節(jié)點,其標簽和nq節(jié)點的標簽相同,nldc為nd的所有孩子節(jié)點集合,其標簽列表為tldc,ndc為nd的孩子節(jié)點,tdc為其標簽。對于nlqc的所有查詢子節(jié)點對應(yīng)的標簽,依次要到數(shù)據(jù)樹的nldc中查找和檢查:
a)當數(shù)據(jù)子節(jié)點標簽tdc不屬于tlqc時,意味著以ndc為根節(jié)點的數(shù)據(jù)分支無須繼續(xù)查詢,數(shù)據(jù)樹遍歷時可以剪掉此分支,即對數(shù)據(jù)樹剪枝;
b)當tdc等于tqc時,意味著以nqc和ndc為根節(jié)點的分支都需要繼續(xù)深入遍歷查詢,如果nqc為葉子節(jié)點,則收集此標簽對應(yīng)的結(jié)果,否則要對其孩子節(jié)點重復(fù)上述過程;
c)當tqc不屬于tldc時,意味著要查詢的標簽在nldc中不存在,那么以nqc為根節(jié)點的查詢分支無須繼續(xù)查詢,查詢樹遍歷時可以剪掉此分支,即對查詢樹剪枝。
3)在已標注的計算點開始計算謂詞表達式,結(jié)果為真則繼續(xù)遍歷查詢,否則要跳過對此分支的遍歷查詢,跳轉(zhuǎn)到下一個循環(huán)分支。
如圖1和2所示,本發(fā)明實施例提供一種xml數(shù)據(jù)的快速查詢方法,具體流程包括以下步驟:
步驟1、查詢參數(shù)預(yù)處理:構(gòu)建謂詞表達式語法計算樹、查詢導航樹
步驟101如果謂詞表達式不存在的話,跳轉(zhuǎn)到步驟104,如果存在,順序執(zhí)行下一步驟。
步驟102按照表達式ebnf范式,語法分析謂詞條件表達式,并把操作數(shù)作為葉子節(jié)點,把相關(guān)的操作符作為其父節(jié)點,依次類推構(gòu)造謂詞語法計算樹。
步驟103把每個條件表達式子項中的標簽路徑追加到查詢標簽路徑表中。
步驟104針對查詢標簽列表中的每一個標簽路徑,分拆成一組標簽序列。
步驟105至107針對此標簽路徑的標簽序列,按照順序處理每一個標簽:如果此標簽沒在查詢樹結(jié)構(gòu)中,則創(chuàng)建新的節(jié)點結(jié)構(gòu)編入查詢樹中,在節(jié)點中放入此標簽的詳細信息,同時把導航信息放入此節(jié)點中,包括:“父子”指針、“子父”指針,按照順序檢查下一個標簽、重復(fù)執(zhí)行步驟105;如果在查詢樹結(jié)構(gòu)中已經(jīng)存在,順序查找下一個標簽,重復(fù)執(zhí)行步驟105;直到標簽序列結(jié)束執(zhí)行步驟108。
步驟108遍歷查詢導航樹,繼續(xù)豐富節(jié)點的導航信息。
步驟2、查詢處理并提供二維結(jié)果集
步驟201解析目標xml數(shù)據(jù)讀入內(nèi)存中,構(gòu)造數(shù)據(jù)對象樹,此對象樹節(jié)點中只存在“父子關(guān)系”的向下單向指針,無“子父關(guān)系”的向上指針,有利于節(jié)省存儲空間,減少解析時間,提高時空效率。
步驟202遍歷查詢導航樹同時遍歷xml數(shù)據(jù)樹,對于查詢樹中的查詢節(jié)點和數(shù)據(jù)樹中的相關(guān)數(shù)據(jù)節(jié)點采用“雙樹剪枝”算法作遍歷檢查處理:查詢標簽節(jié)點存在但無數(shù)據(jù)標簽節(jié)點與之對應(yīng),則以此查詢節(jié)點為根節(jié)點的查詢分支不再遍歷;查詢節(jié)點和數(shù)據(jù)節(jié)點的標簽名相同,則通過此標簽節(jié)點或者收集其標簽路徑的結(jié)果值放入緩存;數(shù)據(jù)標簽節(jié)點存在但無查詢標簽節(jié)點與之對應(yīng),則遍歷跳過以此數(shù)據(jù)節(jié)點為根節(jié)點的數(shù)據(jù)分支。
步驟203和204如果遍歷到已標注謂詞計算位置的標簽節(jié)點上,則提取表達式中的各標簽路徑對應(yīng)值,然后開始按照謂詞表達式語法計算樹結(jié)構(gòu)要求計算表達式,結(jié)果為真則執(zhí)行步驟205,結(jié)果為假則執(zhí)行步驟206。
步驟205收集本次的標簽對應(yīng)值并放入緩存中。
步驟206越過此指定循環(huán)點路徑的分支,繼續(xù)下一個分支,如果是最后的數(shù)據(jù)分支,則執(zhí)行步驟207,如果不是則執(zhí)行步驟202。
步驟207收集所有緩存中的標簽對應(yīng)結(jié)果集,合并組成二維標簽結(jié)果集,并返回。