專利名稱::基于部分二進制前綴編碼的xml流緩存管理方法
技術(shù)領(lǐng)域:
:本發(fā)明屬于可擴充標(biāo)記語言(XML)管理
技術(shù)領(lǐng)域:
,具體涉及一種針對XML流的XQuery查詢的緩存管理方法。
背景技術(shù):
:在新的需求背景下,人們在20世紀90年代初,提出了一種新型的數(shù)據(jù)模型,即數(shù)據(jù)流處理模型。例如,在事件驅(qū)動的股票行情系統(tǒng)中,一個典型用例是將過去10分鐘內(nèi)價格上升10%的所有股票的名稱發(fā)送給某個用戶;再例如,在一個網(wǎng)絡(luò)分析系統(tǒng)中,報告所有具有某些特定目的地址的包。這類應(yīng)用的共同特點是實時地、持續(xù)地處理連續(xù)到達的、無限的數(shù)據(jù)流。傳統(tǒng)的數(shù)據(jù)庫管理技術(shù)不能適用于這樣的應(yīng)用。傳統(tǒng)數(shù)據(jù)庫管理系統(tǒng)的主要特點是數(shù)據(jù)持久存儲,在某一時刻執(zhí)行查詢并通過穩(wěn)定查詢計劃給出精確的回答;而數(shù)據(jù)流管理系統(tǒng)強調(diào)數(shù)據(jù)在線到達、查詢持久存儲,并且能夠在有限內(nèi)存中單遍處理數(shù)據(jù)流。由于可擴充標(biāo)記語言(XML)已經(jīng)成為Web上數(shù)據(jù)交換的標(biāo)準,用于各種應(yīng)用和信息源之間的數(shù)據(jù)交換,XML流處理的理論和技術(shù)引起工業(yè)界和學(xué)術(shù)界的廣泛關(guān)注。這類系統(tǒng)面臨的一個挑戰(zhàn)是面對海量的用戶查詢(通常用XQuery[1]查詢語言或XPath[2]查詢語言)所產(chǎn)生的大量結(jié)果,如何對返回結(jié)果集進行有效管理,使系統(tǒng)能夠在有限的內(nèi)存中實時、高效地處理用戶查詢。對于XQuery[1]查詢,當(dāng)查詢處理引擎遇到某些XML元素的時候,并沒有足夠的信息來判斷是否該元素就是最終結(jié)果的一部分,此時,則必需對某些元素進行緩存。圖1列出了一個XQuey查詢,它要求列出Addison-Wesley出版社在1991年后出版的書的名字和出版時間。若XML流中的″title″在″year″之前到達,該查詢在遇到″title″時,并沒有足夠的信息來判斷″year″是否滿足條件,因此,需要先將″title″緩存起來。XML流查詢系統(tǒng)所需的空間可能會隨著查詢結(jié)果集的增長呈指數(shù)級增長,使得查詢結(jié)果集變得十分巨大。例如,對于納斯達克的實時股票行情服務(wù)系統(tǒng),假定每秒到達的消息個數(shù)是5000個,消息的數(shù)據(jù)量是1KB,用戶查詢的數(shù)量是1千萬個,查詢的平均匹配率是0.001%,則結(jié)果集的數(shù)據(jù)量可能達到大約每秒4G。已有許多XML流處理系統(tǒng),其中,很多研究采用基于自動機的方法處理XML流數(shù)據(jù)[3,4,5,6,7,8,9];也有一些采用基于索引的方法[10],基于BloomFilter的方法[11]以及FiST方法[12]等。需要指出的是,這些方法都只是用作過濾器,向用戶返回真假值(表示XML流是否與查詢相匹配),而不是向用戶返回查詢結(jié)果的內(nèi)容,因而根本沒有考慮結(jié)果集的緩存管理。參考文獻[13]針對XML流,系統(tǒng)地研究了XPath的緩存管理問題。他們針對具有謂詞的XPath表達式,考慮緩存所需的最小邊界。他們給出處理非遞歸XML流的算法,并指出一個只包含前向軸的XPath查詢在處理非遞歸文檔時的空間和時間復(fù)雜度。該研究沒有考慮算法同時處理多個XPath查詢時的情況。另外,也沒有考慮XQuery查詢結(jié)果集的緩存管理。相對于XPath,XQuery則要復(fù)雜得多。XSQ[14]也初步討論了針對XPath的緩存管理問題。XSQ使用緩存區(qū)暫存可能的結(jié)果,其緩存操作是由自動機驅(qū)動的。XSQ同樣只是考慮單個XPath查詢,沒有涉及XQuery查詢的緩存結(jié)果管理問題。TurboXPath[15]和FluX[16]采用XQuery表示用戶的查詢,同時考慮了查詢結(jié)果的緩存管理。TurboXPath使用一個輸出緩存來存儲可能的返回結(jié)果并保持他們的順序。由于他們的輸出緩存中緩存了一些中間結(jié)果,并且采用后置處理的方法在構(gòu)造返回結(jié)果元組時對節(jié)點集合之間進行連接操作,因而影響了算法的效率以及增加了緩存的空間耗費。FluX只考慮了在DTD模式下如何優(yōu)化XQuery查詢結(jié)果的緩存管理,并且不能處理″//″軸。這兩種方法也沒有考慮同時處理多個查詢。XSM[17]支持XQuery的緩存管理,但是不支持遞歸、嵌套的XML文檔。
發(fā)明內(nèi)容本發(fā)明的目的在于提出一種能夠有效實現(xiàn)針對XML流的XQuery查詢結(jié)果的緩存管理方法,并能夠避免產(chǎn)生不必要的中間結(jié)果。本發(fā)明提出的針對XML流的XQuery查詢結(jié)果緩存管理方法是基于部分二進制前綴編碼的XML流緩存管理方法,記為BBM。方法的具體步驟如下(1)構(gòu)造XQuery查詢的緊湊查詢樹,將用戶提交的所有XQuery查詢構(gòu)造為單顆緊湊查詢樹,并為每一個返回節(jié)點構(gòu)造一個緩存池;在緊湊查詢樹中,所有查詢共享公共前綴;(2)查詢匹配,查詢匹配過程包括自頂向下和自底向上兩部分,在查詢匹配的過程中,執(zhí)行緩存管理的基本操作,包括進行緩存結(jié)果的加入和刪除等;(3)緩存管理過程,緩存管理過程優(yōu)化與XQuery查詢匹配的返回結(jié)果的緩存,包括(a)建立緩存管理的數(shù)據(jù)結(jié)構(gòu)XQuery查詢中的每一個緩存節(jié)點對應(yīng)于一個緩存池,所有緩存池構(gòu)成一個鏈表,其中,每兩個緩沖池之間的鏈接由緩存池中返回節(jié)點之間的語義關(guān)系定義,包括父子關(guān)系、子孫關(guān)系、兄弟關(guān)系、共同祖先關(guān)系等;(b)建立基于運行時棧的部分二進制前綴編碼表示,通過運行時棧驅(qū)動基于二進制的前綴編碼,在運行時確定結(jié)果集中節(jié)點之間的關(guān)系,盡早構(gòu)成返回結(jié)果元組,避免中間結(jié)果集之間的連接操作;(c)進行返回結(jié)果的緩存管理。1.構(gòu)造XQuery查詢的緊湊查詢樹(1)將XQuery表示為一顆緊湊查詢樹。一顆緊湊查詢樹是表示XQuery的查詢樹,其中的節(jié)點稱為查詢節(jié)點(QNode),具有惟一標(biāo)識,查詢節(jié)點分為以下幾種類型(a)OQNode不帶有謂詞的定位步,稱為通常查詢節(jié)點(OrdinaryQueryNode,OQNode)。在緊湊查詢樹中,OQNode關(guān)聯(lián)相關(guān)信息,包括節(jié)點名字(“*”的名字為“*”)和表示父子(“/”)或子孫(“//”)關(guān)系的算子,用兩元組<name,“/”or“//”>表示。(b)PQNode帶有謂詞的定位步稱為謂詞查詢節(jié)點(PredicateQueryNode,OQNode)。謂詞查詢節(jié)點是緊湊查詢樹中的特殊節(jié)點,它通過邏輯關(guān)系將其子樹連接起來。除了節(jié)點標(biāo)識,節(jié)點名和“/”或者“//”外,還關(guān)聯(lián)一個邏輯表達式。該邏輯表達式在內(nèi)部表示為抽象語法樹。該抽象語法樹的每一個葉子節(jié)點都維護一個到其對應(yīng)的節(jié)點(謂詞節(jié)點的孩子節(jié)點)的引用。(c)RNode返回結(jié)果節(jié)點(ReturnNode),即是指那些構(gòu)成XQuery結(jié)果元組的節(jié)點。(2)標(biāo)識謂詞子樹(PredicateSub-Tree)。在一個緊湊查詢樹中,以距離根節(jié)點最近的謂詞節(jié)點為根所形成的子樹稱為謂詞子樹。同時擴充相應(yīng)的節(jié)點結(jié)構(gòu)謂詞子樹中的OQNode(葉子節(jié)點除外),也關(guān)聯(lián)一個邏輯表達式,該邏輯表達式是只含有一個項,即其孩子節(jié)點的標(biāo)識。而如果OQNode是葉子節(jié)點,則含有一個邏輯標(biāo)記,初始為真(TRUE),當(dāng)遇到CLOSE事件后,將邏輯標(biāo)記的值賦為假(FALSE)。(3)標(biāo)識接受節(jié)點(AcceptingNode)。在一顆緊湊查詢樹的表示中,距離根節(jié)點最近的謂詞節(jié)點稱為該樹所表示查詢的接受節(jié)點。如果計算過程中,接受節(jié)點相關(guān)邏輯表達式的值為真,則該文檔與查詢匹配。如果一個XQuery表達式是不帶謂詞的一般查詢(XP{/,//,*}),其接受節(jié)點則是其通常查詢樹的葉子節(jié)點。如果在匹配過程中到達接受節(jié)點,則該文檔與查詢匹配。圖1中的XQuery的緊湊查詢樹如圖2所示,其中,粗線矩形框表示接收節(jié)點,帶陰影矩形框表示返回節(jié)點。在來自用戶的大量查詢中,可能會具有許多共同的部分,共享其共同部分可以節(jié)省系統(tǒng)的存儲空間和執(zhí)行時間。因此,將所有的XQuery查詢的查詢樹合并為共享前綴的單顆緊湊查詢樹。合并步驟具體如下(1)對于任意兩個XQuery查詢Qa和Qb,其共享前綴的緊湊小枝模式查詢樹為Qab。(2)為Qab創(chuàng)建一個根r0,以Qa為基礎(chǔ)構(gòu)造Qab。(3)前序遍歷Qa和Qb,若Qb中存在與Qa節(jié)點名以及算子(“/”或“//”)相同的前綴則可以合并,否則,將Qb中的節(jié)點加入到Qa中。(4)重復(fù)步驟(3),直到完成對Qb的遍歷。2.查詢匹配在對XML數(shù)據(jù)流處理的過程中,對帶有謂詞的節(jié)點及其子節(jié)點,采用自底向上的匹配過程,而對于其它部分則采用自頂向下的匹配過程,因此,查詢匹配過程分為OPEN和CLOSE兩部分。(a)OPEN事件通過回調(diào)函數(shù)調(diào)用該句柄,傳入事件名字,元素名字和元素的文檔層次;對每一個到達的XML元素,進行節(jié)點測試和文檔層次檢查;如果節(jié)點檢查返回TRUE,則該節(jié)點被壓入一個運行時棧;若遇到的節(jié)點是PQNode或謂詞子樹的子節(jié)點,其狀態(tài)標(biāo)記的值設(shè)為FALSE。若遇到的節(jié)點是一個查詢的接受節(jié)點,且不是PQNode節(jié)點,則一個查詢匹配發(fā)生。若遇到的節(jié)點是同一節(jié)點的不同層次(遞歸文檔會出現(xiàn)這種情況),則將其作為不同的狀態(tài)節(jié)點,用節(jié)點標(biāo)識和文檔層次來共同識別該狀態(tài)節(jié)點。如果該接受節(jié)點是PQNode,則需要等到遇到CLOSE事件時才能判定文檔與查詢是否匹配。若遇到的是返回結(jié)果節(jié)點(RNode),則將該節(jié)點放入緩存池中。(b)在CLOSE事件發(fā)生時,如果遇到的節(jié)點是OQNode,簡單地將節(jié)點從棧中彈出。如果遇到的節(jié)點是PQNode或謂詞子樹的子節(jié)點,將執(zhí)行下列步驟a)如果是葉子節(jié)點,將其狀態(tài)標(biāo)記賦為TRUE,意味著該節(jié)點匹配成功.從運行棧彈出該節(jié)點,并將當(dāng)前棧頂對應(yīng)的節(jié)點中相關(guān)的邏輯表達式中對應(yīng)的項賦值為TRUE;如果是謂詞子樹中的中間節(jié)點,計算其邏輯表達式,若為TRUE,則其狀態(tài)標(biāo)記賦值為TRUE,否則為FALSE,從棧中彈出該節(jié)點,并將當(dāng)前棧頂節(jié)點的相關(guān)邏輯表達式中的對應(yīng)項賦值為其狀態(tài)標(biāo)記的值(TRUE或FALSE)。如果是一個查詢的接受節(jié)點,計算其邏輯表達式,并將邏輯表達式的結(jié)果賦給狀態(tài)標(biāo)記。如果是TRUE,則文檔與該查詢匹配;如果是FALSE,則文檔與該查詢不匹配。如果是一個返回節(jié)點,在確定匹配成功或失敗時,從緩存中刪除相應(yīng)節(jié)點。3.緩存管理過程在查詢的過程中,由于需要單遍處理XML流,因此,當(dāng)遇到返回節(jié)點的時候,要將該節(jié)點放入緩存中。緩存中存儲的是可能的查詢結(jié)果集,如前面所述,它對XML流數(shù)據(jù)處理的質(zhì)量有著重要的影響。為了優(yōu)化XML流處理的緩存管理,我們提出需要遵循的四個原則(a)緩存中只存放可能構(gòu)成結(jié)果元組的節(jié)點;(b)盡早刪除緩存中不滿足條件的返回節(jié)點;(c)盡早將緩存中滿足條件的節(jié)點構(gòu)造為結(jié)果元組分發(fā)給用戶,并且從緩存中刪除后面不會再使用的返回節(jié)點;(d)共享緩存中的多個查詢的返回結(jié)果的公共節(jié)點。3.1建立緩存管理的數(shù)據(jù)結(jié)構(gòu)本發(fā)明定義一組緩存池來存放要緩存的節(jié)點。緩存池是存放緩存節(jié)點的動態(tài)數(shù)組,而對于每一個返回節(jié)點,都定義一個緩存池與其相關(guān)聯(lián)。根據(jù)用戶提交的查詢可以得知不同緩存池中的節(jié)點之間應(yīng)該具有的語義關(guān)系(父子關(guān)系、子孫關(guān)系、兄弟關(guān)系、共同祖先關(guān)系),并用這樣的關(guān)系將這些緩存池鏈接起來。這樣,各個緩存池中節(jié)點根據(jù)緩存池之間的語義關(guān)系鏈接起來的一條路徑,就構(gòu)成了返回結(jié)果中的一個元組,同時又保證了元素之間的順序關(guān)系。考慮圖3(a)顯示一個XML文檔D1和圖3(b)顯示的查詢Q1。對于文檔D1和查詢Q1,要向用戶返回所有滿足a的子孫c和b構(gòu)成的元組,即{<c1,b1>,<c1,b2>}。根據(jù)查詢Q1,緩存池b中的節(jié)點與緩存池a中的節(jié)點之間的語義關(guān)系是具有共同的祖先a。當(dāng)查詢處理遇到D1中c1元素時,因為它是返回節(jié)點,所以將其放入與c關(guān)聯(lián)的緩存池;當(dāng)遇到b1元素時,將b1放入與b相關(guān)聯(lián)的緩存池中,因為c1和b1具有共同的祖先a,所以建立c1到b1的引用;當(dāng)確定查詢Q1得到滿足時,可將(c1,b1)組成的元組返回給用戶;在遇到元素b2時,將b2放入與b相關(guān)聯(lián)的緩存池中(由于b2和c1具有共同的祖先a,建立c1到b2的引用),當(dāng)確定詢查Q1再次得到滿足(又得到一個滿足查詢的元組),可將(c1,b2)組成的元組返回給用戶。如圖3(b)中的Buffer1所示。再考慮圖3(c)中的文檔D2和圖3(d)查詢Q2,用戶希望返回所有由a元素的子元素c和b組成的元組。當(dāng)查詢處理遇到D2中的c1元素時,將其緩存于c的緩存池中;同樣,c2也是如此;遇到b2元素時,將其緩存于b的緩存池中。根據(jù)查詢Q2,要求c的緩存池中的元素和b的緩存池中的元素是兄弟關(guān)系?,F(xiàn)在,由于a是接受節(jié)點,故對其進行謂詞邏輯表達式運算并確定結(jié)果為真,由此得到查詢的一個匹配。此時,c的緩存池中分別有c1和c2元素,b節(jié)點緩存池中有一個b2元素,因此,必須判定匹配的結(jié)果是(c2,b2)而不是(c1,b2),因為c1和b2并不是兄弟節(jié)點。為此,本發(fā)明采用基于運行時棧的前綴編碼來進行判斷。3.2建立基于運行時棧的部分二進制前綴編碼表示當(dāng)返回結(jié)果中包含兩個以上的節(jié)點時,如果要確定緩存中的節(jié)點是否構(gòu)成合法的返回元組,就需要判斷它們是否滿足查詢所要求的節(jié)點之間的關(guān)系,例如,子孫關(guān)系、父子關(guān)系、兄弟關(guān)系(如圖3(c)中的c2和b2)、共同祖先關(guān)系(兩個元素是否具有某個共同的祖先,如圖3(a)中的c1和b2元素,其共同祖先是a元素)等。利用基于前綴的編碼方法,可以很容易判斷我們需要的各種關(guān)系。前綴編碼的大致思想是在一個文檔樹中,假定某個父節(jié)點的編碼是P_Code,對于它的每個子節(jié)點Ci,算法分配給它們各自互不相同的某個獨立編碼Ci_Code,則子節(jié)點的最終編碼是由父節(jié)節(jié)點編碼作為前綴碼跟自身的獨立編碼進行串接構(gòu)成的,即C_Code=P_Code·Ci_Code.由此可知,如果節(jié)點a是節(jié)點b的祖先,則b編碼的前綴必然包含a的編碼;如果節(jié)點a是節(jié)點b的兄弟,則a的前綴碼必然與b的前綴碼相同等等。在實際實現(xiàn)中,本發(fā)明使用一種二進制串前綴編碼方案。這種編碼的方法是根節(jié)點編碼為空串empty;為任一個節(jié)點X下的第i個子節(jié)點Y分配一個二進制串bits(i);子節(jié)點的編碼Label(Y)就是其父節(jié)點的編碼與分配的二進制串的連接即Label(X)·bits(i)。分配的二進制串bit(s),必須滿足子節(jié)點的編碼是前綴無關(guān)(prefix-free)的,即沒有一個子節(jié)點的編碼是另一個的前綴。這種bit(s)函數(shù)有很多種,我們使用bits(i)=1i-10.如圖4所示(節(jié)點10不是節(jié)點0.10的祖先節(jié)點,因為10不是0.10的一個前綴。節(jié)點0.10與0.110是兄弟節(jié)點,則它們的前綴碼(父節(jié)點的編碼)必然相同)。根據(jù)前綴編碼,通過兩個基本操作(父子關(guān)系和子孫關(guān)系)可以確定兩個節(jié)點之間的任何關(guān)系。在本發(fā)明的查詢匹配過程中,只需要在返回結(jié)果的緩存管理時候才會使用文檔節(jié)點的二進制編碼信息。因此,本發(fā)明不是對整個文檔編碼,而是只對進入運行時棧的節(jié)點編碼,這樣,通過縮小編碼的范圍,可以提高處理的效率。定理1在前面查詢匹配算法中,對于XML文檔D(它對應(yīng)于一顆文檔樹T)和查詢Q,進入運行時棧查詢節(jié)點所對應(yīng)文檔元素構(gòu)成了一棵文檔樹T′,T′與原文檔樹T同根,并且是T的一顆子樹。證明從前面查詢匹配算法的運算過程可以得知,處理引擎通過SAX解析器獲得輸入文檔D的事件流,對文檔D的處理順序?qū)嶋H上是按照對其文檔樹T的先序遍歷順序進行的對每一個到達的XML元素,進行節(jié)點測試和文檔層次檢查,當(dāng)一個節(jié)點包含父子軸算子時,文檔層次要求相同;當(dāng)一個節(jié)點包含子孫軸算子時,忽略文檔層次的檢查.當(dāng)查詢節(jié)點名字是“*”時,節(jié)點名字的測試永遠返回TRUE;如果節(jié)點檢查返回TRUE(即節(jié)點匹配發(fā)生),則相應(yīng)的文檔節(jié)點被壓入運行時棧.因此,進入運行時棧的文檔D的節(jié)點是與查詢Q匹配的那些節(jié)點,而不滿足查詢匹配的節(jié)點是不會進入到運行時棧中的,那么,它對應(yīng)的文檔節(jié)點自然就是可能與查詢匹配的那部分文檔,而且是與原文檔樹T同根的文檔樹T′,顯然,T′是T的一顆子樹.例如,圖5的右面是用戶提交的查詢Q3,左面表示的是對應(yīng)的一顆XML文檔樹D3。在XML流處理過程中,對于查詢Q3,進入運行時棧的查詢節(jié)點對應(yīng)的XML文檔部分就是在文檔樹中用曲線勾勒出來的部分,這部分構(gòu)成一棵與原文檔的同根的子樹.因此,由運行時棧驅(qū)動進行的前綴編碼,只是對整個XML文檔的一部分進行編碼,而同時又能正確地反映文檔節(jié)點之間的關(guān)系。3.3進行返回結(jié)果的緩存管理。返回結(jié)果的緩存管理包括下面幾個主要功能向緩存中加入返回節(jié)點;構(gòu)造滿足用戶查詢條件的元組,并將結(jié)果元組分發(fā)給用戶;從緩存中刪除無用的節(jié)點;緩存結(jié)果的共享。(1)向緩存中加入返回節(jié)點。對于XQuery查詢的一顆緊湊查詢樹,當(dāng)在XML流處理過程中遇到返回節(jié)點,則將該節(jié)點放入緩存。由于緩存中必然存放的是可能構(gòu)成結(jié)果元組的節(jié)點,因此,遵循原則1是很自然的。(2)構(gòu)造結(jié)果元組。在將緩存節(jié)點放入緩存池的時候,同時構(gòu)造結(jié)果元組。直觀地講,構(gòu)造結(jié)果元組的一個時機是在查詢匹配過程完成后,通過不同節(jié)點集合之間的連接操作來確定哪些節(jié)點可以組成一個滿足查詢條件的結(jié)果元組。但這樣做有兩點不足其一,構(gòu)造的返回結(jié)果元組構(gòu)造可能含有中間結(jié)果(即含有不滿足用戶查詢條件的結(jié)果節(jié)點),從而增加緩存的空間耗費;其二,節(jié)點集合之間的連接操作會增加系統(tǒng)的時間耗費。因此,本發(fā)明提出在查詢匹配的過程中,根據(jù)節(jié)點的二進制前綴編碼和緩存池之間的語義鏈接來構(gòu)造滿足查詢條件的結(jié)果元組。(3)緩存管理的刪除操作要遵循原則3,需要在兩種情況下及時從緩存中刪除相應(yīng)節(jié)點第一,在查詢匹配的過程中,當(dāng)確定匹配不成功時,及時從緩存中刪除相應(yīng)的結(jié)果節(jié)點(如果緩存中存放了這樣的節(jié)點)。以節(jié)省緩存管理的內(nèi)存耗費以及提高緩存管理的性能。根據(jù)前面的XML流處理算法很容易實現(xiàn)這一點??紤]圖6所示的例子,當(dāng)遇到b1元素的結(jié)束標(biāo)記的時候,通過對b的邏輯表達式的計算(其值為“FALSE”),可以確定b1和c1不滿足查詢匹配條件,因此,這時應(yīng)該及時將b1和c1從緩存中刪除(如圖6的Buffer4所示)。第二,另一種需要執(zhí)行刪除操作的是,在查詢匹配成功時,除了要向用戶分發(fā)查詢結(jié)果集,直觀上講,同時也應(yīng)該從緩存中刪除相應(yīng)節(jié)點(如圖6,在查詢匹配成功時,b2、c2以及d2構(gòu)成了返回結(jié)果的一個元組,則在向用戶分發(fā)后,可以將它們從緩存中刪除)。但是,實際情況要復(fù)雜得多。由于一個XML文檔流中會存在多個文檔片斷滿足一個XQuery查詢,并且不同的片斷之間會共用某些結(jié)果節(jié)點,因此,并不總是能在查詢匹配時立即刪除某些節(jié)點,需要找出合適的時機進行刪除操作,以改進緩存管理的空間耗費。我們再回過頭來考慮圖3所示的例子對于圖3(a)所示的文檔D1和圖3(b)所示的查詢Q1,在XML流處理過程中,當(dāng)遇到內(nèi)層a元素的結(jié)束標(biāo)記時(D1文檔中的第5行),查詢匹配成功,得到一個元組<c1,b1>,這時可以將該元組分發(fā)給用戶,但是卻不能刪除緩存中的c1和b1,因為對于該查詢,可能有多個與查詢匹配的元組,后面遇到的b元素還可能與c1構(gòu)成滿足條件的元組。在這個例子中,造成這種情況的原因是,D1是遞歸文檔并且查詢Q1中a與c和b之間是子孫軸(“//”)。而對于圖3(c)的文檔D2和圖3(d)的Q2,在遇到內(nèi)層的a元素的結(jié)束標(biāo)記時(D2文檔中的第5行),查詢匹配成功,得到一個元組<c2,b2>,而這時顯然應(yīng)該可以將c2和b2從緩存中刪除。對于一個查詢和一個文檔,另一種使得有多個匹配的元組的原因是文檔的DTD中含有1對多的關(guān)系??紤]DTD<!ELEMENTa(b,c+)>,從該DTD可知,a與b是1對1關(guān)系,a與c是1對多關(guān)系,從而可推知,對于查詢“a[b][c]”(假定b和c是返回元素),b與c是1對多關(guān)系,也就是說,一個b元素可能與多個c元素構(gòu)成多個返回元組。從上面的分析可知,造成這種復(fù)雜性的原因是遞歸文檔和查詢中的“//”,以及元素之間的1對多關(guān)系。但是,在有些應(yīng)用中,并不知道關(guān)于DTD或XMLSchema的任何信息,為了及時刪除緩存中的已經(jīng)“無用”節(jié)點(這里“無用”的含義是指,將這些節(jié)點構(gòu)成的元組分發(fā)給用戶后,其中的節(jié)點不會與查詢處理后面遇到的節(jié)點構(gòu)成新的返回元組),我們分兩種情況確定查詢匹配成功后緩存節(jié)點刪除的時機。第一種情況如果構(gòu)成返回元組的節(jié)點是通常查詢節(jié)點,即不是任何一個謂詞節(jié)點的子節(jié)點,則在遇到該節(jié)點的關(guān)閉標(biāo)記(即CLOSE事件)時,在緩存中執(zhí)行對該節(jié)點刪除操作。圖7演示了該過程。第二種情況如果構(gòu)成返回元組的節(jié)點是謂詞子樹的子節(jié)點(包含謂詞節(jié)點),則本發(fā)明給出如下定義定義1最低公共祖先謂詞節(jié)點(LCAPN)如果查詢中的一個節(jié)點是LCAPN,則需滿足下列條件●該節(jié)點是一個謂詞節(jié)點?!裨摴?jié)點是所有返回節(jié)點的一個公共祖先?!裨谒蟹祷毓?jié)點的全部公共祖先中,該節(jié)點不是其他任何一個的父親節(jié)點。根據(jù)LCAPN的概念,在文檔處理過程中,當(dāng)遇到文檔中對應(yīng)于LCAPN的節(jié)點的關(guān)閉標(biāo)記(即CLOSE事件),并且能夠判斷查詢匹配成功時,即可將緩存中的返回節(jié)點從緩存中刪除。圖8演示了該過程。在圖8中,Q6中的LCAPN是“c”,返回節(jié)點是“d”和“e”,因此,在遇到文檔D6中的“c”的關(guān)閉標(biāo)記時(即“<c1/>和<c2/>”),從緩存中刪除節(jié)點。對于遞歸的嵌套文檔,并且查詢中的LCAPN與返回節(jié)點之間包含“//”,就可能會出現(xiàn)這樣一種情況文檔中存在著處于不同層次上的多個節(jié)點與LCAPN對應(yīng),這時,只能在遇到相應(yīng)的最外層節(jié)點的關(guān)閉標(biāo)記時執(zhí)行緩存的刪除操作。例如圖3(a)和圖3(b)中,查詢Q1的LCAPN是“a”,在文檔D1中(該文檔是遞歸嵌套文檔),它對應(yīng)于第1行的“<a>”和第2行的“<a>”,由于Q1中的LCAPN與其返回節(jié)點(“c”和“b”)之間是“//”關(guān)系,因此,LCAPN對應(yīng)于文檔最外層的“a”,即D1中第一行的“<a>”,也就是說,在遇到第7行的“</a>”時刪除緩存中所有的節(jié)點;而在圖3(c)和圖3(d)中,雖然D2是遞歸嵌套文檔,但由于Q2中的LCAPN(“a”)與返回節(jié)點(“c”和“b”)之間是“/”,因此,在遇到第6行的“</a>”時,將“b2”和“c2”從緩存中刪除,在遇到第7行的“</a>”時,將“c1”從緩存中刪除。(4)緩存管理的共享前面說明了針對單個查詢的緩存管理問題。在實際的系統(tǒng)中,XML流數(shù)據(jù)處理系統(tǒng)通常面對的是大量用戶。因此,要求系統(tǒng)具有同時處理大量查詢的能力,而來自用戶的大量查詢中,可能會具有許多共同的部分,共享其共同部分可以節(jié)省系統(tǒng)的存儲空間和執(zhí)行時間,對改善系統(tǒng)性能非常重要。為此,本發(fā)明將所有XQuery的緊湊查詢樹合并為一個單一的共享前綴的緊湊查詢樹。其中,節(jié)點名以及算子(“/”或“//”)相同的前綴可以合并。另外,若返回結(jié)果中的節(jié)點是一個多個查詢共享的節(jié)點,則緩存結(jié)果節(jié)點的緩存池就被這些查詢所共享。如同共享前綴的緊湊查詢樹中的其他節(jié)點一樣,共享的結(jié)果節(jié)點的緩存池關(guān)聯(lián)有查詢標(biāo)識。如果兩個緩存池被多個查詢共享,則兩個緩存池構(gòu)成的緩存池鏈也同樣被共享。因此,在多查詢的情況下,緩存結(jié)果的共享不僅有效地節(jié)省了緩存的空間,同樣優(yōu)化了構(gòu)造緩存結(jié)果元組的性能。但是,緩存的共享可能延遲共享緩存節(jié)點的刪除時間,因為對于一個查詢而言可以刪除的緩存節(jié)點,可能還被其他查詢使用,而只有共享該緩存節(jié)點的所有查詢都認為這個節(jié)點″無用″時,才可將其從緩存中刪除。本發(fā)明提出一種新方法(基于部分二進制前綴編碼的XML流緩存管理方法),可以應(yīng)用于股票行情系統(tǒng)、交通控制系統(tǒng)、信息發(fā)布與訂閱等應(yīng)用中,具有下面獨特的特性1、為了能夠有效減少緩存的內(nèi)存耗費,提高處理性能,該發(fā)明提出的方法遵循四個基本原則a)緩存中只存放可能構(gòu)成結(jié)果元組的節(jié)點;b)盡早刪除緩存中不滿足條件的返回節(jié)點;c)盡早將緩存中滿足條件的節(jié)點構(gòu)造為結(jié)果元組分發(fā)給用戶,并且從緩存中刪除后面不會再使用的返回節(jié)點;d)共享緩存中的多個查詢的返回結(jié)果的公共節(jié)點。2、當(dāng)一個XML文檔流中存在多個文檔片斷滿足一個XQuery查詢的時候,需要確定哪些節(jié)點會構(gòu)成一個滿足用戶查詢的返回結(jié)果集的元組。本發(fā)明利用節(jié)點間語義關(guān)系連接起來的緩存池,來存儲XQuery的返回節(jié)點,并通過運行時棧驅(qū)動的基于二進制的前綴編碼,在運行時確定結(jié)果集中節(jié)點之間的關(guān)系,盡早構(gòu)成返回結(jié)果元組,避免了中間結(jié)果集之間的連接操作。3、有些情況下,尤其是在XQuery查詢中包含″//″并且XML文檔中含有遞歸、嵌套結(jié)構(gòu)的時候,一個XML文檔流中會存在多個文檔片斷滿足一個XQuery查詢,這時,面對XML流,沒有足夠的信息來判斷緩存中的節(jié)點是否還會被后面的匹配結(jié)果用到。因此,本發(fā)明定義一個查詢的″最低公共祖先謂詞節(jié)點(LCAPN)″,來幫助我們盡早刪除緩存中的節(jié)點,而不是等到整個文檔結(jié)束之后。4、本發(fā)明的緩存管理方法能夠同時單遍處理多個含有復(fù)雜謂詞的XQuery,并支持多個XQuery查詢結(jié)果中公共緩存節(jié)點的共享。圖1為XQuery查詢示例。圖2為XQuery的緊湊查詢樹。圖3為查詢例子,其中(a)顯示一個XML文檔例子D1,(b)顯示查詢例子Q1,(c)顯示XML文檔例子D2,(d)顯示查詢例子Q2。圖4為二進制前綴的編碼方案。圖5為運行時棧驅(qū)動的前綴編碼示例。圖6為查詢匹配失敗時緩存節(jié)點的刪除。圖7為緩存節(jié)點刪除例子1。圖8為緩存節(jié)點刪除例子2。圖9為本發(fā)明與XSQ在性能方面的比較。其中,(a)為Q1的實驗結(jié)果,(b)為Q2實驗結(jié)果。圖10為LeoXSSII,XSQ以及XMLTaskForce在內(nèi)存實驗方面的比較。其中,(a)為使用10M數(shù)據(jù)集的實驗結(jié)果,(b)為使用30M數(shù)據(jù)集的實驗結(jié)果。圖11為查詢文檔大小變化對查詢性能影響。其中,(a)為文檔大小為1M,(b)為文檔大小為3M。圖12為文檔大小為3M情況下,系統(tǒng)的內(nèi)存使用隨查詢數(shù)目增加的變化情況。具體實施例方式基于部分二進制前綴編碼的XML流緩存管理方法是與查詢匹配方法集成在一起的,包括兩部分第一部分是處理XML的OPEN標(biāo)記的部分,第二部分是處理CLOSE標(biāo)記的部分。在實施該方法該時,需要與基于事件的XML解析器集成在一起(例如IBM的解析器[18]),通過解析器來回調(diào)該方法。算法使用偽碼描述如下緩存管理算法(OPEN部分)輸入即將壓入運行時棧的活躍查詢節(jié)點QNode;輸出查詢匹配發(fā)生時,從緩存中搜集結(jié)果輸出。1.Element=QNode.Name;2.Query=CurrentQuery;3.BpEncoder=CurrentBinaryPrefixEncoder;4.If(QueryisasimplequeryANDQuerymatchesinputdocument)5.Collector.outputResult(GRT.TupleHead,Element);6.Collector.clearRubbish();7.Else8.If(QueryisatwigpatternANDGRT.acceptingNode.evaluate()=TRUE)9.Collector.outputResult(GRT.TupleHead,Element);10.Collector.clearRubbish();11.Endif12.Else13.If(QNodeisaRETURNnode)14.NewBufferNode=newBufferNode(Element,BpEncoder.Code);15.QNode.addBufferNode(NewBufferNode);16.SL=QNode.SemanticLink;17.If(SL?。絅ULL)18.RefQNode=SL.Reference;19.ForeachBufferNodeinRefQNode.BufferPool20.If(NewBuffrNodeandBufferNodeSATISFYSL.Relationship)21.BufferNode.addTupleLink(NewBufferNode);22.Endif23.Endfor24.Endif25.Endif26.EndifCLOSE部分輸入即將彈出運行時棧棧頂?shù)牟樵児?jié)點QNode;輸出查詢匹配發(fā)生時,從緩存中搜集結(jié)果輸出。1.Element=QNode.Name;2.IfQNodeisaLCAPNnode3.Collector.outputResult(GRT.TupleHead,Element);4.Collector.clearRubbish();5.Endif6.If(GRT.acceptingNode.evaluate()=TRUE)7.Collector.outputResult(GRT.TupleHead,Element);8.Collector.clearRubbish();9.Endif二進制前綴編碼的定義如下classBinaryPrefixEncoder{//operationsintsize();//取得動態(tài)數(shù)組的大?。籿oidreset(intpos);//重置pos處的前綴碼,設(shè)置為0;voidassignbits(intpos);//重新分配pos處的前綴碼,在原前綴碼前加1;voidallocate(intpos);//在pos處新開辟一個前綴空間;//dataArrayList<BitSet>Code;}基于運行時棧的二進制前綴編碼輸入一個二進制前綴編碼器BpEncoder,全局運行時棧對象RmStack;輸出編碼器BpEncoder中記錄了運行時棧頂節(jié)點所匹配元素的前綴編碼。EncodeOnPush(BpEncoder)1.Index=RmStack.size()-2;2.If(Index>BpEncoder.size()-1)3.BpEncoder.allocate(Index);4.Else5.BpEncoder.assignbits(Index);6.EndifEncodeOnPop(BpEncoder)1.Index=RmStack.size()-1;2.If(index<BpEncoder.size())3.BpEncoder.reset(Index);4.Endif緩存節(jié)點的數(shù)據(jù)結(jié)構(gòu)定義如下classBufferNode{StringElementName;//元素名稱;BitSet[]BinaryPrefixCode;//二進制前綴編碼;ArrayList<BufferNode>NextNodes;//元組鏈;SemanticLinkNext;//增加語義鏈;}緩存節(jié)點之間語義關(guān)系的定義classSemanticLink{intRelationship;//語義關(guān)系;QNodeReference;//鏈頭節(jié)點;}查詢節(jié)點的定義classQNode{StringName;//節(jié)點名稱BooleanExisted;//節(jié)點存在標(biāo)記Hashtable<String,QNode>Children;//子節(jié)點哈希索引Hashtable<Qid,QInfoItem>QInfoItems;//關(guān)聯(lián)信息項哈希索引//operationsvoidaddBufferNode(BufferNodebn);//加入緩存節(jié)點bn;voidremoveBufferNode(BufferNodebn);//刪除緩存節(jié)點bn;//dataLinkedList<BufferNode>BufferPool;}本發(fā)明的積極效果本發(fā)明用Java實現(xiàn)了該方法,實現(xiàn)的系統(tǒng)稱為LeoXSSII。系統(tǒng)運行的環(huán)境是Eclipse3.1,機器的主頻是2.7G,內(nèi)存為512M。構(gòu)成實驗的組件包括文檔生成器,DTD解析器,基于事件的XML解析器等。本發(fā)明能夠同時處理多個XQuery,每一個XQuery可以指定多個返回結(jié)果。在現(xiàn)有方法中,TurboXPath、XSQ和FluX采用XQuery表示用戶的查詢不具備同時處理多個查詢的能力。因此,本發(fā)明通過兩部分實驗來說明其效果第一部分是考慮單個查詢、單個返回結(jié)果,從系統(tǒng)的運行性能和內(nèi)存使用情況兩個方面,將該方法與一個XML流數(shù)據(jù)處理系統(tǒng)XSQ和一個XML主存數(shù)據(jù)庫(非流數(shù)據(jù))XMLTaskForce[19]進行比較;第二部分實驗說明在同時處理大量查詢,以及指定不同返回節(jié)點個數(shù)的時候,該方法在內(nèi)存使用和性能方面的表現(xiàn)。在這第一部分的實驗中,將本發(fā)明的方法與XSQ和XMLTaskForce進行比較。其中使用兩個數(shù)據(jù)集第一個數(shù)據(jù)集是XMark[20],使用默認的auctionDTD;第二個是用IBM的文檔生成器以BookDTD[21]為輸入手工生成的數(shù)據(jù)集合,其中參數(shù)NumberLevelsbounds設(shè)為15,參數(shù)MaxRepeats設(shè)為6,其余的使用默認參數(shù).這些數(shù)據(jù)集的大小是從8M到32M不等.由于XSQ和XMLTaskForce只支持一次處理一個查詢且返回一個元素,因此,特定設(shè)計了一些查詢來進行實驗,表1列出了其中使用的一些查詢。圖9給出了本發(fā)明和XSQ在性能方面的比較(XSQ用Java實現(xiàn),其源碼可從http://www.cs.umd.edu/projects/xsq/xsqf.tar.gz獲得),實驗的數(shù)據(jù)集是由BookDTD手工生成的數(shù)據(jù)集合(使用XMark得到的實驗結(jié)果類似),查詢是表1對應(yīng)的Q1和Q2.我們用下面幾個指標(biāo)進行實驗比較和分析(1)輸入文檔的大小,(2)不同的查詢(Q1和Q2),(3)性能.圖9的X軸反映了輸入文檔大小的變化(從8M到32M),Y軸反映的是系統(tǒng)的性能(m)。從實驗結(jié)果可以看出,對于查詢Q1和Q2,隨著文檔大小的增加,LeoXSSII的處理時間緩慢增加,而XSQ的處理時間增加幅度較大,并且LeoXSSII的性能始終優(yōu)于XSQ。圖10給出了LeoXSSII,XSQ以及XMLTaskForce在內(nèi)存實驗方面的比較,實驗的數(shù)據(jù)集同樣是使用由BookDTD手工生成的數(shù)據(jù)集合(使用XMark得到的實驗結(jié)果類似)。圖中Y軸是表1對應(yīng)的Q1,Q2和Q3,X軸表示系統(tǒng)的內(nèi)存使用峰值。我們分別使用10M和30M的數(shù)據(jù)集進行實驗,實驗結(jié)果表明LeoXSSII和XSQ在內(nèi)存使用方面文檔流的大小對其產(chǎn)生的影響非常小,內(nèi)存使用峰值幾乎沒有變化。而主存XML數(shù)據(jù)庫XMLTaskForce在內(nèi)存使用方面則對輸入文檔的大小很敏感,在輸入文檔大小增加的時候,內(nèi)存使用峰值增加很快。另外,LeoXSSII在內(nèi)存使用方面的情況要明顯好于XSQ,而XSQ則明顯好于XMLTaskForce。在第二部分的實驗中,由于還沒有具有同樣功能的類似系統(tǒng),本發(fā)明考慮在同時處理大量的XQuery的情況下,LeoXSSII在性能和內(nèi)存使用方面的情況。我們使用實驗的度量指標(biāo)如下(1)輸入文檔的大小,(2)查詢的數(shù)目,(3)性能,(4)內(nèi)存使用峰值,(4)返回結(jié)果所包含的元素個數(shù)(即輸出元組中的元素個數(shù)).這里使用的數(shù)據(jù)集是DBLP[22].如圖11所示,文檔的大小分別是1M和3M,X軸表示查詢的數(shù)目從5000遞增到100000,Y軸表示性能的變化情況,圖表反映的是隨著查詢數(shù)目的遞增(從5000到100000),查詢的返回結(jié)果所包含元素的數(shù)目(從一個元素到三個元素)的變化,系統(tǒng)在輸入文檔流分別為1M和3M的情況下性能的變化情況.從實驗結(jié)果可以看出,隨著查詢數(shù)量的增加,以及文檔大小的增加(1M到3M),系統(tǒng)的運行時間逐步遞增.但查詢數(shù)目從50000增加到100000時,系統(tǒng)處理時間增加幅度較大。而輸出結(jié)果包含的元素個數(shù)(這里沒有考慮輸出結(jié)果的分布情況,即它們之間是子孫關(guān)系還是兄弟關(guān)系等),對系統(tǒng)性能的影響不明顯。圖12顯示了文檔的大小為3M的情況下,系統(tǒng)的內(nèi)存使用隨查詢數(shù)目增加的變化情況隨著查詢數(shù)目的增加,系統(tǒng)使用的內(nèi)存逐步增加。在查詢數(shù)目很大的時候,每一個查詢數(shù)目的返回結(jié)果數(shù)目雖然不同,但整體分布情況大致相似,因此,對內(nèi)存使用的影響不大。表1實驗中使用的查詢參考文獻[1]XQuery1.0AnXMLQueryLanguage.http://www.w3.org/TR/2006/CR-xquery-20060608/[2]AndersBerglund,ScottBoag,DongChamberlin,MaryF.Fernandez,MichaelKay,JonathanRobie,andJrmeSimon.XMLPathLanguage(XPath)2.0W3Cworkingdraft16.TechnicalReportWD-xpath20-20020816USA,WorldWideWebConsortium,2002.http://www.w3.org/TR/2002/WD-xpath20-20020816/.Altinel,M.,andFranklin,M.J.EfficientFilteringofXMLDocumentsforSelectiveDisseminationofInformation.Abbadi,A.E.,Brodie,M.L.,Chakravarthy,S.,Dayal,U.,Kamel,N.Schlageter,G.,Whang,K.Y.,eds.Proceedingsofthe26thInternationalConferenceonVeryLargeDataBases(VLDB00).Cairo,EgyptMorganKaufmann,2000.53-64.YanleiDiao,MehmetAltinel,MichaelJ.Franklin,HaoZhangandPeterFischer.PathSharingandPredicateEvaluationforHigh-performanceXMLFiltering.ACMTransactionsonDatabaseSystem(TODS03).2003,28(4)467-516.Gupta,A.andSuciu,D.StreamProcessingofXPathQuerieswithPredicates.Halevy,A.Y.,Ives,Z.G.,Doan,A.,eds.Proceedingsof2003ACMSIGMODInternationalConferenceonManagementofdata(SIGMOD03).SanDiego,CaliforniaACMPress,2003.419-430.Green,T.J.,Miklau,G.,Onizuka,M.,andSuciu,D.ProcessingXMLStreamswithDeterministicAutomataandStreamIndexes.ACMTransactionsonDatabaseSystems(TODS04).2004,29(4)752-788.DanOlteanu,TobiasKiesling,F(xiàn)rancoisBry.AnEvaluationofRegularPathExpressionswithQualifiersagainstXMLStreams.Dayal,U.,Ramaritham,K.,Vijayaraman,T.M.,eds.Proceedingsof19thInternationalConferenceonDataEngineering(ICDE’03).Bangalore,IndiaIEEEComputerSociety,2003.702-704[8]BertramLudscher,PratikMukhopadhyayandYannisPapakonstantinou.ATransducer-BasedXMLQueryProcessor.Bressan,S.,Chaudhri,A.B.,Lee,M.L.,Yu,J.X.,Lacroix,Z.,eds.Proceedingsofthe28thInternationalConferenceonVeryLargeDataBases(VLDB02).HongKong,ChinaACMPress,2002.227-238.GAOJun,YANGDong-Qing,TANGShi-Wei,WANGTeng-Jiao.Tree-AutomataBasedEfficientXPathEvaluationoverXMLDataStream.JournalofSoftware.2005.16(2)223-232.Bruno,N.,Gravano,L.,Koudas,N.,andSrivastava,D.Navigation-vs.Index-BasedXMLMulti-QueryProcessing.Dayal,U.,Ramaritham,K.,Vijayaraman,T.M.,eds.Proceedingsofthe19thInternationalConferenceonDataEngineering(ICDE’03).Bangalore,IndiaIEEEComputerSociety,2003.139-150[11]XueqingGong,WeiningQian,YingYan,andAoyingZhou,BloomFilter-basedXMLPacketsFilteringforMillionsofPathQueries.Proceedingsofthe21stInternationalConferenceonDataEngineering(ICDE’05).Tokyo,JapanIEEEComputerSociety,2005.890-901.JoonhoKwon,PraveenRao,BongkiMoon,SukhoLee.FiSTScalableXMLDocumentFilteringbySequencingTwigPatterns.Bhm,K.,Jensen,C.S.,Haas.L.M.,Kersten,M.L.,Larson,P.,Ooi,B.C.,eds.Proceedingsof31stInternationalConferenceonVeryLargeDataBases(VLDB05).Trondheim,NorwayVLDBEndowment,2005.217-228.ZivBarYossef,MarcusFontoura,VanjaJosifovski,BufferinginQueryEvaluationoverXMLStreams.PODS2005June1315,2005,Baltimore,Maryland.FENGPENGandSUDARSHANS.CHAWATHE.XSQAStreamingXPathEngine,ACMTransactionsonDatabaseSystems,Vol.30,No.2,June2005,Pages577-623.YanleiDiao,ShariqRizvi,andMichaelJ.Franklin.TowardsanInternet-ScaleXMLDisseminationService.InProceedingsofVLDB2004,August2004HiroyukiUchiyamaMakotoOnizukaTakashiHonishi,DistributedXMLStreamFilteringSystemwithHighScalability,Proceedingsofthe21stInternationalConferenceonDataEngineering(ICDE2005)[17]B.Ludascher,P.Mukhopadhay,Y.Papakonstantinou“ATransducer-BasedXMLQueryProcessor”,InVLDB2002[18]DavidMegginson.SimpleAPIforXML.http://sax.sourceforge.net[19]G.Gottlob,C.Koch,andR.Pichler.EfficientAlgorithmsforProcessingXPathQueries.InProceedingsofVLDB,2002[20]BUSSE,R.,CAREY,M.,F(xiàn)LORESCU,D.,KERSTEN,M.,MANOLESCU,I.,SCHMIDT,A.,ANDWAAS,F(xiàn).2001.XmarkAnXMLbenchmarkproject.http://monetdb.cwi.nl/xml/index.html..W3C.XMLQueryUseCases,2003.http://www.w3.org/TR/xquery-use-cases.LEY,M.2001.DBLPDTD.http://www.acm.org/sigmod/dblp/db/about/dblp.dtd.權(quán)利要求1.一種基于部分二進制前綴編碼的XML流緩存管理方法,其特征在于具體步驟如下(1)構(gòu)造XQuery查詢的緊湊查詢樹,將用戶提交的所有XQuery查詢構(gòu)造為單顆緊湊查詢樹,并為每一個返回節(jié)點構(gòu)造一個緩存池;在緊湊查詢樹中,所有查詢共享公共前綴;(2)查詢匹配,查詢匹配過程包括自頂向下和自底向上兩部分,在查詢匹配的過程中,執(zhí)行緩存管理的基本操作,包括進行緩存結(jié)果的加入和刪除;(3)緩存管理過程,緩存管理過程優(yōu)化與XQuery查詢匹配的返回結(jié)果的緩存,包括(a)建立緩管理的數(shù)據(jù)結(jié)構(gòu)XQuery查詢中的每一個緩存節(jié)點對應(yīng)于一個緩存池,所有緩存池構(gòu)成一個鏈表,其中,每兩個緩沖池之間的鏈接由緩存池中返回節(jié)點之間的語義關(guān)系定義,包括父子關(guān)系、子孫關(guān)系、兄弟關(guān)系和共同祖先關(guān)系;(b)建立基于運行時棧的部分二進制前綴編碼表示,通過運行時棧驅(qū)動基于二進制的前綴編碼,在運行時確定結(jié)果集中節(jié)點之間的關(guān)系,遲早構(gòu)成返回結(jié)果元組,避免中間結(jié)果集之間的連接操作;(c)進行返回結(jié)果的緩存管理。2.根據(jù)權(quán)利要求1所述的方法,其特征在于所述的XQuery的緊湊查詢樹定義如下定義1一顆緊湊查詢樹是表示XQuery的查詢樹,其中的節(jié)點稱為查詢節(jié)點,記為QNode,具有惟一標(biāo)識,查詢節(jié)點分為以下兩種類型(1)OQNode不帶有謂詞的定位步,稱為通常查詢節(jié)點,在緊湊查詢樹中,OQNode關(guān)聯(lián)相關(guān)信息,包括節(jié)點名字“name”和表示父子“/”或子孫“//”關(guān)系的算子,用兩元組<name,“/”or“//”>表示;(2)PQNode帶有謂詞的定位步,稱為謂詞查詢節(jié)點,謂詞查詢節(jié)點是緊湊查詢樹中的特殊節(jié)點,它通過AND/OR邏輯謂詞將其子樹連接起來;除了節(jié)點標(biāo)識,節(jié)點名和父子或者子孫外,還關(guān)聯(lián)一個邏輯表達式;該邏輯表達式在內(nèi)部表示為抽象語法樹;該抽象語法樹的每一個葉子節(jié)點都維護一個到其對應(yīng)的節(jié)點的引用;(3)RNode返回結(jié)果節(jié)點,即是指那些構(gòu)成XQuery結(jié)果元組的節(jié)點;定義2謂詞子樹,在一個緊湊查詢樹中,以距離根節(jié)點最近的謂詞節(jié)點為根所形成的子樹稱為謂詞子樹;同時擴充相應(yīng)的節(jié)點結(jié)構(gòu)謂詞子樹中的OQNode,也關(guān)聯(lián)一個邏輯表達式,該邏輯表達式是只含有一個項,即其孩子節(jié)點的標(biāo)識;而如果OQNode是葉子節(jié)點,則含有一個邏輯標(biāo)記,初始為真,當(dāng)遇到CLOSE事件后,將邏輯標(biāo)記的值賦為假;定義3接受節(jié)點,在一顆緊湊查詢樹的表示中,距離根節(jié)點最近的謂詞節(jié)點稱為該樹所表示查詢的接受節(jié)點;如果計算過程中,接受節(jié)點相關(guān)邏輯表達式的值為真,則該文檔與查詢匹配;如果一個XQuery是不帶謂詞的一般查詢XP{/,//,*},其接受節(jié)點則是其通常查詢樹的葉子節(jié)點;如果在匹配過程中到達接受節(jié)點,則該文檔與查詢匹配。3.根據(jù)權(quán)利要求1所述的方法,其特征在于所述的查詢匹配過程分為OPEN和CLOSE兩部分,其中(a)OPEN事件通過回調(diào)函數(shù)調(diào)用該句柄,傳入事件名字,元素名字和元素的文檔層次;對每一個到達的XML元素,進行節(jié)點測試和文檔層次檢查;如果節(jié)點檢查返回TRUE,則該節(jié)點被壓入一個運行時棧;若遇到的節(jié)點是PQNode或謂詞子樹的子節(jié)點,其狀態(tài)標(biāo)記的值設(shè)為FALSE;若遇到的節(jié)點是一個查詢的接受節(jié)點,且不是PQNode節(jié)點,則一個查詢匹配發(fā)生;若遇到的節(jié)點是同一節(jié)點的不同層次,則將其作為不同的狀態(tài)節(jié)點,用節(jié)點標(biāo)識和文檔層次來共同識別該狀態(tài)節(jié)點;如果該接受節(jié)點是PQNode,則需要等到遇到CLOSE事件時才能判定文檔與查詢是否匹配;若遇到的是返回結(jié)果節(jié)點RNode,則將該節(jié)點放入緩存池中;(b)在CLOSE事件發(fā)生時,如果遇到的節(jié)點是OQNode,簡單地將節(jié)點從棧中彈出;如果遇到的節(jié)點是PQNode或謂詞子樹的子節(jié)點,將執(zhí)行下列步驟a)如果是葉子節(jié)點,將其狀態(tài)標(biāo)記賦為TRUE,意味著該節(jié)點匹配成功,從運行棧彈出該節(jié)點,并將當(dāng)前棧頂對應(yīng)的節(jié)點中相關(guān)的邏輯表達式中對應(yīng)的項賦值為TRUE;如果是謂詞子樹中的中間節(jié)點,計算其邏輯表達式,若為TRUE,則其狀態(tài)標(biāo)記賦值為TRUE,否則為FALSE,從棧中彈出該節(jié)點,并將當(dāng)前棧頂節(jié)點的相關(guān)邏輯表達式中的對應(yīng)項賦值為其狀態(tài)標(biāo)記的值TRUE或FALSE;如果是一個查詢的接受節(jié)點,計算其邏輯表達式,并將邏輯表達式的結(jié)果賦給狀態(tài)標(biāo)記;如果是TRUE,則文檔與該查詢匹配;如果是FALSE,則文檔與該查詢不匹配;如果是一個返回節(jié)點,在確定匹配成功或失敗時,從緩存中刪除相應(yīng)節(jié)點。4.根據(jù)權(quán)利要求1所述的方法,其特征在于所述緩存管理遵循如下4個原則(a)緩存中只存放可能構(gòu)成結(jié)果元組的節(jié)點;(b)盡早刪除緩存中不滿足條件的返回節(jié)點;(c)盡早將緩存中滿足條件的節(jié)點構(gòu)造為結(jié)果元組分發(fā)給用戶,并且從緩存中刪除后面不會再使用的返回節(jié)點;(d)共享緩存中的多個查詢的返回結(jié)果的公共節(jié)點。5.根據(jù)權(quán)利要求1所述的方法,其特征在于所述建立緩存管理數(shù)據(jù)結(jié)構(gòu),具體步驟如下定義一組緩存池來存放要緩存的節(jié)點,緩存池是存放緩存節(jié)點的動態(tài)數(shù)組,而對于每一個返回節(jié)點,都定義一個緩存池與其相關(guān)聯(lián);根據(jù)用戶提交的查詢得知不同緩存池中的節(jié)點之間應(yīng)該具有的語義關(guān)系,包括父子關(guān)系、子孫關(guān)系、兄弟關(guān)系、共同祖先關(guān)系,并用這樣的關(guān)系將這些緩存池鏈接起來;這樣,各個緩存池中節(jié)點根據(jù)緩存池之間的語義關(guān)系鏈接起來的一條路徑,構(gòu)成返回結(jié)果中的一個元組,同時又保證元素之間的順序關(guān)系。6.根據(jù)權(quán)利要求1所述的方法,其特征在于所述建立基于運行時棧的部分二進制前綴編碼表示,具體步驟如下根節(jié)點編碼為空串empty;為任一個節(jié)點X下的第i個子節(jié)點Y分配一個二進制串bits(i);子節(jié)點的編碼Label(Y)就是其父節(jié)點的編碼與分配的二進制串的連接即Label(X)·bits(i);分配的二進制串bit(s),必須滿足子節(jié)點的編碼是前綴無關(guān)的,即沒有一個子節(jié)點的編碼是另一個的前綴;根據(jù)前綴編碼,通過兩個基本操作確定兩個節(jié)點之間的任何關(guān)系。7.根據(jù)權(quán)利要求1所述的方法,其特征在于所述返回結(jié)果的緩存管理,包括向緩存中加入返回節(jié)點;構(gòu)造滿足用戶查詢條件的元組,并將結(jié)果元組分發(fā)給用戶;從緩存中刪除無用的節(jié)點;緩存結(jié)果的共享;(1)向緩存中加入返回節(jié)點對于XQuery查詢的一顆緊湊查詢樹,當(dāng)在XML流處理過程中遇到返回節(jié)點,則將該節(jié)點放入緩存;(2)構(gòu)造結(jié)果元組在將緩存節(jié)點放入緩存池的時候,根據(jù)節(jié)點的二進制前綴編碼和緩存池之間的語義鏈接來構(gòu)造滿足查詢條件的結(jié)果元組;(3)緩存管理的刪除操作在兩種情況下及時從緩存中刪除相應(yīng)節(jié)點第一,在查詢匹配的過程中,當(dāng)確定匹配不成功時,及時從緩存中刪除相應(yīng)的結(jié)果節(jié)點;第二,在查詢匹配成功時,除了要向用戶分發(fā)查詢結(jié)果集,同時從緩存中刪除相應(yīng)節(jié)點。8.根據(jù)權(quán)利要求7所述的方法,其特征在于為了及時刪除緩存中的已經(jīng)“無用”節(jié)點分兩種情況確定查詢匹配成功后緩存節(jié)點刪除的時機第一種情況如果構(gòu)成返回元組的節(jié)點是通常查詢節(jié)點,即不是任何一個謂詞節(jié)點的子節(jié)點,則在遇到該節(jié)點的關(guān)閉標(biāo)記時,在緩存中執(zhí)行對該節(jié)點刪除操作;第二種情況如果構(gòu)成返回元組的節(jié)點是謂詞子樹的子節(jié)點,則本發(fā)明給出如下定義定義1最低公共祖先謂詞節(jié)點,記為LCAPN如果查詢中的一個節(jié)點是LCAPN,滿足下列條件該節(jié)點是一個謂詞節(jié)點;該節(jié)點是所有返回節(jié)點的一個公共祖先;在所有返回節(jié)點的全部公共祖先中,該節(jié)點不是其他任何一個的父親節(jié)點;在文檔處理過程中,當(dāng)遇到文檔中對應(yīng)于LCAPN的節(jié)點的關(guān)閉標(biāo)記,并且能夠判斷查詢匹配成功時,即可將緩存中的返回節(jié)點從緩存中刪除。9.根據(jù)權(quán)利要求1所述的方法,其特征在于所述將所有XQuery的緊湊查詢樹合并為一個單一的共享前綴的緊湊查詢樹,其中,節(jié)點名以及算子“/”或“//”相同的前綴給予合并;若返回結(jié)果中的節(jié)點是一個多個查詢共享的節(jié)點,則緩存結(jié)果節(jié)點的緩存池就被這些查詢所共享。全文摘要本發(fā)明屬于可擴充標(biāo)記語言(XML)管理
技術(shù)領(lǐng)域:
,具體為一種基于部分二進制前綴編碼的XML流緩存管理方法。該方法包括通過運行時棧驅(qū)動的基于二進制的前綴編碼,在運行時確定結(jié)果集中節(jié)點之間的關(guān)系,避免中間結(jié)果集之間的連接操作;定義一個查詢的“最低公共祖先謂詞節(jié)點”,以便盡早刪除緩存中的節(jié)點,處理在XQuery查詢中包含“∥”并且XML文檔中含有遞歸、嵌套結(jié)構(gòu)的情況;緩存管理方法同時處理多個含有復(fù)雜謂詞的XQuery查詢,并支持多個XQuery查詢結(jié)果中公共緩存節(jié)點的共享。本發(fā)明能夠有效支持針對XQuery查詢的XML流的緩存管理,緩存的效率明顯提高,可應(yīng)用于基于Web的個性化推薦服務(wù)、信息監(jiān)測等領(lǐng)域。文檔編號G06F17/30GK101089851SQ20071004370公開日2007年12月19日申請日期2007年7月12日優(yōu)先權(quán)日2007年7月12日發(fā)明者楊衛(wèi)東,王清明,朱皓申請人:復(fù)旦大學(xué)