Xml文檔的存儲(chǔ)方法
【專(zhuān)利摘要】本發(fā)明提供一種XML文檔的存儲(chǔ)方法。該方法有效利用云計(jì)算平臺(tái)上分布式存儲(chǔ)系統(tǒng)HBase,對(duì)于具備小型、格式相似特征的海量XML文檔的存儲(chǔ)問(wèn)題提出一種新的存儲(chǔ)方法。在新的存儲(chǔ)方法中,本發(fā)明提出一種海量XML到HBase的雙向數(shù)據(jù)映射模型,在構(gòu)造該模型過(guò)程中,提出一種集路徑信息和節(jié)點(diǎn)位置信息為一體的新的XML文檔節(jié)點(diǎn)編碼方式,該編碼方式既擁有優(yōu)異的節(jié)點(diǎn)關(guān)系判斷能力,又在一定程度上解決了傳統(tǒng)XML編碼方式在編碼更新方面存在的不足,同時(shí)為相似結(jié)構(gòu)的海量XML的壓縮存儲(chǔ)提供良好的支持。
【專(zhuān)利說(shuō)明】XML文檔的存儲(chǔ)方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及數(shù)據(jù)庫(kù)技術(shù),尤其涉及一種可擴(kuò)展標(biāo)記語(yǔ)言(extensibleMarkup Language,XML)文檔的存儲(chǔ)方法。
【背景技術(shù)】
[0002] XML憑借其自描述性、可擴(kuò)展性和半結(jié)構(gòu)化等特點(diǎn),已經(jīng)成為最受歡迎的信息表示 和數(shù)據(jù)交換的標(biāo)準(zhǔn),并在各個(gè)領(lǐng)域得到了廣泛的支持和應(yīng)用。特別是在物聯(lián)網(wǎng)環(huán)境下,數(shù) 據(jù)大多為具有一定意義的數(shù)字或文本,而XML在語(yǔ)法上的良好的半結(jié)構(gòu)化信息表達(dá)能力為 其成為物聯(lián)網(wǎng)數(shù)據(jù)交換標(biāo)準(zhǔn)提供了很好的基礎(chǔ)。目前流行的注諸如BITXML、物理標(biāo)示語(yǔ)言 (PhysicalMarkupLanguage,PML)等物聯(lián)網(wǎng)數(shù)據(jù)交換標(biāo)準(zhǔn)都是以XML為基礎(chǔ)。然而,數(shù)以 百萬(wàn)計(jì)的傳感器網(wǎng)絡(luò)或智能終端時(shí)時(shí)刻刻都在產(chǎn)生數(shù)據(jù),單個(gè)數(shù)據(jù)文件一般都比較小,這 使得物理網(wǎng)后端的數(shù)據(jù)處理平臺(tái)需要能夠應(yīng)對(duì)海量的小規(guī)模XML文件的存儲(chǔ)和查詢(xún)檢索 工作,傳統(tǒng)的處理方式在性能等方面存在著瓶頸。
[0003]目前,國(guó)際上對(duì)于XML數(shù)據(jù)的存儲(chǔ)和檢索的研宄主要集中在三個(gè)方面:第一種是 以關(guān)系數(shù)據(jù)庫(kù)為核心的數(shù)據(jù)存儲(chǔ)和檢索方式,這種方式一般需要將XML數(shù)據(jù)通過(guò)一定的映 射方式轉(zhuǎn)換為關(guān)系模型,并分別存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中,針對(duì)XML中的節(jié)點(diǎn)進(jìn)行編碼,通過(guò)關(guān) 系約束將XML文件按照關(guān)系模型分表存儲(chǔ);這種方式對(duì)海量數(shù)據(jù)支持不足,當(dāng)文件數(shù)量上 升到一定程度,其性能瓶頸越凸顯,此外由于采用關(guān)系映射,一定程度上會(huì)造成信息丟失; 第二種是以NativeXML數(shù)據(jù)庫(kù)為核心的數(shù)據(jù)存儲(chǔ)和檢索方式,這種方式由于是采用類(lèi)似文 件式的存儲(chǔ)方式,仍然無(wú)法有效解決海量數(shù)據(jù)下的存儲(chǔ)和檢索;第三種則是在分布式環(huán)境 下,采用非關(guān)系型數(shù)據(jù)庫(kù)(NotOnlyStructuredQueryLanguage,NoSQL)為核心的存儲(chǔ)和 檢索方式,這種方式以其良好的可擴(kuò)展性為立足點(diǎn),能夠?qū)A繑?shù)據(jù)提供高性能的存儲(chǔ)和 查詢(xún)支持,逐漸成為近年來(lái)研宄的一個(gè)熱點(diǎn),然而,由于一般分布式環(huán)境的復(fù)雜性,帶來(lái)了 諸如負(fù)載平衡、災(zāi)備恢復(fù)等問(wèn)題,在部署和維護(hù)上也較為復(fù)雜。
[0004] 在此基礎(chǔ)上,云計(jì)算技術(shù)開(kāi)始飛速發(fā)展。由于云計(jì)算技術(shù)在海量數(shù)據(jù)存儲(chǔ)和檢索 中的優(yōu)勢(shì),采用云計(jì)算平臺(tái)作為物聯(lián)網(wǎng)后端的數(shù)據(jù)管理平臺(tái)是一種趨勢(shì)。然而,目前為止, 還沒(méi)有出現(xiàn)針對(duì)存儲(chǔ)具備小型且格式相似特征的XML文檔的成熟的解決方案。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明提供一種XML文檔的存儲(chǔ)方法,以解決具備小型且格式相似特征的XML文 檔的存儲(chǔ)問(wèn)題。
[0006] 本發(fā)明提供一種可擴(kuò)展標(biāo)記語(yǔ)言XML文檔的存儲(chǔ)方法,包括:
[0007] 將所述XML文檔D建模為文檔樹(shù)T;其中,文檔樹(shù)為T(mén):T= (V,V。,Ε,Σ,P, <,path,parent,value),其中,V表示所述XML文檔D中的節(jié)點(diǎn)集合,Vtl表示所述XML文 檔D中的根節(jié)點(diǎn),E表示所述XML文檔D中父子約束關(guān)系集合,有窮字母表Σ表示所述 XML文檔D中所有節(jié)點(diǎn)名稱(chēng)的集合,P表示所述XML文檔D中祖先路徑約束集合,<表示 定義在P上的前綴關(guān)系,函數(shù)path:V-P,表示Vver,.path(V) eP返回節(jié)點(diǎn)V的祖先路 徑,函數(shù)parent:V-V表示Vve 返回節(jié)點(diǎn)V的父節(jié)點(diǎn),其中= 0,函數(shù) value:V」Ve-Vt表示VveFa |Fe,vaiue(v)返回在所述XML文檔D中節(jié)點(diǎn)V的Text值;
[0008] 按照預(yù)設(shè)編碼規(guī)則對(duì)所述XML文檔D進(jìn)行編碼;
[0009] 按照預(yù)設(shè)映射規(guī)則對(duì)所述XML文檔D進(jìn)行映射存儲(chǔ)。
[0010] 如上所述的方法,其中:所述節(jié)點(diǎn)集合V=AttrUElemUText,其中,Attr表示 所述XML文檔D中所有屬性節(jié)點(diǎn)的集合Va,Elem表示所述XML文檔D中所有元素節(jié)點(diǎn)的集 合I,Text表示所述XML文檔D中所有文本節(jié)點(diǎn)的集合Vt,U表示交集。
[0011] 如上所述的方法,其中,所述按照預(yù)設(shè)編碼規(guī)則對(duì)所述XML文檔D進(jìn)行編碼,包 括:
[0012] 按照深度優(yōu)先遍歷方式,對(duì)所述XML文檔D進(jìn)行編碼。
[0013] 如上所述的方法,其中,所述預(yù)設(shè)編碼規(guī)則包括:
[0014] 節(jié)點(diǎn)編碼code (V)=code (path (V))·iv;code (path (V))表示節(jié)點(diǎn)V對(duì)應(yīng)的路徑 的路徑編碼,iv表示所述節(jié)點(diǎn)V在當(dāng)前層的編碼;
[0015] 路徑編碼code(path(v)) =code(U) · ipath(v),其中,3(〃,v)e£ ;code(U)表示路徑u 對(duì)應(yīng)的節(jié)點(diǎn)的父節(jié)點(diǎn)的節(jié)點(diǎn)編碼,ipathW表示所述路徑u在當(dāng)前層的編碼。
[0016] 如上所述的方法,其中,所述節(jié)點(diǎn)編碼之間、以及所述路徑編碼之間均存在前綴關(guān) 系,具體為:
[0017] 若codel與code2之間滿(mǎn)足關(guān)系式code2 =codel.i,則判斷出codel是code2的 前綴編碼;其中,codel和code2分別表示兩個(gè)所述節(jié)點(diǎn)編碼,或者,codel和code2分別表 示兩個(gè)所述路徑編碼。
[0018] 如上所述的方法,其中,在屬性節(jié)點(diǎn)的屬性名稱(chēng)前添加符號(hào)@。
[0019] 如上所述的方法,其中,所述預(yù)設(shè)編碼規(guī)則具體包括:
[0020] 所述根節(jié)點(diǎn)%的編碼為1,判斷所述根節(jié)點(diǎn)VC1所在路徑是否包含所述屬性節(jié)點(diǎn);
[0021] 若包含,則按照所述屬性節(jié)點(diǎn)在所述文檔樹(shù)中的順序進(jìn)行編碼,并記錄到編碼記 錄表中。
[0022] 如上所述的方法,其中,所述按照所述屬性節(jié)點(diǎn)在所述文檔樹(shù)中的順序進(jìn)行編碼, 具體包括:
[0023] 對(duì)于Vve 乙IK,若code(paiA(v)> = 0,貝Ijpath(V)是節(jié)點(diǎn)parent(V)的第i個(gè)被編碼 的孩子路徑種類(lèi);所述孩子路徑種類(lèi)是指所述節(jié)點(diǎn)V的所有孩子節(jié)點(diǎn)中,同名孩子節(jié)點(diǎn)的 祖先路徑所構(gòu)成的路徑種類(lèi);
[0024] 判斷節(jié)點(diǎn)V是否有孩子節(jié)點(diǎn),若是,對(duì)所述節(jié)點(diǎn)V的所述孩子節(jié)點(diǎn)進(jìn)行編碼;
[0025] 若判斷出所述節(jié)點(diǎn)V沒(méi)有所述孩子節(jié)點(diǎn),則判斷所述節(jié)點(diǎn)V是否有所述屬性節(jié) 占.
[0026] 若判斷出所述節(jié)點(diǎn)V有所述屬性節(jié)點(diǎn),則對(duì)所述屬性節(jié)點(diǎn)進(jìn)行編碼;或者,若判斷 出所述節(jié)點(diǎn)V沒(méi)有所述屬性節(jié)點(diǎn),判斷所述節(jié)點(diǎn)V是否有兄弟節(jié)點(diǎn);
[0027] 若判斷出所述節(jié)點(diǎn)V有所述兄弟節(jié)點(diǎn),則對(duì)所述兄弟節(jié)點(diǎn)進(jìn)行編碼;或者,若判斷 出所述節(jié)點(diǎn)V沒(méi)有所述兄弟節(jié)點(diǎn),則按照所述節(jié)點(diǎn)V的祖先路徑,逆向回退到存在未編碼兄 弟節(jié)點(diǎn)的祖先節(jié)點(diǎn),對(duì)所述祖先節(jié)點(diǎn)的所述未編碼兄弟節(jié)點(diǎn)進(jìn)行編碼;若按照所述節(jié)點(diǎn)V的所述祖先路徑,逆向回退到所述根節(jié)點(diǎn)則編碼結(jié)束。
[0028] 如上所述的方法,其中,所述按照所述屬性節(jié)點(diǎn)在所述文檔樹(shù)中的順序進(jìn)行編碼, 還包括:
[0029] 對(duì)于VveCIK,若c〇de(pa伙(v))#0,則參照所述編碼記錄表,判斷所述節(jié)點(diǎn)V的 path(v)與parent(v)之間,是否滿(mǎn)足關(guān)系式:Code(parent(v)) <Code(path(v));
[0030] 若不滿(mǎn)足,則重復(fù)所述判斷節(jié)點(diǎn)V是否有孩子節(jié)點(diǎn)的操作;
[0031] 若滿(mǎn)足,則code(v) = (code(path(v)))·j,其中je[1,2, 3......)表示所述節(jié)點(diǎn) V是所述節(jié)點(diǎn)V對(duì)應(yīng)祖先路徑種類(lèi)下的同名兄弟節(jié)點(diǎn)中從1開(kāi)始計(jì)數(shù)的順序,完成對(duì)所述節(jié) 點(diǎn)V的編碼后,重復(fù)所述判斷節(jié)點(diǎn)V是否有孩子節(jié)點(diǎn)的操作。
[0032] 如上所述的方法,其中,所述按照預(yù)設(shè)映射規(guī)則對(duì)所述XML文檔D進(jìn)行映射存儲(chǔ), 包括:
[0033] 提取所述XML文檔D對(duì)應(yīng)的所有code(V)和value(V),將不同code(V)的作為編 碼-值CodeToValue表的列名,將value(V)作為所述CodeToValue表中,與code(V)對(duì)應(yīng) 的列的列值,一個(gè)所述XML文檔D對(duì)應(yīng)所述CodeToValue表中的一行,并將所述XML文檔 D對(duì)應(yīng)的文檔名字作為行關(guān)鍵字;其中,所述CodeToValue表用于存放所述XML文檔D中 code(V)和對(duì)應(yīng)的value(V);
[0034] 提取所有的節(jié)點(diǎn)VeV-Text對(duì)應(yīng)的path(V)及code(V),將不同path(V)的作為 路徑-編碼PathToCode表的列名,每個(gè)path(V)對(duì)應(yīng)的所有code(V)用預(yù)設(shè)間隔符間隔, 所述XML文檔D對(duì)應(yīng)一個(gè)所述PathToCode表,并作為數(shù)據(jù)庫(kù)HBase中的一行進(jìn)行存儲(chǔ);其 中,所述PathToCode表用于存放所述XML文檔D中path(V)和對(duì)應(yīng)的code(V)。
[0035] 本發(fā)明提供的XML文檔的存儲(chǔ)方法,有效利用云計(jì)算平臺(tái)上分布式存儲(chǔ)系統(tǒng) HBase,對(duì)于具備小型、格式相似特征的海量XML文檔的存儲(chǔ)問(wèn)題提出一種新的存儲(chǔ)方法。 在新的存儲(chǔ)方法中,本發(fā)明提出一種海量XML到HBase的雙向數(shù)據(jù)映射模型,在構(gòu)造該模型 過(guò)程中,提出一種集路徑信息和節(jié)點(diǎn)位置信息為一體的新的XML文檔節(jié)點(diǎn)編碼方式,該編 碼方式既擁有優(yōu)異的節(jié)點(diǎn)關(guān)系判斷能力,又在一定程度上解決了傳統(tǒng)XML編碼方式在編碼 更新方面存在的不足,同時(shí)為相似結(jié)構(gòu)的海量XML的壓縮存儲(chǔ)提供良好的支持。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0036] 為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn) 有技術(shù)描述中所需要使用的附圖作一簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖是本發(fā) 明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以 根據(jù)這些附圖獲得其他的附圖。
[0037] 圖1為本發(fā)明XML文檔的存儲(chǔ)方法實(shí)施例一的流程圖;
[0038] 圖2a為本發(fā)明XML文檔的存儲(chǔ)方法實(shí)施例中實(shí)例文檔1對(duì)應(yīng)的文檔樹(shù)的示意圖;
[0039] 圖2b為本發(fā)明XML文檔的存儲(chǔ)方法實(shí)施例中實(shí)例文檔2對(duì)應(yīng)的文檔樹(shù)的示意圖;
[0040] 圖3a為對(duì)圖2a中的文檔樹(shù)進(jìn)行編碼后的示意圖;
[0041] 圖3b為對(duì)圖3a中的文檔樹(shù)進(jìn)行編碼后的示意圖。
【具體實(shí)施方式】
[0042] 為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例 中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是 本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員 在沒(méi)有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0043] 圖1為本發(fā)明XML文檔的存儲(chǔ)方法實(shí)施例一的流程圖。如圖1所示,本實(shí)施例提 供的方法具體可以包括:
[0044] 步驟101、將所述XML文檔D建模為文檔樹(shù)T;其中,文檔樹(shù)為T(mén):T= (V,V(l,Ε,Σ,Ρ, <,path,parent,value),其中,V表示所述XML文檔D中的節(jié)點(diǎn)集合,Vtl表示所述XML文 檔D中的根節(jié)點(diǎn),E表示所述XML文檔D中父子約束關(guān)系集合,有窮字母表Σ表示所述 XML文檔D中所有節(jié)點(diǎn)名稱(chēng)的集合,P表示所述XML文檔D中祖先路徑約束集合,<表示定 義在P上的前綴關(guān)系,函數(shù)path:V-P,表示Vvepath(V)eP返回節(jié)點(diǎn)V的祖先路徑, 函數(shù)parent:V-V表示Vve「,parent(V)返回節(jié)點(diǎn)V的父節(jié)點(diǎn),其中/?(re?i(vu) = 0,函數(shù) value:V」Ve-Vt表示VveF; |Fe,value(v)返回在所述XML文檔D中節(jié)點(diǎn)V的Text值。
[0045] 具體的,所述節(jié)點(diǎn)集合V=AttrUElemUText,其中,Attr表示所述XML文檔D 中所有屬性節(jié)點(diǎn)的集合Va,Elem表示所述XML文檔D中所有元素節(jié)點(diǎn)的集合I,Text表示 所述XML文檔D中所有文本節(jié)點(diǎn)的集合Vt,U表示交集。
[0046] ¥(|表示文檔D中的根元素,VC1EV,VC1作為對(duì)應(yīng)的文檔樹(shù)的根節(jié)點(diǎn);E表示文檔D中 父子約束關(guān)系的集合,是一個(gè)二元關(guān)系,即=r:,且E= {(u,V)|ueV,VeV,u是 V的父節(jié)點(diǎn)}。若3(〃,v)e£,可簡(jiǎn)寫(xiě)為u-V;有窮字母表Σ是D中所有節(jié)點(diǎn)名稱(chēng)的集合。
[0047] P是文檔D中祖先路徑約束的集合,P是一個(gè)多元關(guān)系,即 尸CΓuF2ur3u…ur|vi,P= {(v〇,V1,V2,· · ·,Vn)I(Vi,Vi+1)eE,1 彡i〈n}U{v0},表示V中 所有節(jié)點(diǎn)的路徑構(gòu)成的集合。具體來(lái)說(shuō),VvneF,其祖先路徑約束(Vtl,V1,v2, ...,vn)eP表示從根節(jié)點(diǎn)Vci到節(jié)點(diǎn)V"的連續(xù)父子約束,即Vd-V^V1^V2,. ..,Vn,簡(jiǎn)寫(xiě)為 v。一V1^V2- ... -Vn。使用函數(shù)path:V-P返回XML節(jié)點(diǎn)的祖先路徑約束,即當(dāng)VeV, path(V) eP0
[0048] <是定義在P上的前綴關(guān)系,< =KP1,P2)Ipi=V。一VV2- ... -Vm,P2 =Pi-Vm+i,PieP,P2eP}。若H(PpP2)H,簡(jiǎn)寫(xiě)為Pi<P2。函數(shù)path:V-P,VveV, path(V)eP返回節(jié)點(diǎn)v的祖先路徑。函數(shù)parent:V-V,Vveparent(V)返回節(jié)點(diǎn) V的父節(jié)點(diǎn),注意押觀咖。)=0,即若u-v,則parent(v) =u。函數(shù)value:Va|Ve-Vt, ClK,value(V)返回在XML文檔中節(jié)點(diǎn)v的Text值。
[0049] 對(duì)于示例文檔1進(jìn)行建模為文檔樹(shù)后,可以表示為如圖2a所示。其中,示例文檔 1為:
[0050] <?xmlyersion=" 1.0"?> <dblp> <time>201l</time> <articleindate="2011-05-31"> <author>P〈/author〉 <author>P.S</author> <ti11e>CIoudcomputing</ti11e> 〈/article〉 <articlekey="SasikalalI"mdate="2011-09-23"> </article> </dblp>
[0051] 對(duì)于示例文檔2進(jìn)行建模為文檔樹(shù)后,可以表示為如圖2b所示。其中,示例文檔 2為:
[0052] <?xmlversion=" 1.0"?> <dblp> <time>2012</time>
[0053] <articlemdate="2012-05-1 "> <author>A〈/author〉 <author>B〈/author〉 <author>C〈/author〉 <tit!e>CIoudcomputing</title> </article> 〈book> <author>lVi</author> <title>ThinkinginJAVA</title> 〈/'book〉 〈articlemdate="2012-09-3 "> </article> </dblp>
[0054] 步驟102、按照預(yù)設(shè)編碼規(guī)則對(duì)所述XML文檔D進(jìn)行編碼。
[0055] 具體的,本步驟中,按照深度優(yōu)先遍歷方式,對(duì)所述XML文檔D中VaIVe節(jié)點(diǎn)進(jìn)行編 碼。根據(jù)深度優(yōu)先編碼方式的特點(diǎn),可得如下結(jié)論:
[0056] 對(duì)VveK-Texi進(jìn)行編碼時(shí),其父節(jié)點(diǎn)parent(V) -定已經(jīng)編碼;VP1,VP2,若P1 <P2,則對(duì)P2進(jìn)行編碼時(shí),P 定已經(jīng)編碼。
[0057] 首先,定義編碼函數(shù)code:Va|VjP-Code,其中Code表示VaIVjP對(duì)應(yīng)的編碼。具 體來(lái)說(shuō),Code(VaIVe) -Code表示當(dāng)輸入為節(jié)點(diǎn)VaIVJ寸,輸出值為節(jié)點(diǎn)對(duì)應(yīng)的編碼(簡(jiǎn)稱(chēng) 節(jié)點(diǎn)編碼),code(P) -Code表示當(dāng)輸入為某節(jié)點(diǎn)對(duì)應(yīng)的祖先路徑約束時(shí),輸出值為該祖先 路徑對(duì)應(yīng)的編碼,即路徑編碼。
[0058] 其次,定義編碼規(guī)則,在編碼時(shí),屬性節(jié)點(diǎn)與元素節(jié)點(diǎn)同等對(duì)待,兩者遵守相同的 編碼規(guī)則,唯一不同之處在于屬性節(jié)點(diǎn)的命名規(guī)則是在屬性名稱(chēng)前添加符號(hào)@。
[0059] 除根節(jié)點(diǎn)外的節(jié)點(diǎn)編碼和路徑編碼均由三部分組成。即,節(jié)點(diǎn)編碼Code(V)= code(path(V))·iv;code(path(V))表示節(jié)點(diǎn)V對(duì)應(yīng)的路徑的路徑編碼,iv表示所述節(jié)點(diǎn) V在當(dāng)前層的編碼;所述節(jié)點(diǎn)V在當(dāng)前層的編碼表示所述節(jié)點(diǎn)V是同一祖先路徑下的同 名兄弟節(jié)點(diǎn)中從1開(kāi)始計(jì)數(shù)的順序i;路徑編碼code(path(v)) =code(u).ipath(v),其中, 彐(《,v)e五;code(u)表示路徑垃對(duì)應(yīng)的節(jié)點(diǎn)的父節(jié)點(diǎn)的節(jié)點(diǎn)編碼,ipath(v)表示所述路徑u在當(dāng)前層的編碼;所述路徑u在當(dāng)前層的編碼表示在所述路徑u對(duì)應(yīng)節(jié)點(diǎn)的父親節(jié)點(diǎn)中,設(shè) 定所有同名子路徑作為一個(gè)路徑種類(lèi),則所述路徑u所對(duì)應(yīng)的路徑種類(lèi)在所有兄弟路徑中 路徑種類(lèi)從1開(kāi)始計(jì)數(shù)的路徑種類(lèi)順序值i。
[0060] 需要說(shuō)明的是,所述節(jié)點(diǎn)編碼之間、以及所述路徑編碼之間均存在前綴關(guān)系,具體 為:若codel與code2之間滿(mǎn)足關(guān)系式code2 =codel.i,則判斷出codel是code2的前綴 編碼;其中,codel和code2分別表示兩個(gè)所述節(jié)點(diǎn)編碼,或者,codel和code2分別表示兩 個(gè)所述路徑編碼。由于該定義與文檔建立成文檔樹(shù)時(shí)定義的P上的前綴關(guān)系<實(shí)質(zhì)性含義 相同,所以此處也用<表示。3( (:'?也丨,(:'?心2)-:表示為Codel<Code2。
[0061] 所述預(yù)設(shè)編碼規(guī)則具體包括:所述根節(jié)點(diǎn)%的編碼為1,判斷所述根節(jié)點(diǎn)VC1所在 路徑是否包含所述屬性節(jié)點(diǎn);若包含,則按照所述屬性節(jié)點(diǎn)在所述文檔樹(shù)中的順序進(jìn)行編 碼,并記錄到編碼記錄表中;可以理解的是,若所述根節(jié)點(diǎn)Vtl所在路徑不包含所述屬性節(jié) 點(diǎn),則編碼結(jié)束。
[0062]具體的,對(duì)于Vve C I Fe,若c〇de(paiA(v)) = 0,則path (V)是節(jié)點(diǎn)parent (V)的第i 個(gè)被編碼的孩子路徑種類(lèi);所述孩子路徑種類(lèi)是指所述節(jié)點(diǎn)V的所有孩子節(jié)點(diǎn)中,同名孩 子節(jié)點(diǎn)的祖先路徑所構(gòu)成的路徑種類(lèi);也就是說(shuō),VveFJFe,若存在V-V1, V-V2,當(dāng)V1 和乂2是同名節(jié)點(diǎn)時(shí),Path(V1)和path(v2)屬于節(jié)點(diǎn)V的同一個(gè)孩子路徑種類(lèi),當(dāng)vJPV2F 是同名節(jié)點(diǎn)時(shí),Path(V1)和path(v2)和屬于節(jié)點(diǎn)V的不同的孩子路徑種類(lèi)。
[0063] 判斷節(jié)點(diǎn)V是否有孩子節(jié)點(diǎn),若是,對(duì)所述節(jié)點(diǎn)V的所述孩子節(jié)點(diǎn)進(jìn)行編碼;
[0064] 若判斷出所述節(jié)點(diǎn)V沒(méi)有所述孩子節(jié)點(diǎn),則判斷所述節(jié)點(diǎn)V是否有所述屬性節(jié) 占.
[0065] 若判斷出所述節(jié)點(diǎn)V有所述屬性節(jié)點(diǎn),則對(duì)所述屬性節(jié)點(diǎn)進(jìn)行編碼;或者,若判斷 出所述節(jié)點(diǎn)V沒(méi)有所述屬性節(jié)點(diǎn),判斷所述節(jié)點(diǎn)V是否有兄弟節(jié)點(diǎn);
[0066] 若判斷出所述節(jié)點(diǎn)V有所述兄弟節(jié)點(diǎn),則對(duì)所述兄弟節(jié)點(diǎn)進(jìn)行編碼;或者,若判斷 出所述節(jié)點(diǎn)V沒(méi)有所述兄弟節(jié)點(diǎn),則按照所述節(jié)點(diǎn)V的祖先路徑,逆向回退到存在未編碼兄 弟節(jié)點(diǎn)的祖先節(jié)點(diǎn),對(duì)所述祖先節(jié)點(diǎn)的所述未編碼兄弟節(jié)點(diǎn)進(jìn)行編碼;若按照所述節(jié)點(diǎn)V 的所述祖先路徑,逆向回退到所述根節(jié)點(diǎn)則編碼結(jié)束。
[0067] 進(jìn)一步地,對(duì)于Vve匕IK,若code(part(v)) # 0,貝Ij參照所述編碼記錄表,判斷 所述節(jié)點(diǎn)V的path(v)與parenUv)之間,是否存在前綴關(guān)系,即是否滿(mǎn)足關(guān)系式:Code(parent(V)) <Code(path(v));
[0068] 若不滿(mǎn)足,則重復(fù)所述判斷節(jié)點(diǎn)v是否有孩子節(jié)點(diǎn)的操作;
[0069] 若滿(mǎn)足,則code(v) = (code(path(v)))·j,其中je[1,2, 3......)表示所述節(jié)點(diǎn) V是所述節(jié)點(diǎn)V對(duì)應(yīng)祖先路徑種類(lèi)下的同名兄弟節(jié)點(diǎn)中從1開(kāi)始計(jì)數(shù)的順序,完成對(duì)所述節(jié) 點(diǎn)V的編碼后,重復(fù)所述判斷節(jié)點(diǎn)V是否有孩子節(jié)點(diǎn)的操作。
[0070] 按照本步驟對(duì)圖2a所示的文檔樹(shù)進(jìn)行編碼的過(guò)程中,所產(chǎn)生的中間結(jié)果如圖3a 所示;按照本步驟對(duì)圖2b所示的文檔樹(shù)進(jìn)行編碼的過(guò)程中,所產(chǎn)生的中間結(jié)果如圖3b所 不O
[0071] 步驟103、按照預(yù)設(shè)映射規(guī)則對(duì)所述XML文檔D進(jìn)行映射存儲(chǔ)。
[0072] 本步驟中,所述按照預(yù)設(shè)映射規(guī)則對(duì)所述XML文檔D進(jìn)行映射存儲(chǔ),具體可以包 括:
[0073] 提取所述XML文檔D對(duì)應(yīng)的所有code(V)和value(V),將不同code(V)的作為編 碼-值CodeToValue表的列名,將value(V)作為所述CodeToValue表中,與code(V)對(duì)應(yīng) 的列的列值,一個(gè)所述XML文檔D對(duì)應(yīng)所述CodeToValue表中的一行,并將所述XML文檔 D對(duì)應(yīng)的文檔名字作為行關(guān)鍵字;其中,所述CodeToValue表用于存放所述XML文檔D中 code(V)和對(duì)應(yīng)的value(V)??梢岳斫獾氖?,如果code(V)不存在,貝Ij開(kāi)辟一個(gè)新的列,如 果code(V)已經(jīng)存在,貝Ij直接存儲(chǔ)value(V)作為列code(V)對(duì)應(yīng)的值。
[0074] 提取所有的節(jié)點(diǎn)VeV-Text對(duì)應(yīng)的path(V)及code(V),將不同path(V)的作為 路徑-編碼PathToCode表的列名,每個(gè)path(V)對(duì)應(yīng)的所有code(V)用預(yù)設(shè)間隔符間隔, 所述XML文檔D對(duì)應(yīng)一個(gè)所述PathToCode表,并作為數(shù)據(jù)庫(kù)HBase中的一行進(jìn)行存儲(chǔ);其 中,所述PathToCode表用于存放所述XML文檔D中path(V)和對(duì)應(yīng)的code(V)。
[0075] 例如,對(duì)于示例文檔1,提取示例文檔1對(duì)應(yīng)的所有的code(V)和對(duì)應(yīng)的value(V) 存入數(shù)據(jù)庫(kù)Hbase的CodeToValue表中第一行。該行的數(shù)據(jù)可以如表一所示。
[0076] 表一
[0077]
【權(quán)利要求】
1. 一種可擴(kuò)展標(biāo)記語(yǔ)言XML文檔的存儲(chǔ)方法,其特征在于,包括: 將所述XML文檔D建模為文檔樹(shù)T;其中,文檔樹(shù)為T(mén):T= (V,V(l,E,2,P, <,path,parent,value),其中,V表示所述XML文檔D中的節(jié)點(diǎn)集合,表示所述XML文 檔D中的根節(jié)點(diǎn),E表示所述XML文檔D中父子約束關(guān)系集合,有窮字母表2表示所述 XML文檔D中所有節(jié)點(diǎn)名稱(chēng)的集合,P表示所述XML文檔D中祖先路徑約束集合,<表示 定義在P上的前綴關(guān)系,函數(shù)path:V-P,表示Vvepath(v)GP返回節(jié)點(diǎn)v的祖先路 徑,函數(shù)parent:V-V表示W(wǎng)er,/7are7tf(v)返回節(jié)點(diǎn)v的父節(jié)點(diǎn),其中iwe?((vQ) = 0,函數(shù) value:Va|Ve-Vt表示Vve|Fe,va/i/e(r)返回在所述XML文檔D中節(jié)點(diǎn)v的Text值; 按照預(yù)設(shè)編碼規(guī)則對(duì)所述XML文檔D進(jìn)行編碼; 按照預(yù)設(shè)映射規(guī)則對(duì)所述XML文檔D進(jìn)行映射存儲(chǔ)。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于: 所述節(jié)點(diǎn)集合V=AttrUElemUText,其中,Attr表示所述XML文檔D中所有屬性 節(jié)點(diǎn)的集合Va,Elem表示所述XML文檔D中所有元素節(jié)點(diǎn)的集合I,Text表示所述XML文 檔D中所有文本節(jié)點(diǎn)的集合Vt,U表示交集。
3. 根據(jù)權(quán)利要求2所述的方法,其特征在于,所述按照預(yù)設(shè)編碼規(guī)則對(duì)所述XML文檔D 進(jìn)行編碼,包括: 按照深度優(yōu)先遍歷方式,對(duì)所述XML文檔D進(jìn)行編碼。
4. 根據(jù)權(quán)利要求3所述的方法,其特征在于,所述預(yù)設(shè)編碼規(guī)則包括: 節(jié)點(diǎn)編碼code(v) =code(path(v)).iv;code(path(v))表示節(jié)點(diǎn)v對(duì)應(yīng)的路徑的路 徑編碼,iv表示所述節(jié)點(diǎn)v在當(dāng)前層的編碼; 路徑編碼code(path(v)) =code(u) ?ipath(v),其中,3(?,v)e£ ;c〇de(u)表示路徑u對(duì) 應(yīng)的節(jié)點(diǎn)的父節(jié)點(diǎn)的節(jié)點(diǎn)編碼,ipathW表示所述路徑u在當(dāng)前層的編碼。
5. 根據(jù)權(quán)利要求4所述的方法,其特征在于,所述節(jié)點(diǎn)編碼之間、以及所述路徑編碼之 間均存在前綴關(guān)系,具體為: 若codel與code2之間滿(mǎn)足關(guān)系式code2 =codel.i,則判斷出codel是code2的前綴 編碼;其中,codel和code2分別表示兩個(gè)所述節(jié)點(diǎn)編碼,或者,codel和code2分別表示兩 個(gè)所述路徑編碼。
6. 根據(jù)權(quán)利要求5所述的方法,其特征在于,在屬性節(jié)點(diǎn)的屬性名稱(chēng)前添加符號(hào)@。
7. 根據(jù)權(quán)利要求6所述的方法,其特征在于,所述預(yù)設(shè)編碼規(guī)則具體包括: 所述根節(jié)點(diǎn)的編碼為1,判斷所述根節(jié)點(diǎn)V。所在路徑是否包含所述屬性節(jié)點(diǎn); 若包含,則按照所述屬性節(jié)點(diǎn)在所述文檔樹(shù)中的順序進(jìn)行編碼,并記錄到編碼記錄表 中。
8. 根據(jù)權(quán)利要求7所述的方法,其特征在于,所述按照所述屬性節(jié)點(diǎn)在所述文檔樹(shù)中 的順序進(jìn)行編碼,具體包括: 對(duì)于Vve|G,若code(paf/!(v))= 0,貝ljpath(v)是節(jié)點(diǎn)parent(v)的第i個(gè)被編碼的孩 子路徑種類(lèi);所述孩子路徑種類(lèi)是指所述節(jié)點(diǎn)v的所有孩子節(jié)點(diǎn)中,同名孩子節(jié)點(diǎn)的祖先 路徑所構(gòu)成的路徑種類(lèi); 判斷節(jié)點(diǎn)V是否有孩子節(jié)點(diǎn),若是,對(duì)所述節(jié)點(diǎn)V的所述孩子節(jié)點(diǎn)進(jìn)行編碼; 若判斷出所述節(jié)點(diǎn)V沒(méi)有所述孩子節(jié)點(diǎn),則判斷所述節(jié)點(diǎn)V是否有所述屬性節(jié)點(diǎn); 若判斷出所述節(jié)點(diǎn)V有所述屬性節(jié)點(diǎn),則對(duì)所述屬性節(jié)點(diǎn)進(jìn)行編碼;或者,若判斷出所 述節(jié)點(diǎn)V沒(méi)有所述屬性節(jié)點(diǎn),判斷所述節(jié)點(diǎn)V是否有兄弟節(jié)點(diǎn); 若判斷出所述節(jié)點(diǎn)V有所述兄弟節(jié)點(diǎn),則對(duì)所述兄弟節(jié)點(diǎn)進(jìn)行編碼;或者,若判斷出所 述節(jié)點(diǎn)V沒(méi)有所述兄弟節(jié)點(diǎn),則按照所述節(jié)點(diǎn)V的祖先路徑,逆向回退到存在未編碼兄弟節(jié) 點(diǎn)的祖先節(jié)點(diǎn),對(duì)所述祖先節(jié)點(diǎn)的所述未編碼兄弟節(jié)點(diǎn)進(jìn)行編碼;若按照所述節(jié)點(diǎn)V的所 述祖先路徑,逆向回退到所述根節(jié)點(diǎn)V(l,則編碼結(jié)束。
9. 根據(jù)權(quán)利要求8所述的方法,其特征在于,所述按照所述屬性節(jié)點(diǎn)在所述文檔樹(shù)中 的順序進(jìn)行編碼,還包括: 對(duì)于Vvef*;,若code(p-(v)) # 0,則參照所述編碼記錄表,判斷所述節(jié)點(diǎn)v的path(v)與parent(v)之間,是否滿(mǎn)足關(guān)系式:Code(parent(v)) <Code(path(v)); 若不滿(mǎn)足,則重復(fù)所述判斷節(jié)點(diǎn)v是否有孩子節(jié)點(diǎn)的操作; 若滿(mǎn)足,則code(v) = (code(path(v))).j,其中jG[1,2, 3......)表示所述節(jié)點(diǎn)v是 所述節(jié)點(diǎn)v對(duì)應(yīng)祖先路徑種類(lèi)下的同名兄弟節(jié)點(diǎn)中從1開(kāi)始計(jì)數(shù)的順序,完成對(duì)所述節(jié)點(diǎn)v的編碼后,重復(fù)所述判斷節(jié)點(diǎn)v是否有孩子節(jié)點(diǎn)的操作。
10. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述按照預(yù)設(shè)映射規(guī)則對(duì)所述XML文檔 D進(jìn)行映射存儲(chǔ),包括: 提取所述XML文檔D對(duì)應(yīng)的所有code(v)和value(v),將不同code(v)的作為編碼-值CodeToValue表的列名,將value(v)作為所述CodeToValue表中,與code(v)對(duì)應(yīng)的列的列 值,一個(gè)所述XML文檔D對(duì)應(yīng)所述CodeToValue表中的一行,并將所述XML文檔D對(duì)應(yīng)的文 檔名字作為行關(guān)鍵字;其中,所述CodeToValue表用于存放所述XML文檔D中code(v)和對(duì) 應(yīng)的value(v); 提取所有的節(jié)點(diǎn)vGV-Text對(duì)應(yīng)的path(v)及code(v),將不同path(v)的作為路 徑-編碼PathToCode表的列名,每個(gè)path(v)對(duì)應(yīng)的所有code(v)用預(yù)設(shè)間隔符間隔,所 述XML文檔D對(duì)應(yīng)一個(gè)所述PathToCode表,并作為數(shù)據(jù)庫(kù)HBase中的一行進(jìn)行存儲(chǔ);其中, 所述PathToCode表用于存放所述XML文檔D中path(v)和對(duì)應(yīng)的code(v)。
【文檔編號(hào)】G06F17/30GK104484337SQ201410663532
【公開(kāi)日】2015年4月1日 申請(qǐng)日期:2014年11月19日 優(yōu)先權(quán)日:2014年11月19日
【發(fā)明者】鮑亮, 張靜, 黃鵬, 張強(qiáng), 衣凡 申請(qǐng)人:西安電子科技大學(xué)