專利名稱:一種自下而上的xml分支模式匹配方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種自下而上的XML分支模式匹配方法,分支模式匹配(Twig PatternMatching)是XML查詢處理的核心操作,決定XML查詢處理的性能和效率。分支模式匹配屬于半結(jié)構(gòu)化數(shù)據(jù)管理領(lǐng)域,是數(shù)據(jù)管理領(lǐng)域的一個分支。
背景技術(shù):
XML又稱為可擴(kuò)展標(biāo)記語言(extensible Markup Language),是由W3C組織于1998年2月發(fā)布的一種標(biāo)準(zhǔn)。作為SGML的一個簡化子集,它集成了 SGML功能豐富與HTML易用性的特點,以一種開放、自描述的方式定義數(shù)據(jù)結(jié)構(gòu)。XML可以同時描述數(shù)據(jù)內(nèi)容和結(jié)構(gòu)特性,通過這些結(jié)構(gòu)特性,可以了解數(shù)據(jù)之間的語義關(guān)系。HTML文件中的標(biāo)識符僅用于控制如何顯示內(nèi)容(如字體的大小等等),文件內(nèi)容所表達(dá)的意義完全需要人通過對文字 的閱讀才能理解。而XML則不同,它所用的標(biāo)識符本身就蘊含相應(yīng)的語義信息,文件內(nèi)容所表達(dá)的具體含義完全可通過對語義的分析由機(jī)器來解釋。因此,HTML與XML之間的差別可以通俗的概括為“HTML是寫給人看的;而XML則是寫給機(jī)器看的。”與SGML相比,XML更簡單,同時也可用于設(shè)計文檔描述語言。XML自描述的特點使其自誕生之日起就引起了學(xué)術(shù)界和工業(yè)界的廣泛關(guān)注并隨著網(wǎng)絡(luò)應(yīng)用的爆炸式增長而得到了廣泛應(yīng)用。具體來說,XML的應(yīng)用主要體現(xiàn)在以下幾個方面
數(shù)據(jù)交換XML之所以能夠應(yīng)用于各種領(lǐng)域的原因,就是因為XML具有其它方法所不具備的數(shù)據(jù)描述特性,控制信息不依賴于應(yīng)用軟件,而是采用人和機(jī)器都可理解的標(biāo)記形式來表現(xiàn),XML使用標(biāo)記(Tag)來描述元素,而XML文件是由一個個稱之為元素(Element)的部件構(gòu)成。使用標(biāo)記的描述方法可以保留原數(shù)據(jù)的意義和關(guān)系,進(jìn)而可在不同系統(tǒng)之間進(jìn)行靈活的數(shù)據(jù)交換。所以適合于各種平臺環(huán)境的數(shù)據(jù)交換。數(shù)據(jù)定義XML的標(biāo)記名和元素之間的關(guān)系可以由使用者自定義,也就是說,根據(jù)特定的標(biāo)記集合和XML語法可以定義一個全新的符號化語言。這就是XML “可擴(kuò)充(Extensible) ”名字的來源。因此,XML也被稱為“定義語言的語言”,即XML是一種元語言?;谠撎攸c,XML可以用于定義電子商務(wù)數(shù)據(jù)、多媒體演示數(shù)據(jù)、數(shù)學(xué)公式等各種各樣數(shù)據(jù)應(yīng)用語目的基礎(chǔ)語目。存儲數(shù)據(jù)一個XML文檔就是一個數(shù)據(jù)庫,通過定義數(shù)據(jù)模式信息形成各種關(guān)系,實現(xiàn)數(shù)據(jù)交換、上下文檢索、多媒體傳輸?shù)?。XML的廣泛應(yīng)用使得以XML格式存儲的數(shù)據(jù)越來越多,如今,XML已經(jīng)成互聯(lián)網(wǎng)上信息表示和交換的事實上的標(biāo)準(zhǔn)。而面對大量的XML數(shù)據(jù),高效的XML查詢處理技術(shù)變得十分重要。自1992年誕生以來,工業(yè)界和學(xué)術(shù)界就開始了對于XML這種半結(jié)構(gòu)化數(shù)據(jù)的研究?,F(xiàn)今,XML的研究也主要集中在節(jié)點編碼、索引方法和分支模式匹配(Twig PatternMatching)等三個方面。在XML查詢處理中,分支模式匹配是高效的XML查詢處理的一個核心操作。為此,尋求一種高效的算法來解決分支模式匹配問題具有重大的理論和現(xiàn)實意義。
過去幾年里,國內(nèi)外學(xué)者提出了許多分支模式匹配算法。2002年,Nicolas Bruno等人提出TwigStack算法來避免產(chǎn)生大量的中間匹配結(jié)果(N. Bruno, D. Srivastava,and N. Koudas. Holistic twig joins: optimal XML pattern matching. In :SIGM0M,310-321,2002. ),2003 年,Jiang 等人提出 XML 區(qū)域樹索引(XML Region Tree :XR_tree),XR-tree是一種動態(tài)的內(nèi)存索引結(jié)構(gòu)?;赬R-tree,設(shè)計了 TSGeneric+算法來高效地跳過不參與連接的后代或祖先節(jié)點(Jiang, H.,Lu, H. , Wang, ff. 0oi, B.C.: XR-tree:Indexing XML date for efficient structural joins. In :ICDE, 2003.)。2004 年,Lu等人提出TwigStackList算法來更好地匹配包含PC(Parent-Child)關(guān)系的分支模式(Lu, J. , Chen, T. , Ling, T. ff. : Efficient processing of XML twig patterns withparent-child edges: a look-ahead approach. In: CI KM, 2004)。2005 年,Lu 等人又提出基于擴(kuò)展的Dewey編碼(Extended Dewey Encoding)的分支模式匹配算法TJFast (Lu,J. , Ling, T. ff. , Chan, C. Y. , Chen, T. : From region encoding to extended dewey:On efficient processing of XML twig pattern matching. In: VLDB, 2005.)。TJFast只需處理分支模式中葉子節(jié)點的數(shù)據(jù)流。2006年,Chen等人提出Twig2Stack算法(Chen, S. , Li, H. G. , Tatemura, J. , Hsiung, ff. P. , Agrawal, D. , Can dan, K. S .:Twig2Stack: Bottom-up processing of generalized-tree-pattern queries over XMLdocuments. In: VLDB, 2006.),利用層次棧列舉匹配的路徑。Twig2Stack算法的性能優(yōu)于TwigStackList和TJFast,但是Twig2Stack會造成許多隨機(jī)的節(jié)點訪問,且動態(tài)的層次棧結(jié)構(gòu)不易維護(hù)并且占用巨大的內(nèi)存空間。這些算法具有下面的共同點
(1)需要利用額外的數(shù)據(jù)結(jié)構(gòu)(緩存),如?;蜿犃衼韯討B(tài)維護(hù)部分或最終匹配結(jié)果; ⑵除了 TJFast采用基于路徑的編碼外,都采用基于區(qū)域的編碼;
(3)采用至上而下的匹配順序;
⑷沒有挖掘分支模式TP (Twig Pattern)包含的信息;
(5)節(jié)點層次只用于輔助判斷父子關(guān)系。先前的方法需要利用一組緩存(?;蛘哧犃?來保存中間結(jié)果,維護(hù)這緩存需要時間和空間的代價;且以前的方法采用自上而下的匹配順序,很少關(guān)注節(jié)點層次信息。
發(fā)明內(nèi)容
發(fā)明目的本發(fā)明提供一種自下而上的XML分支模式匹配方法,不需要緩存來保存中間匹配結(jié)果,這樣判斷節(jié)點間結(jié)構(gòu)關(guān)系的問題就轉(zhuǎn)變?yōu)樽址檎覇栴},從而可以利用成熟的查找技術(shù)(如散列)來高效處理分支模式匹配問題。采用自下而上的匹配順序,是一種高效實用的分支模式匹配方法。技術(shù)方案一種自下而上的XML分支模式匹配方法,包括如下步驟
第一步采用Dewey*編碼模式對XML文檔進(jìn)行節(jié)點編碼,將每個節(jié)點的Dewey*編碼存A Berkeley DB 中;
第二步進(jìn)行分支模式解析,使用 Nodes、Depths、Relations、BranchingNodes>Pointers五個數(shù)組來記錄分支模式解析的結(jié)果;五個數(shù)組功能如下
Nodes :按照從左到右的順序保存TP中的節(jié)點名稱;
Relations :保存每個節(jié)點與其直接的父親或祖先節(jié)點的結(jié)構(gòu)關(guān)系;BranchingNodes :保存TP中的分支節(jié)點名稱;
Pointers :記錄每個分支節(jié)點的范圍,用〈startP,endP〉來表示,WartP為Relations數(shù)組中包含“[”的數(shù)組下標(biāo),endP % Relations數(shù)組中與相對應(yīng)的包含“]”的數(shù)組下標(biāo)。有了 Pointers數(shù)組來標(biāo)識對應(yīng)分支節(jié)點的范圍,可以方便地找到以相應(yīng)的分支節(jié)點為根的所有單一路徑。Depths :記錄每個節(jié)點的深度(層次)信息。有三種表示形式
(1)Depths[i]= “7”說明匹配TP的節(jié)點Nodes[i]只出現(xiàn)在第7層;
(2)Depths[i]= “>7” 說明匹配 TP 的節(jié)點 Nodes[i]出現(xiàn)在第 J 層,7j¥axLevel,MaxLevel為XML文檔的最大深度;
(3)Depths[i]=說明匹配TP的節(jié)點Nodes[i]出現(xiàn)在第J 層,且第三步讀取數(shù)據(jù)流,同時進(jìn)行數(shù)據(jù)流中元素的篩選。本發(fā)明提出了基于節(jié)點層次信息的節(jié)點篩選機(jī)制一FilterStreamo通過對分支模式和查詢數(shù)據(jù)集中對應(yīng)節(jié)點層次的分析來篩選元素。FilterStream的篩選原則如下
給定元素節(jié)點a的層次數(shù)組depth (ay)和Depths (a),則
(1)若depth (aj) Depths (a),則 label (ay)不加入 Ta ;
(2)若depth (a》Depths (a),則 depth (ay)加入到 Depths (a)且 label (a》加入 Ta。第四步執(zhí)行單一路徑匹配或者分支路徑匹配。PathLevel和TwigLevel算法采用自下而上的匹配順序。匹配的核心思想是把判斷AU)取biib/Q是否滿足PC或AD (Ancestor-Descendant)關(guān)系的操作轉(zhuǎn)化為判斷/Tre/ij ( , depth (b))在T1a中是否存在。若存在,則7;中存在^的父親或者祖先節(jié)點;否則,不存在。這樣判斷節(jié)點間結(jié)構(gòu)關(guān)系的問題就轉(zhuǎn)變?yōu)樽址檎覇栴},從而可以利用成熟的查找技術(shù)(如散列)來高效處理分支模式匹配問題。第五步使用outputSolutions來輸出最終的匹配結(jié)果。有益效果與現(xiàn)有技術(shù)相比,本發(fā)明采用上述技術(shù)方案,具有下面的優(yōu)勢
1)解決了單一路徑匹配和分支路徑匹配問題;
2)將元素間一對一的結(jié)構(gòu)關(guān)系判斷轉(zhuǎn)換為元素間一對多的判斷;
3)將字符串查找技術(shù)引入到XML分支模式匹配領(lǐng)域,利用已有的字符串匹配技術(shù)來解決分支模式匹配問題;
4)在滿足一定條件時,F(xiàn)ilterStream節(jié)點篩選機(jī)制能夠明顯減少匹配的時間。
圖I為本發(fā)明實施例的XML文檔樹的節(jié)點層次示例 圖2為本發(fā)明實施例的總流程 圖3為本發(fā)明實施例的節(jié)點編碼數(shù)組;
圖4為本發(fā)明實施例的Dewey*編碼示例 圖5為本發(fā)明實施例中“/A/B/C”的一輪匹配流程圖;
圖6為本發(fā)明實施例的TP的匹配流程 圖7為本發(fā)明實施例的匹配結(jié)果的輸出示例圖。
具體實施例方式下面結(jié)合附圖和具體實施例,進(jìn)一步闡明本發(fā)明,應(yīng)理解這些實施例僅用于說明本發(fā)明而不用于限制本發(fā)明的范圍,在閱讀了本發(fā)明之后,本領(lǐng)域技術(shù)人員對本發(fā)明的各種等價形式的修改均落于本申請所附權(quán)利要求所限定的范圍。準(zhǔn)備知識
I.I. I分支模式匹配
給定一個分支模式查詢Q和一個XML數(shù)據(jù)集隊^在^上的一個匹配要滿足下面兩個條件(i)滿足0上節(jié)點的謂詞表達(dá)式;(ii)滿足0上節(jié)點間的結(jié)構(gòu)關(guān)系(AD或PC)。QlD上的一個匹配可以使用n元向量以,…,式)來表示。查找D中所有Q的匹配是XML查詢處理的一個核心操作。在本文中,將分支模式匹配問題定義為
給定一個分支模式^和一個XML數(shù)據(jù)集D,查找所有的這樣一組元素,同時滿足^中節(jié)點的謂詞表達(dá)式和Q中節(jié)點之間的結(jié)構(gòu)關(guān)系。I. I. 2命名標(biāo)識
為了便于算法的描述與分析,本小節(jié)介紹文中使用的一些符號標(biāo)記、函數(shù)名稱和習(xí)慣用語。使用TP來表示分支路徑模式,SP來表示單一路徑模式。為了便于區(qū)分,在TP或SP中的節(jié)點我們稱為節(jié)點(Node),而在XML數(shù)據(jù)集中的該節(jié)點我們稱為元素(Element)。TP和SP中的節(jié)點對應(yīng)一個數(shù)據(jù)流7;,7;保存著該節(jié)點在XML數(shù)據(jù)集中的所有該元素的Dewey*編碼。數(shù)據(jù)流的每一項稱之為元素。在7;上定義了下列函數(shù)(7;)、eof{Tn)、advance (Tn) 0分別表示取7;的當(dāng)前元素;判斷是否到達(dá)I的結(jié)束位置;指向Tn的下一個元素。給定一個節(jié)點/ ,label (/ )表示/ 的Dewey*編碼'depth in)表示的深度(本文中,深度和層次表示相同的意思,可交換使用)。D印thsfc)表示/7的層次數(shù)組,記錄節(jié)點/ 出現(xiàn)的層次信息,而Depths[i]則表示獲取Depths數(shù)組的第i個元素。parent_label in') /ancestor_label (/ )表示 n 的父親或祖先節(jié)點的 Dewey* 編碼。prefix {label ifl), d)表示取/ 的前 ¢/層的 Dewey* 編碼。descendentsip)表示取/ 的所有后代節(jié)點。directBranchingOrLeafNodes (/ )(簡寫為dbl (/ ))表示返回TP中以/ 為根結(jié)點的葉子或分支節(jié)點。給定分支模式TP= ua U/b]//c[//d/f]//e/g,y, dbl (a) ={b, c},b為葉子節(jié)點,c為分支節(jié)點。I. I. 3節(jié)點層次
本方法將XML看成一棵有向樹(為了方便表示,沒有使用有向箭頭)。在XML文檔樹中,每個節(jié)點或者元素都處在一定層次上。如圖I表示一棵根結(jié)點為root的文檔樹,節(jié)點層次也標(biāo)在圖中。節(jié)點層次或深度(記為level或cbpth,本文中層次和深度意思相同)定義為
(1)若V為根節(jié)點,則depth(v) = 0 ;
(2)若r不是根節(jié)點,則depth{v) = depth {u) + I, w是r的父親節(jié)點。圖I中,root為根節(jié)點,則t/印從 (root) = 0 ;其孩子節(jié)點的深度為t/印從(root)+ 1,圖中XML文檔片段共有0,1,2,3層,第0層為根節(jié)點,是所有節(jié)點的祖先節(jié)點。第一層元素為第0層元素的孩子節(jié)點。第2,3層元素為第0,I層元素的子孫節(jié)點。任意給定XML文檔中的元素K,都處在一個層次上。給定節(jié)點name,name元素可能出現(xiàn)在XML文檔中不同層次上。例如,name元素,它可以是author元素的孩子,也可以是subject的孩子。TP中的節(jié)點對應(yīng)許多層次,本方法定義了一個深度數(shù)組Depths來記錄TP中的節(jié)點出現(xiàn)的深度。不難發(fā)現(xiàn),Depths的最大長度等于XML文檔最長路徑的長度。如圖2所示,本實施例分為五個步驟,下面具體介紹
I.2第一步對XML文檔的節(jié)點進(jìn)行Dewey*編碼
本方法的是基于節(jié)點層次信息的。因此,要求能夠根據(jù)一個節(jié)點的編碼方便地計算該節(jié)點的層次以及指定層次的祖先節(jié)點的編碼?;贒ewey編碼的局限性和PathLevel和TwigLevel算法的需求,提出了一種改進(jìn)的Dewey編碼模式一Dewey*編碼。Dewey*編碼采用編碼數(shù)組Cb而(如圖3)來編碼節(jié)點。Code由大寫字母A-Z和小寫字母a-z組成,下標(biāo)從I開始,總共52個成員。編碼規(guī)則如下
⑴若^是根節(jié)點,則label {v) = e。否則轉(zhuǎn)⑵; ⑵若r不是文本節(jié)點,且r是其父親節(jié)點的第i個孩子,則(F) = label (parent_label {v))+i/^2+Code[i mod 52] 其中,“ + ”為字符串連接運算。否則轉(zhuǎn)⑶;
⑴ 若 K 是文本節(jié)點,則 label (F) = labeliparent_label {v)) + “。如圖4所示,為根節(jié)點,則(^)為空為為七的第I個孩子,則色)=e+1/52 + Code [I mod 52] =Q+Code [I] = “0A” 必為 & 的第二個孩子,則 ( ) = e+ 2/52 + Code [2 mod 52]= “OB”+ 0 +Code [2] = “OBOB”。已知 7a知7 (Zr) = “ODOB”,貝Ijdepth {f^ 2,是其父親的第2個孩子(0 X52 + ( ‘C’ 一 ‘A’)= 2 )。其父親的編碼為 label (parent_label (Z7)) = “0D”。Dewey*編碼除具有傳統(tǒng)Dewey編碼特性之外,還具有以下特性
(1)只需要統(tǒng)計編碼中出現(xiàn)的字母個數(shù)就能夠方便地判斷節(jié)點的層次;
⑵能夠方便地確定指定層次的父親或祖先節(jié)點的Dewey*編碼;
(3)能夠支持大數(shù)據(jù)量的XML編碼,如“1234z”表示的是其父親第64269個孩子;
⑷文本節(jié)點以結(jié)尾,能夠很方便地區(qū)別文本節(jié)點和非文本節(jié)點;
(5)能夠有效地支持通過字符串匹配來判斷元素間的結(jié)構(gòu)關(guān)系。本文采用Berkeley DB來存儲節(jié)點的Dewey*編碼。Berkeley DB提供了 B-tree索引,能夠很好地支持節(jié)點數(shù)據(jù)流的檢索。節(jié)點編碼以<element_name, label (element—name) > 的形式存儲在 Berkeley DB 中。其中 element_name 為節(jié)點名稱,label (element_name)為節(jié)點element_name的Dewey*編碼。節(jié)點的Dewey*編碼也可以存儲在關(guān)系數(shù)據(jù)庫中來支持XML查詢處理。I. 3第二步進(jìn)行分支模式解析
在PathLevel和TwigLevel中,首先對分支模式進(jìn)行解析,最大可能地提取對路徑匹配有用的信息。本方法使用下面的五個數(shù)組來保存解析分支模式后得到的信息
Nodes :按照從左到右的順序保存TP中的節(jié)點名稱;
Relations :保存每個節(jié)點與其直接的父親或祖先節(jié)點的結(jié)構(gòu)關(guān)系;
BranchingNodes :保存TP中的分支節(jié)點名稱;
Pointers :記錄每個分支節(jié)點的范圍,用〈startP,endP〉來表示,WartP為Relations數(shù)組中包含“[”的數(shù)組下標(biāo),endP % Relations數(shù)組中與相對應(yīng)的包含“]”的數(shù)組下標(biāo)。有了 Pointers數(shù)組來標(biāo)識對應(yīng)分支節(jié)點的范圍,可以方便地找到以相應(yīng)的分支節(jié)點為根的所有單一路徑。Depths :記錄每個節(jié)點的深度(層次)信息。有三種表示形式
(1)Depths[i]= “7”說明匹配TP的節(jié)點Nodes[i]只出現(xiàn)在第7層;
(2)Depths[i]= “>7” 說明匹配 TP 的節(jié)點 Nodes[i]出現(xiàn)在第 J 層,7j¥axLevel,MaxLevel為XML文檔的最大深度;
(2)Depths[i]=說明匹配TP的節(jié)點Nodes[i]出現(xiàn)在第J 層,且例I.解析 TPl= “/S[.//VP/IN]//NP” 后,數(shù)組的內(nèi)容分別為=Nodes { S,VP,IN,NP } !Relations : { /,[ //,/,]// } ;BranchingNodes { S } ;Pointers {〈1,3> };Depths { 0, >1, >2, >1 }。
例2.解析 TP2= “/root/course[subj]/time/start_time” 后,數(shù)組的內(nèi)容分另Ij 為Nodes { root, course, subj, time, start_time } !Relations { /,/,[,]/,/ } ;BranchingNodes { course } ;Pointers : {〈2,3〉} ;Depths : { 0,1,2,2,3 }。對于 Relations [3] = “]/,,,說明 Nodes [3]是 Nodes [Pointers
. startP-1]的孩子;對于Relations [2]= “ 說明 Nodes [2]是 Nodes [Pointers
startP-1]的孩子。I. 4第三步讀取數(shù)據(jù)流以及節(jié)點的篩選
上一節(jié)對TP2解析后獲得的D印ths數(shù)組,可以明確地知道匹配TP2的course元素只出現(xiàn)在第I層,位于其他層次的course節(jié)點都不匹配分支模式。因此,可以直接篩選掉不是第I層的course元素。TP中的節(jié)點在XML文檔中出現(xiàn)層次是確定的,只能出現(xiàn)在第i層(OiH,H為XML文檔的最大深度)。從TP解析后獲得的D印ths數(shù)組不一定能精確地確定匹配TP的元素出現(xiàn)的層次,只能確定一個范圍,如“〉a”或“〉a〈b”。為了最大可能精確地確定節(jié)點出現(xiàn)的層次,在查找節(jié)點數(shù)據(jù)流T時,比較元素的實際層次和節(jié)點層次數(shù)組D印ths且執(zhí)行下列操作
給定元素節(jié)點a的層次數(shù)組Depths ifl),則
(I)若 depth (a》Depths (a),則 label (ay)不加入 Ta ;
⑵若 depth (a》Depths (a),則 depth (ay)加入到 Depths (a)且 label (a》加入 Ta。根據(jù)上述思想,提出了基于節(jié)點層次信息的節(jié)點篩選機(jī)制一FilterStream。在能從分支模式獲得明確的節(jié)點層次信息的情況下,F(xiàn)ilterStream能夠達(dá)到很好的節(jié)點篩選效果。特別是對于同一個節(jié)點可以出現(xiàn)在XML文檔中不同層次的情況,通過這種方法篩選節(jié)點能夠達(dá)到很好的效果。TwigLevel和PathLevel算法通過FilterStream來完成兩步操作⑴根據(jù)Depths (n)來篩選7;,篩選掉7;中層次不屬于Depths (/ )的元素?、苿h掉¢/,其中t/Depths (/ )ddepth⑴,tTn,即刪除掉Depths (/ )中節(jié)點/ 在XML文檔中未出現(xiàn)的層次。經(jīng)過FilterStream篩選和精化后,節(jié)點/ 對應(yīng)的數(shù)據(jù)流Tn只剩下符合Depths ifl)指定層次的元素;0印訪8(/7)只包含節(jié)點在文檔中實際出現(xiàn)的層次,且滿足路徑模式指定的層次范圍。I. 5第四步使用PathLevel算法來進(jìn)行單一路徑匹配
給定單一路徑模式SP= “/J勿/T’,對應(yīng)節(jié)點的數(shù)據(jù)流分別為Ta、Tb和Tc。對于(中的元素Tc”若Tci匹配SP,則Tb中存在一個Tbj滿足'TBj是Tci的父親;且Ta中存在一個Tm滿足Tm是TBj的父親。根據(jù)Dewey*編碼的特性,由Tci和Depths (B)和Depths⑷可以知道其父親節(jié)點B和祖先節(jié)點A的Dewey*編碼。為此,判斷Tci和7^.之間的結(jié)構(gòu)關(guān)系轉(zhuǎn)換為判斷Tb中否在存在(Tbi),這是字符串查找問題,可以利用現(xiàn)有的查找算法(比如二分查找,散列查找)來解決。PathLevel算法正式基于這一思想構(gòu)建起來的。圖5給出了 SP#的一輪匹配流程,從葉子節(jié)點C開始匹配自下而上匹配。從Tc的第一個元素Tc1開始,根據(jù)Tc1計算節(jié)點B的Dewey*編碼iparent_label (Jc1)),接著判斷Tb中是否存在{Tc,)。若存在,則Tc1的父親節(jié)點是凡匹配1/T’。若不存在,刪除Tb,。同樣方法繼續(xù)判斷Tb7是否匹配1//C”(層次相差2)。若存在,則Tb7匹配SP,處理&的下一個元素;若不存在,說明Tc1的祖先節(jié)點不是兒故不匹配
則可以斷定,Tb7不匹配SP,刪除化7。處理&的下一個元素。當(dāng)&中的元素全部處理完后,剩余&中的元素都匹配SP。PathLevel分為兩個階段準(zhǔn)備階段(Preparation Stage)和查詢階段 (Searching Stage)。準(zhǔn)備階段完成SP的解析、節(jié)點篩選和層次精化三個工作;獲得已經(jīng)篩選的節(jié)點數(shù)據(jù)流后,開始查詢階段。PathLevel算法從SP的葉子節(jié)點開始向上匹配。通過getLeafNode函數(shù)來獲得SP的葉子節(jié)點/ 。從葉子節(jié)點數(shù)據(jù)流Tn的當(dāng)前元素開始判斷是否匹配查詢模式SP。判斷Tn的當(dāng)前元素Z是否匹配SP,若Z匹配TP,處理下一個元素;若Z不匹配SP,從7;中刪除元素Z。在Z向上匹配的過程中, 節(jié)點層次的確定有三種可能情況(假設(shè)與葉子節(jié)點》匹配的節(jié)點是Nodes [i] = m)
Case I :若/ 與》之間只存在PC邊,貝丨J ofe/ 從fe ) = depth (fl) - C ,C為/ 和》間PC邊的數(shù)目;
Case 2 :若篩選后的》節(jié)點只出現(xiàn)一個層次上,貝U t/印從0) = DepthsO);
Case 3 :若篩選后的節(jié)點可能出現(xiàn)在許多層次上(DepthsO)中保存》可能的層次)。則 depth (m) =Depths [i], IiLen, Len 為層次數(shù)組 Depths 的長度。在確定節(jié)點的層次后,判斷元素Z與能否匹配SP規(guī)定的結(jié)構(gòu)關(guān)系。若匹配,則保留元素Z ;若不匹配,貝U從I中刪除這一步是算法的核心操作,從0))函數(shù)來提取元素Z在depth ijn)層上的祖先節(jié)點的Dewey*編碼。isFind (prefix (L,depth ijn)), T1)函數(shù)查找T1i中是否存在/Tre/ij (Z, t/印從0))的元素,若存在,貝U匹配,繼續(xù)匹配上一層節(jié)點Nodes[i+l];否則,不匹配,從7;中刪除Z。函數(shù)將節(jié)點間結(jié)構(gòu)關(guān)系判斷問題轉(zhuǎn)換為字符串查找問題,將粒度為1X1的關(guān)系匹配提升為IXN的匹配,能夠明顯地提高匹配速度。當(dāng)處理完Tn的所有元素后,Tn只剩下匹配分支模式SP的元素。這些元素就是最終的匹配結(jié)果,由這些元素可以推出所有匹配SP的元素。PathLevel由outputSolutions函數(shù)輸出最終的匹配結(jié)果。例3,考慮圖4,給定SP= U/A/B/D\對SP解析后將得到Nodes { A, B, D };BranchingNodes { } ;Pointers { } !Relations : { 1,1,1 } ;Depths { 0,1,2 } -Jjpb2,b3表示節(jié)點B在XML文檔中的不同出現(xiàn),對應(yīng)的Dewey*編碼分別為“OB”,“OC”,“OD”。節(jié)點數(shù)據(jù)流分別為 &={ “0B”,“0C”,“0D”} -Jj4=U -,Td={ “0C0B”,“0C0C”}。此時,完成了準(zhǔn)備階段的所有工作,開始查詢階段。getLeafNode (SP)函數(shù)返回為SP的根結(jié)點。L =久開始匹配Td中每一個元素,current {T0) = “0C0B”,節(jié)點A與B之間只有PC邊,滿足Case I的情況,4 在第 I 層((chptA(“OCOB,,) -1 = 1)的祖先的06硏^*編碼為“0(”,/>5/%^(75,“0C”)返回為真(第6行),說明“0C0B”匹配“沒勿”,即“0C0B”是沒的孩子。接著“0C0B”匹配兒同樣,4節(jié)點是J的子孫。因為J是最頂層的節(jié)點(根結(jié)點),則匹配結(jié)束,“OCOBK)匹配SP。然后處理中的一下個元素“OCOC”,顯然,“OCOC”也匹配查詢路徑SP。此時,的最后一個元素處理結(jié)束,查詢結(jié)束,&保留著匹配SP的所有D節(jié)點的Dewey*編碼。輸出&得到匹配結(jié)果'd入“0C0B”),4( “OCOC”)。I. 6第四步使用TwigLevel算法來進(jìn)行分支路徑匹配
在PathLevel算法的基礎(chǔ)上,發(fā)展了 TwigLevel算法來解決分支模式匹配問題。從分支節(jié)點開始到葉子節(jié)點的單一路徑采用PathLevel算法來處理。對于一個分支模式TP來說,它可以拆分為若干個單一路徑。本方法引入查詢區(qū)域的概念(見定義I),一個分支模式對應(yīng)若干個查詢區(qū)域,一個查詢區(qū)域有若干個單一路徑組成。例4,對于 Tpy/root/course[subj]/time/start_time”,TP 可以分為兩個區(qū)域 R1和 R2,在 Ri 中包含單一路徑 SP1= “root/course”;在 R2 中包含 SP1= “course/time/start_time”, SP2= “course/subj”。 TwigLevel算法采用自下而上的匹配順序。給定分支模式TP,首先處理區(qū)域R2,獲得已經(jīng)過篩選的節(jié)點數(shù)據(jù)流TMUrs6,Tsubj- Tstart tim6。每個葉子節(jié)點保存了從根節(jié)點到該節(jié)點的所有路徑信息,一個區(qū)域匹配結(jié)束后,只需根據(jù)該區(qū)域根節(jié)點和葉子節(jié)點數(shù)據(jù)流(已更新)就可以構(gòu)造出該區(qū)域的匹配結(jié)果。如圖6,區(qū)域R2中,course為R2的根節(jié)點,則R2的匹配結(jié)果只需由T__,Tsubj,Tstart—time即可構(gòu)成。而對于R2,可以分為兩個單一路徑,SP1= “course/time/start_time”,SP2= “course/subj”。匹配 SP1 和 SP2 使用 PathLevel 算法。在區(qū)域R2中,SP1的路徑長度為2,SP2路徑長度為I,因此,首先計算SP1,然后計算SP20在SP的匹配結(jié)果保存上,同樣我們只需要保存SP的根節(jié)點和葉子節(jié)點的數(shù)據(jù)流。匹配完區(qū)域R2后,匹配區(qū)域R1,因為區(qū)域R1包含了分支模式TP的根節(jié)點,所以處理完區(qū)域R1后,整個匹配過程結(jié)束,輸出最終的匹配結(jié)果,TwigLevel算法結(jié)束。TwigLevel在匹配單一路徑時,使用PathLevel算法完成匹配,但不同于PathLevel算法的是,除了要動態(tài)維護(hù)葉子節(jié)點的數(shù)據(jù)流之外,還需要動態(tài)維護(hù)分支節(jié)點的數(shù)據(jù)流,確保每一個分支節(jié)點中的元素在一個區(qū)域匹配結(jié)束后,都是該區(qū)域的匹配結(jié)果。定義I.查詢區(qū)域(Region):給定一個分支模式TP,則TP的根結(jié)點對應(yīng)一個查詢區(qū)域;若觀為TP中的一個分支節(jié)點,對于_,從分支節(jié)點觀到節(jié)點的路徑為一條單一路徑SPi,所有這些由iW出發(fā)到/7的單一路徑SPn構(gòu)成了一個查詢區(qū)域Rbn。圖6中,從節(jié)點course出發(fā)有兩條單一路徑SP1和SP2,SP1和SP2構(gòu)成了 TP的一個查詢區(qū)域R。TwigLevel中,以一個查詢區(qū)域R為一個查詢單元,在每一個R中,分別使用PathLevel來匹配每一條單一查詢路徑SP’除了要移除Tn中不匹配SP的元素,還要移除Tbn中不匹配SP的元素。在區(qū)域R中,分別匹配每一個單一查詢路徑SP。查詢區(qū)域R的所有SP都匹配結(jié)束后,TwigLevel能確保葉子節(jié)點數(shù)據(jù)流Tn中的每一個元素都匹配對應(yīng)的單一路徑SP,確保分支節(jié)點數(shù)據(jù)流Tbn中的每一個元素都匹配所有的以iW為根結(jié)點的單一路徑SP0接著,處理上一層的查詢區(qū)域(同一層次的查詢區(qū)域從左到右依次處理)。當(dāng)處理到根結(jié)點所在查詢區(qū)域時,查詢結(jié)束。調(diào)用outputSolutions函數(shù)輸出匹配結(jié)果。在一個查詢區(qū)域R中,匹配每條SP的次序按照SP的葉子節(jié)點在Nodes中的相反的順序進(jìn)行。為了更快的匹配速度,可以根據(jù)每條SP的長度,Tn的元素數(shù)目等參數(shù)綜合考慮來決定處理SP的先后次序。圖7的匹配順序為R2(SP1SP2)Rp
TwigLevel也分為兩個階段準(zhǔn)備階段和查詢階段。準(zhǔn)備階段和PathLevel —樣,完成分支模式解析、節(jié)點篩選和節(jié)點層次精化三個工作。TwigLevel算法的整體流程,按照自下而上,從左到右的順序處理每一個查詢區(qū)域直到根結(jié)點,匹配結(jié)束。分別匹配以分支節(jié)點辦為根結(jié)點的每條單一路徑SP。輸出最終的匹配結(jié)果。例5.考慮圖 4,給定 TP= VA [ //D] ICIF’,節(jié)點數(shù)據(jù)流 Ta= {} 'Td二 { “0C0B,,,“0C0C”},Tc={ “0E”},7>={ “0E0C”}。TP只有一個分支節(jié)點兒有一個查詢區(qū)域R,R有兩條單一路徑SP1= I/C和SP2= I/勿”。查詢階段開始時,6 = k, dbl (b) = {D,F},先匹配SP1,匹配結(jié)束后,節(jié)點數(shù)據(jù)流中的元素為/;={},葉子節(jié)點7>={ “0E0C”};然后匹配SP2,匹配結(jié)束后Ta= {}, Td ={ “OCOB,,,“OCOC,,};因為J為TP的根結(jié)點,則結(jié)束查詢。調(diào)用outputSolutions ⑷輸出最終的匹配結(jié)果為[,“0C0B”,“0C”,“0E0F” ],[,“OCOC”,“0C”,“0E0F”]。I. 7第五步使用outputSolutions來輸出匹配結(jié)果
分支模式匹配最終匹配結(jié)果輸出從層次最高的根結(jié)點開始,自上而下輸出匹配結(jié)果。給定TP= “/A[. ./幻/…/燈…/例/…/萬”,圖7演示了匹配結(jié)果的輸出過程。Ta, Tb, Tc,Td,分別對應(yīng)節(jié)點A,B,C,D,E的數(shù)據(jù)流。SP1和SP2表示節(jié)點E, D到C的單一路徑;SP3和SP4表示節(jié)點凡C到J的單一路徑,且Ze/設(shè)從(SPi, i =1,2,3,4) >= I。在TP中,節(jié)點J是層次最高的分支節(jié)點,故匹配結(jié)果輸出從節(jié)點乂開始。Ctfrre/ (⑷=S1,輸出[aj ;在Tj中有/Tre/iz G1Id1) =a17 prefix ^b2) = a:,輸出 Ha1ID1, 然后處理右孩子,在 T1c 中,,輸出[a7c7];因為節(jié)點C是分支節(jié)點,所以繼續(xù)處理C1節(jié)點的左右孩子。
中,/Tre/iz Ca1C1(I1) =B1CpZTrefijT Ca1C1(I2) =B1C1,輸出[B1C1Cl1, B1C1Cl2];而 T1ir 中,/Tre/iz Ca1C1...
e) =prefix= B1C1,輸出[已而…一”已而…一乞]。所以,圖7中,與TP匹配且以a:為根節(jié)點的結(jié)果為[aj,Ea1ID1,已九],La1C1],La1C1...e1; aiCp.eJ之間的笛卡爾積。例如Iia1, B1Clj B1C^e1 ], [a1; B1Clj已而…一」等都是最終匹配結(jié)果。顯然,可以采用遞歸程序來輸出匹配結(jié)果。outputSolutions從分支模式的根結(jié)點n開始,首先輸出n的數(shù)據(jù)流Tn的當(dāng)前元素。PathLevel或者TwigLevel算法保證Tn中的所有元素都是匹配對應(yīng)的路徑模式(即都能形成最終的匹配結(jié)果)。接著處理每一個/;,eg Wfc),若e為葉子節(jié)點,則直接輸出7;中以current {Tn)為前綴的元素~ ,若e為分支節(jié)點,則以相同的方式處理e (調(diào)用遞歸函數(shù)outputSolutions (e))。
權(quán)利要求
1.一種自下而上的XML分支模式匹配方法,其特征在于,包括如下步驟 第一步采用Dewey*編碼模式對XML文檔進(jìn)行節(jié)點編碼,將姆個節(jié)點的Dewey*編碼存入 Berkeley DB 中; 第二步進(jìn)行分支模式解析,使用五個數(shù)組來記錄分支模式解析的結(jié)果; 第三步讀取數(shù)據(jù)流,同時進(jìn)行數(shù)據(jù)流中元素的篩選;所述數(shù)據(jù)流中元素的篩選為基于節(jié)點層次信息的節(jié)點,其篩選機(jī)制是FilterStream,通過對分支模式和查詢數(shù)據(jù)集中對應(yīng)節(jié)點層次的分析來篩選元素; 第四步執(zhí)行單一路徑匹配或者分支路徑匹配,單一路徑匹配PathLevel和分支路徑匹配TwigLevel算法采用自下而上的匹配順序,使判斷節(jié)點間結(jié)構(gòu)關(guān)系的問題就轉(zhuǎn)變?yōu)樽址檎覇栴},從而可以通過查找處理分支模式匹配問題; 第五步輸出最終的匹配結(jié)果。
2.如權(quán)利要求I所述的自下而上的XML分支模式匹配方法,其特征在于,所述步驟ニ中,五個數(shù)組包括 Nodes :按照從左到右的順序保存TP中的節(jié)點名稱; Relations :保存姆個節(jié)點與其直接的父親或祖先節(jié)點的結(jié)構(gòu)關(guān)系; BranchingNodes :保存分支模式TP中的分支節(jié)點名稱; Pointers :記錄姆個分支節(jié)點的范圍,用く startP,endP〉來表示,·siari/*為Relations數(shù)組中包含“[”的數(shù)組下標(biāo),endP % Relations數(shù)組中與·siari/7相對應(yīng)的包含“]”的數(shù)組下標(biāo); Depths :記錄姆個節(jié)點的深度或?qū)哟涡畔?有三種表示形式 (1)Depths[i]= “7”說明匹配TP的節(jié)點Nodes[i]只出現(xiàn)在第7層;(2)Depths [i] = “ >7 ” 說明匹配 TP 的節(jié)點 Nodes [i]出現(xiàn)在第 J 層,7j¥axLevel,MaxLevel為XML文檔的最大深度; (3)Depths[i]=說明匹配TP的節(jié)點Nodes[i]出現(xiàn)在第J層,且7フヵ。
3.如權(quán)利要求I所述的自下而上的XML分支模式匹配方法,其特征在于,所述步驟三中,其中,F(xiàn)ilterStream的篩選原則如下 給定元素Hi節(jié)點a的層次數(shù)組分別為Depths (a,·), depth^a1),則若 depth (a,.) Depths (a),則 Dewey* 編碼 label (a,·)不加入數(shù)據(jù)流 Ta ;若 depth Cai) Depths (a),則 depth Cai)加入到 Depths (a)且 Dewey* 編碼 label Cai)カロ入數(shù)據(jù)流/;。
4.如權(quán)利要求I所述的自下而上的XML分支模式匹配方法,其特征在于,所述步驟四中,單一路徑匹配PathLevel或分支路徑匹配TwigLevel算法采用自下而上的匹配,具體匹配步驟是把判斷元素&(も7;) m八帥是否滿足PC或AD關(guān)系的操作轉(zhuǎn)化為判斷prefix {a,, depth {b))在數(shù)據(jù)流Tb中是否存在;若存在,則數(shù)據(jù)流Tb中存在a,.的父親或者祖先節(jié)點;否則,不存在;其中prefix {aいdepth <ΦΥ)表示取元素愈depth Qd)層的Dewey* 編碼。
全文摘要
本發(fā)明公開了一種自下而上的XML分支模式(TwigPattern)匹配方法,采用自下而上的匹配順序。首先解析分支模式,解析結(jié)果保存在Nodes,Depths,Relations,BranchingNodes,Pointers五個數(shù)組里。在獲取節(jié)點層次信息的基礎(chǔ)上,采用FilterStream節(jié)點篩選機(jī)制來篩選不符合層次要求的元素。然后進(jìn)行分支模式匹配;通過判斷節(jié)點的父親或祖先節(jié)點的編碼是否存在來確定節(jié)點間的結(jié)構(gòu)關(guān)系,將節(jié)點間結(jié)構(gòu)關(guān)系的判斷轉(zhuǎn)換為字符串查找問題,從而將元素間一對一的結(jié)構(gòu)關(guān)系判斷轉(zhuǎn)換為元素間一對多的判斷;達(dá)到利用現(xiàn)有的字符串查找技術(shù)來解決分支模式匹配問題。
文檔編號G06F17/30GK102760173SQ20121022910
公開日2012年10月31日 申請日期2012年7月2日 優(yōu)先權(quán)日2012年7月2日
發(fā)明者付言章, 任鋒, 馮鈞, 唐志賢, 徐黎明, 朱祖會, 王祥忠, 盛震宇 申請人:河海大學(xué)