CN102760173B - 一种自下而上的xml分支模式匹配方法 - Google Patents
一种自下而上的xml分支模式匹配方法 Download PDFInfo
- Publication number
- CN102760173B CN102760173B CN201210229103.6A CN201210229103A CN102760173B CN 102760173 B CN102760173 B CN 102760173B CN 201210229103 A CN201210229103 A CN 201210229103A CN 102760173 B CN102760173 B CN 102760173B
- Authority
- CN
- China
- Prior art keywords
- node
- nodes
- coupling
- label
- depths
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种自下而上的XML分支模式(Twig Pattern)匹配方法,采用自下而上的匹配顺序。首先解析分支模式,解析结果保存在Nodes,Depths,Relations,BranchingNodes,Pointers五个数组里。在获取节点层次信息的基础上,采用FilterStream节点筛选机制来筛选不符合层次要求的元素。然后进行分支模式匹配;通过判断节点的父亲或祖先节点的编码是否存在来确定节点间的结构关系,将节点间结构关系的判断转换为字符串查找问题,从而将元素间一对一的结构关系判断转换为元素间一对多的判断;达到利用现有的字符串查找技术来解决分支模式匹配问题。
Description
技术领域
本发明涉及一种自下而上的XML分支模式匹配方法,分支模式匹配(Twig Pattern Matching)是XML查询处理的核心操作,决定XML查询处理的性能和效率。分支模式匹配属于半结构化数据管理领域,是数据管理领域的一个分支。
背景技术
XML又称为可扩展标记语言(eXtensible Markup Language),是由W3C组织于1998年2月发布的一种标准。作为SGML的一个简化子集,它集成了SGML功能丰富与HTML易用性的特点,以一种开放、自描述的方式定义数据结构。XML可以同时描述数据内容和结构特性,通过这些结构特性,可以了解数据之间的语义关系。HTML文件中的标识符仅用于控制如何显示内容(如字体的大小等等),文件内容所表达的意义完全需要人通过对文字的阅读才能理解。而XML则不同,它所用的标识符本身就蕴含相应的语义信息,文件内容所表达的具体含义完全可通过对语义的分析由机器来解释。因此,HTML与XML之间的差别可以通俗的概括为:“HTML是写给人看的;而XML则是写给机器看的。”与SGML相比,XML更简单,同时也可用于设计文档描述语言。
XML自描述的特点使其自诞生之日起就引起了学术界和工业界的广泛关注并随着网络应用的爆炸式增长而得到了广泛应用。具体来说,XML的应用主要体现在以下几个方面:
数据交换: XML之所以能够应用于各种领域的原因,就是因为XML具有其它方法所不具备的数据描述特性,控制信息不依赖于应用软件,而是采用人和机器都可理解的标记形式来表现,XML使用标记(Tag)来描述元素,而XML文件是由一个个称之为元素(Element)的部件构成。使用标记的描述方法可以保留原数据的意义和关系,进而可在不同系统之间进行灵活的数据交换。所以适合于各种平台环境的数据交换。
数据定义: XML的标记名和元素之间的关系可以由使用者自定义,也就是说,根据特定的标记集合和XML语法可以定义一个全新的符号化语言。这就是XML“可扩充(Extensible)”名字的来源。因此,XML也被称为“定义语言的语言”,即XML是一种元语言。基于该特点,XML可以用于定义电子商务数据、多媒体演示数据、数学公式等各种各样数据应用语言的基础语言。
存储数据: 一个XML文档就是一个数据库,通过定义数据模式信息形成各种关系,实现数据交换、上下文检索、多媒体传输等。
XML的广泛应用使得以XML格式存储的数据越来越多,如今,XML已经成互联网上信息表示和交换的事实上的标准。而面对大量的XML数据,高效的XML查询处理技术变得十分重要。自1992年诞生以来,工业界和学术界就开始了对于XML这种半结构化数据的研究。现今,XML的研究也主要集中在节点编码、索引方法和分支模式匹配(Twig Pattern Matching)等三个方面。在XML查询处理中,分支模式匹配是高效的XML查询处理的一个核心操作。为此,寻求一种高效的算法来解决分支模式匹配问题具有重大的理论和现实意义。
过去几年里,国内外学者提出了许多分支模式匹配算法。2002年,Nicolas Bruno等人提出TwigStack算法来避免产生大量的中间匹配结果(N. Bruno, D. Srivastava, and N. Koudas. Holistic twig joins: optimal XML pattern matching. In :SIGMOM, 310-321, 2002.),2003年,Jiang等人提出XML区域树索引(XML Region Tree:XR-tree),XR-tree是一种动态的内存索引结构。基于XR-tree,设计了TSGeneric+算法来高效地跳过不参与连接的后代或祖先节点(Jiang, H., Lu, H.,Wang, W. Ooi, B.C.: XR-tree: Indexing XML date for efficient structural joins. In :ICDE, 2003.)。2004年,Lu等人提出TwigStackList算法来更好地匹配包含PC(Parent-Child)关系的分支模式(Lu, J., Chen, T., Ling, T.W.: Efficient processing of XML twig patterns with parent-child edges: a look-ahead approach. In: CIKM, 2004)。2005年,Lu等人又提出基于扩展的Dewey编码 (Extended Dewey Encoding)的分支模式匹配算法TJFast(Lu, J., Ling, T.W., Chan, C.Y., Chen, T.: From region encoding to extended dewey: On efficient processing of XML twig pattern matching. In: VLDB, 2005.)。TJFast只需处理分支模式中叶子节点的数据流。2006年,Chen等人提出Twig2Stack算法(Chen, S., Li, H.G., Tatemura, J., Hsiung, W.P., Agrawal, D., Candan, K.S.: Twig2stack: Bottom-up processing of generalized-tree-pattern queries over XML documents. In: VLDB, 2006.),利用层次栈列举匹配的路径。Twig2Stack算法的性能优于TwigStackList和TJFast,但是Twig2Stack会造成许多随机的节点访问,且动态的层次栈结构不易维护并且占用巨大的内存空间。这些算法具有下面的共同点:
⑴ 需要利用额外的数据结构(缓存),如栈或队列来动态维护部分或最终匹配结果;
⑵ 除了TJFast采用基于路径的编码外,都采用基于区域的编码;
⑶ 采用至上而下的匹配顺序;
⑷ 没有挖掘分支模式TP(Twig Pattern)包含的信息;
⑸ 节点层次只用于辅助判断父子关系。
先前的方法需要利用一组缓存(栈或者队列)来保存中间结果,维护这缓存需要时间和空间的代价;且以前的方法采用自上而下的匹配顺序,很少关注节点层次信息。
发明内容
发明目的:本发明提供一种自下而上的XML分支模式匹配方法,不需要缓存来保存中间匹配结果,这样判断节点间结构关系的问题就转变为字符串查找问题,从而可以利用成熟的查找技术(如散列)来高效处理分支模式匹配问题。采用自下而上的匹配顺序,是一种高效实用的分支模式匹配方法。
技术方案:一种自下而上的XML分支模式匹配方法,包括如下步骤:
第一步:采用Dewey*编码模式对XML文档进行节点编码,将每个节点的Dewey*编码存入Berkeley DB中;
第二步:进行分支模式解析,使用Nodes、Depths、Relations、BranchingNodes、 Pointers五个数组来记录分支模式解析的结果;五个数组功能如下:
Nodes:按照从左到右的顺序保存TP中的节点名称;
Relations:保存每个节点与其直接的父亲或祖先节点的结构关系;
BranchingNodes:保存TP中的分支节点名称;
Pointers:记录每个分支节点的范围,用<startP,endP>来表示,startP为Relations数组中包含“[”的数组下标,endP为Relations数组中与startP相对应的包含“]”的数组下标。有了Pointers数组来标识对应分支节点的范围,可以方便地找到以相应的分支节点为根的所有单一路径。
Depths:记录每个节点的深度(层次)信息。有三种表示形式:
⑴ Depths[i]=“l”:说明匹配TP的节点Nodes[i]只出现在第l层;
⑵ Depths[i]=“>l”:说明匹配TP的节点Nodes[i]出现在第j层,ljMaxLevel,MaxLevel为XML文档的最大深度;
⑶ Depths[i]=“>l<h”:说明匹配TP的节点Nodes[i]出现在第j层,且ljh。
第三步:读取数据流,同时进行数据流中元素的筛选。本发明提出了基于节点层次信息的节点筛选机制—FilterStream。通过对分支模式和查询数据集中对应节点层次的分析来筛选元素。FilterStream的筛选原则如下:
给定元素a i 节点a的层次数组depth(a i )和Depths(a),则:
⑴ 若depth(a i )Depths(a),则label(a i )不加入T a ;
⑵ 若depth(a i )Depths(a),则depth(a i )加入到Depths(a)且label(a i )加入T a 。
第四步:执行单一路径匹配或者分支路径匹配。PathLevel和TwigLevel算法采用自下而上的匹配顺序。匹配的核心思想是:把判断a i (a i T a )和b i (b i T b )是否满足PC或AD(Ancestor-Descendant)关系的操作转化为判断prefix(a i ,depth(b))在T b 中是否存在。若存在,则T b 中存在a i 的父亲或者祖先节点;否则,不存在。这样判断节点间结构关系的问题就转变为字符串查找问题,从而可以利用成熟的查找技术(如散列)来高效处理分支模式匹配问题。
第五步:使用outputSolutions来输出最终的匹配结果。
有益效果:与现有技术相比,本发明采用上述技术方案,具有下面的优势:
1) 解决了单一路径匹配和分支路径匹配问题;
2) 将元素间一对一的结构关系判断转换为元素间一对多的判断;
3) 将字符串查找技术引入到XML分支模式匹配领域,利用已有的字符串匹配技术来解决分支模式匹配问题;
4) 在满足一定条件时,FilterStream节点筛选机制能够明显减少匹配的时间。
附图说明
图1为本发明实施例的XML文档树的节点层次示例图;
图2为本发明实施例的总流程图;
图3为本发明实施例的节点编码数组;
图4为本发明实施例的Dewey*编码示例图;
图5为本发明实施例中“/A/B/C”的一轮匹配流程图;
图6为本发明实施例的TP的匹配流程图;
图7为本发明实施例的匹配结果的输出示例图。
具体实施方式
下面结合附图和具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。
准备知识
1.1.1 分支模式匹配
给定一个分支模式查询Q和一个XML数据集D,Q在D上的一个匹配要满足下面两个条件:(i)满足Q上节点的谓词表达式;(ii)满足Q上节点间的结构关系(AD或PC)。Q在D上的一个匹配可以使用n元向量(d 1 ,…, d n )来表示。
查找D中所有Q的匹配是XML查询处理的一个核心操作。在本文中,将分支模式匹配问题定义为:
给定一个分支模式Q和一个XML数据集D ,查找所有的这样一组元素,同时满足Q中节点的谓词表达式和Q中节点之间的结构关系。
1.1.2 命名标识
为了便于算法的描述与分析,本小节介绍文中使用的一些符号标记、函数名称和习惯用语。使用TP来表示分支路径模式,SP来表示单一路径模式。为了便于区分,在TP或SP中的节点我们称为节点(Node),而在XML数据集中的该节点我们称为元素(Element)。TP和SP中的节点n对应一个数据流T n ,T n 保存着该节点在XML数据集中的所有该元素的Dewey*编码。数据流的每一项称之为元素。在T n 上定义了下列函数:current(T n )、eof(T n )、advance(T n )。分别表示:取T n 的当前元素;判断是否到达T n 的结束位置;指向T n 的下一个元素。给定一个节点n,label(n)表示n的Dewey*编码;depth(n)表示n的深度 (本文中,深度和层次表示相同的意思,可交换使用)。Depths(n)表示n的层次数组,记录节点n出现的层次信息,而Depths[i]则表示获取Depths数组的第i个元素。parent_label(n) /ancestor_label(n)表示n的父亲或祖先节点的Dewey*编码。prefix(label(n),d)表示取n的前d层的Dewey*编码。descendents(n)表示取n 的所有后代节点。directBranchingOrLeafNodes(n)(简写为dbl(n))表示返回TP中以n为根结点的叶子或分支节点。给定分支模式TP=“a[//b]//c[//d/f]//e/g”,dbl(a) ={b,c},b为叶子节点,c为分支节点。
1.1.3 节点层次
本方法将XML看成一棵有向树(为了方便表示,没有使用有向箭头)。在XML文档树中,每个节点或者元素都处在一定层次上。如图1表示一棵根结点为root的文档树,节点层次也标在图中。节点层次或深度(记为level或depth,本文中层次和深度意思相同)定义为:
⑴ 若v为根节点,则depth(v) = 0;
⑵ 若v不是根节点,则depth(v) = depth(u) + 1,u是v的父亲节点。
图1中,root为根节点,则depth(root) = 0;其孩子节点的深度为depth(root) + 1,图中XML文档片段共有0,1,2,3层,第0层为根节点,是所有节点的祖先节点。第一层元素为第0层元素的孩子节点。第2,3层元素为第0,1层元素的子孙节点。
任意给定XML文档中的元素v,都处在一个层次上。给定节点name,name元素可能出现在XML文档中不同层次上。例如,name元素,它可以是author元素的孩子,也可以是subject的孩子。TP中的节点对应许多层次,本方法定义了一个深度数组Depths来记录TP中的节点出现的深度。不难发现,Depths的最大长度等于XML文档最长路径的长度。
如图2所示,本实施例分为五个步骤,下面具体介绍:
1.2 第一步:对XML文档的节点进行Dewey*编码
本方法的是基于节点层次信息的。因此,要求能够根据一个节点的编码方便地计算该节点的层次以及指定层次的祖先节点的编码。基于Dewey编码的局限性和PathLevel和TwigLevel算法的需求,提出了一种改进的Dewey编码模式—Dewey*编码。Dewey*编码采用编码数组Code(如图3)来编码节点。Code由大写字母A-Z和小写字母a-z组成,下标从1开始,总共52个成员。编码规则如下:
⑴ 若v是根节点,则label(v) = ε。否则转⑵;
⑵ 若v不是文本节点,且v是其父亲节点的第i个孩子,则label(v) = label(parent_label (v))+i/52+Code[i mod 52]。其中,“+”为字符串连接运算。否则转⑶;
⑴ 若v是文本节点,则label(v)= label(parent_label (v))+“”。
如图4所示,a 1 为根节点,则label(a 1 )为空,b 1 为a 1 的第1个孩子,则label(b 1 )=ε +1/52 + Code[1 mod 52]=0+Code[1]= “0A”;d 2 为b 2 的第二个孩子,则label(d 2 )= ε + 2/52 + Code[2 mod 52]=“0B”+ 0 +Code[2]=“0B0B”。已知label(f 1 )=“0D0B”,则depth(f 1 )= 2,f 1 是其父亲的第2个孩子( 0 ×52 + (‘C’-‘A’) = 2 )。其父亲的编码为label(parent_label(f 1 ))=“0D”。
Dewey*编码除具有传统Dewey编码特性之外,还具有以下特性:
⑴ 只需要统计编码中出现的字母个数就能够方便地判断节点的层次;
⑵ 能够方便地确定指定层次的父亲或祖先节点的Dewey*编码;
⑶ 能够支持大数据量的XML编码,如“1234z” 表示的是其父亲第64269个孩子;
⑷ 文本节点以“”结尾,能够很方便地区别文本节点和非文本节点;
⑸ 能够有效地支持通过字符串匹配来判断元素间的结构关系。
本文采用Berkeley DB来存储节点的Dewey*编码。Berkeley DB提供了B-tree索引,能够很好地支持节点数据流的检索。节点编码以<element_name,label(element_name)>的形式存储在Berkeley DB中。其中element_name为节点名称,label(element_name)为节点element_name的Dewey*编码。节点的Dewey*编码也可以存储在关系数据库中来支持XML查询处理。
1.3 第二步:进行分支模式解析
在PathLevel和TwigLevel中,首先对分支模式进行解析,最大可能地提取对路径匹配有用的信息。本方法使用下面的五个数组来保存解析分支模式后得到的信息:
Nodes:按照从左到右的顺序保存TP中的节点名称;
Relations:保存每个节点与其直接的父亲或祖先节点的结构关系;
BranchingNodes:保存TP中的分支节点名称;
Pointers:记录每个分支节点的范围,用<startP,endP>来表示,startP为Relations数组中包含“[”的数组下标,endP为Relations数组中与startP相对应的包含“]”的数组下标。有了Pointers数组来标识对应分支节点的范围,可以方便地找到以相应的分支节点为根的所有单一路径。
Depths:记录每个节点的深度(层次)信息。有三种表示形式:
⑴ Depths[i]=“l”:说明匹配TP的节点Nodes[i]只出现在第l层;
⑵ Depths[i]=“>l”:说明匹配TP的节点Nodes[i]出现在第j层,ljMaxLevel,MaxLevel为XML文档的最大深度;
⑵ Depths[i]=“>l<h”:说明匹配TP的节点Nodes[i]出现在第j层,且ljh。
例1. 解析TP1=“/S[.//VP/IN]//NP”后,数组的内容分别为:Nodes:{ S,VP,IN,NP };Relations:{ /, [.//,/,]// };BranchingNodes:{ S };Pointers:{ <1,3> };Depths:{ 0,>1,>2,>1 }。
例2. 解析TP2=“/root/course[subj]/time/start_time”后,数组的内容分别为: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[0].startP-1]的孩子;对于Relations[2]=“[”,说明Nodes[2]是Nodes[Pointers[0].startP-1]的孩子。
1.4 第三步:读取数据流以及节点的筛选
上一节对TP2解析后获得的Depths数组,可以明确地知道:匹配TP2的course元素只出现在第1层,位于其他层次的course节点都不匹配分支模式。因此,可以直接筛选掉不是第1层的course元素。
TP中的节点在XML文档中出现层次是确定的,只能出现在第i层 (0iH,H为XML文档的最大深度)。从TP解析后获得的Depths数组不一定能精确地确定匹配TP的元素出现的层次,只能确定一个范围,如“>a”或“>a<b”。为了最大可能精确地确定节点出现的层次,在查找节点数据流T时,比较元素的实际层次和节点层次数组Depths且执行下列操作:
给定元素a i 节点a的层次数组Depths(n),则:
⑴若depth(a i )Depths(a),则label(a i )不加入T a ;
⑵若depth(a i )Depths(a),则depth(a i )加入到Depths(a)且label(a i )加入T a 。
根据上述思想,提出了基于节点层次信息的节点筛选机制—FilterStream。在能从分支模式获得明确的节点层次信息的情况下,FilterStream能够达到很好的节点筛选效果。特别是对于同一个节点可以出现在XML文档中不同层次的情况,通过这种方法筛选节点能够达到很好的效果。
TwigLevel和PathLevel算法通过FilterStream来完成两步操作:⑴根据Depths(n)来筛选T n ,筛选掉T n 中层次不属于Depths(n)的元素;⑵删掉d,其中dDepths(n)ddepth(t),tT n ,即删除掉Depths(n)中节点n在XML文档中未出现的层次。经过FilterStream筛选和精化后,节点n对应的数据流T n 只剩下符合Depths(n)指定层次的元素;Depths(n)只包含节点n在文档中实际出现的层次,且满足路径模式指定的层次范围。
1.5 第四步:使用PathLevel算法来进行单一路径匹配
给定单一路径模式SP=“/A/B/C”,对应节点的数据流分别为T A 、T B 和T C 。对于T C 中的元素Tc i ,若Tc i 匹配SP,则T B 中存在一个T Bj 满足:T Bj 是Tc i 的父亲;且T A 中存在一个T Ak 满足T Ak 是T Bj 的父亲。根据Dewey*编码的特性,由Tc i 和Depths(B)和Depths(A)可以知道其父亲节点B和祖先节点A的Dewey*编码。为此,判断Tc i 和T Bj 之间的结构关系转换为判断T B 中否在存在parent_label(Tc i ),这是字符串查找问题,可以利用现有的查找算法(比如二分查找,散列查找)来解决。PathLevel算法正式基于这一思想构建起来的。
图5给出了SP=“/A/B/C”的一轮匹配流程,从叶子节点C开始匹配自下而上匹配。从T C 的第一个元素Tc 1 开始,根据Tc 1 计算节点B的Dewey*编码(parent_label(Tc 1 )),接着判断T B 中是否存在parent_label(Tc 1 )。若存在,则Tc 1 的父亲节点是B,匹配“B/C”。若不存在,删除Tc 1 。同样方法继续判断Tc 1 是否匹配“A//C”(层次相差2)。若存在,则Tc 1 匹配SP,处理T C 的下一个元素;若不存在,说明Tc 1 的祖先节点不是A,故不匹配“/A/B/C”,则可以断定,Tc 1 不匹配SP,删除Tc 1 。处理T C 的下一个元素。当T C 中的元素全部处理完后,剩余T C 中的元素都匹配SP。
PathLevel分为两个阶段:准备阶段(Preparation Stage)和查询阶段(Searching Stage)。准备阶段完成SP的解析、节点筛选和层次精化三个工作;获得已经筛选的节点数据流后,开始查询阶段。PathLevel算法从SP的叶子节点开始向上匹配。通过getLeafNode函数来获得SP的叶子节点n。从叶子节点数据流T n 的当前元素开始判断是否匹配查询模式SP。判断T n 的当前元素L是否匹配SP,若L匹配TP,处理下一个元素;若L不匹配SP,从T n 中删除元素L。在L向上匹配的过程中,m节点层次的确定有三种可能情况 (假设与叶子节点n匹配的节点是Nodes[i] = m):
Case 1:若n与m之间只存在PC边,则depth(m) = depth(n) – C ,C为 n和m间PC边的数目;
Case 2:若筛选后的m节点只出现一个层次上,则depth(m) = Depths(m);
Case 3:若筛选后的m节点可能出现在许多层次上(Depths(m)中保存m可能的层次)。则depth(m)=Depths[i],1iLen,Len为层次数组Depths的长度。
在确定m节点的层次后,判断元素L 与m能否匹配SP规定的结构关系。若匹配,则保留元素L;若不匹配,则从T n 中删除L。这一步是算法的核心操作,prefix(L,depth(m))函数来提取元素L在depth(m)层上的祖先节点的Dewey*编码。isFind(prefix(L,depth(m)),T i )函数查找T i 中是否存在prefix(L,depth(m))的元素,若存在,则匹配,继续匹配上一层节点Nodes[i+1];否则,不匹配,从T n 中删除L。isFind函数将节点间结构关系判断问题转换为字符串查找问题,将粒度为1×1的关系匹配提升为1×N的匹配,能够明显地提高匹配速度。当处理完T n 的所有元素后,T n 只剩下匹配分支模式SP的元素。这些元素就是最终的匹配结果,由这些元素可以推出所有匹配SP的元素。PathLevel由outputSolutions函数输出最终的匹配结果。
例3,考虑图4,给定SP=“/A/B/D”,对SP解析后将得到Nodes:{ A,B,D };BranchingNodes:{ };Pointers:{ };Relations:{ /,/,/ };Depths:{ 0, 1,2 };b 1 ,b 2 ,b 3 表示节点B在XML文档中的不同出现,对应的Dewey*编码分别为“0B”,“0C”,“0D”。节点数据流分别为T B ={“0B”,“0C”,“0D”};T A ={};T D ={“0C0B”,“0C0C”}。此时,完成了准备阶段的所有工作,开始查询阶段。getLeafNode(SP)函数返回D,A为SP的根结点。L =D,开始匹配T D 中每一个元素,current(T D ) =“0C0B”,节点A与B之间只有PC边,满足Case 1的情况,d 1 在第1层((depth(“0C0B”) – 1 = 1)的祖先的Dewey*编码为“0C”,isFind(T B ,“0C”)返回为真(第6行),说明“0C0B”匹配“B/D”,即“0C0B”是B的孩子。接着“0C0B”匹配A,同样,d 1 节点是A的子孙。因为A是最顶层的节点(根结点),则匹配结束,“0C0B”(d 1 )匹配SP。然后处理T D 中的一下个元素“0C0C”,显然,“0C0C”也匹配查询路径SP。此时,T D 的最后一个元素处理结束,查询结束,T D 保留着匹配SP的所有D节点的Dewey*编码。输出T D 得到匹配结果:d 1 (“0C0B”),d 2 (“0C0C”)。
1.6 第四步:使用TwigLevel算法来进行分支路径匹配
在PathLevel算法的基础上,发展了TwigLevel算法来解决分支模式匹配问题。从分支节点开始到叶子节点的单一路径采用PathLevel算法来处理。对于一个分支模式TP来说,它可以拆分为若干个单一路径。本方法引入查询区域的概念(见定义1),一个分支模式对应若干个查询区域,一个查询区域有若干个单一路径组成。
例4,对于TP=“/root/course[subj]/time/start_time”,TP可以分为两个区域R1和R2,在R1中包含单一路径SP1 =“root/course”;在R2中包含SP1= “course/time/start_time”,SP2=“course/subj”。
TwigLevel算法采用自下而上的匹配顺序。给定分支模式TP,首先处理区域R2,获得已经过筛选的节点数据流Tcourse, Tsubj, Tstart_time。每个叶子节点保存了从根节点到该节点的所有路径信息,一个区域匹配结束后,只需根据该区域根节点和叶子节点数据流(已更新)就可以构造出该区域的匹配结果。
如图6,区域R2中,course为R2的根节点,则R2的匹配结果只需由Tcourse,Tsubj,Tstart_time即可构成。而对于R2,可以分为两个单一路径,SP1= “course/time/start_time”,SP2=“course/subj”。匹配SP1和SP2使用PathLevel算法。
在区域R2中,SP1的路径长度为2,SP2路径长度为1,因此,首先计算SP1,然后计算SP2。在SP的匹配结果保存上,同样我们只需要保存SP的根节点和叶子节点的数据流。匹配完区域R2后,匹配区域R1,因为区域R1包含了分支模式TP的根节点,所以处理完区域R1后,整个匹配过程结束,输出最终的匹配结果,TwigLevel算法结束。
TwigLevel在匹配单一路径时,使用PathLevel算法完成匹配,但不同于PathLevel算法的是,除了要动态维护叶子节点的数据流之外,还需要动态维护分支节点的数据流,确保每一个分支节点中的元素在一个区域匹配结束后,都是该区域的匹配结果。
定义1. 查询区域(Region):给定一个分支模式TP,则TP的根结点对应一个查询区域;若BN为TP中的一个分支节点,对于ndbl(BN),从分支节点BN到节点n的路径为一条单一路径SPi,所有这些由BN出发到n的单一路径SPn构成了一个查询区域RBN。
图6中,从节点course出发有两条单一路径SP1和SP2,SP1和SP2构成了TP的一个查询区域R。TwigLevel中,以一个查询区域R为一个查询单元,在每一个R中,分别使用PathLevel来匹配每一条单一查询路径SP,除了要移除T n 中不匹配SP的元素,还要移除T BN 中不匹配SP的元素。在区域R中,分别匹配每一个单一查询路径SP。查询区域R的所有SP都匹配结束后,TwigLevel能确保叶子节点数据流T n 中的每一个元素都匹配对应的单一路径SP,确保分支节点数据流T BN 中的每一个元素都匹配所有的以BN为根结点的单一路径SP。接着,处理上一层的查询区域(同一层次的查询区域从左到右依次处理)。当处理到根结点所在查询区域时,查询结束。调用outputSolutions函数输出匹配结果。
在一个查询区域R中,匹配每条SP的次序按照SP的叶子节点在Nodes中的相反的顺序进行。为了更快的匹配速度,可以根据每条SP的长度,T n 的元素数目等参数综合考虑来决定处理SP的先后次序。图7的匹配顺序为R2(SP1SP2)R1。
TwigLevel也分为两个阶段:准备阶段和查询阶段。准备阶段和PathLevel一样,完成分支模式解析、节点筛选和节点层次精化三个工作。TwigLevel算法的整体流程,按照自下而上,从左到右的顺序处理每一个查询区域直到根结点,匹配结束。分别匹配以分支节点b为根结点的每条单一路径SP。输出最终的匹配结果。
例5.考虑图4,给定TP=“/A[.//D]/C/F”,节点数据流T A ={};T D ={“0C0B”,“0C0C”},T C ={“0E”}, T F ={“0E0C”}。TP只有一个分支节点A,有一个查询区域R,R有两条单一路径SP1=“A/C/F”和SP2=“A//D”。查询阶段开始时,b = A,dbl(b) = {D,F },先匹配SP1,匹配结束后,节点数据流中的元素为T A ={},叶子节点T F ={“0E0C”};然后匹配SP2,匹配结束后T A ={},T D ={“0C0B”,“0C0C”};因为A为TP的根结点,则结束查询。调用outputSolutions(A)输出最终的匹配结果为:[,“0C0B”,“0C”,“0E0F”],[,“0C0C”,“0C”,“0E0F”]。
1.7 第五步:使用outputSolutions来输出匹配结果
分支模式匹配最终匹配结果输出从层次最高的根结点开始,自上而下输出匹配结果。给定TP=“//A[../B]/…/C[…/D]/…/E”,图7演示了匹配结果的输出过程。T A ,T B ,T C ,T D ,分别对应节点A,B,C,D,E的数据流。SP1和SP2表示节点E,D到C的单一路径;SP3和SP4表示节点B,C到A的单一路径,且Length(SPi,i =1,2,3,4) >= 1。在TP中,节点A是层次最高的分支节点,故匹配结果输出从节点A开始。current(A)=a1,输出[a1];在T B 中有prefix(a1b1) =a1,prefix(a1b2) = a1,输出[a1b1,a1b2] 然后处理右孩子,在T C 中,prefix(a 1 c 1 )=a 1 ,输出[ a 1 c 1 ];因为节点C是分支节点,所以继续处理C节点的左右孩子。T D 中,prefix(a1c1d1)=a1c1,prefix(a1c1d2)=a1c1,输出[ a1c1d1,a1c1d2];而T E 中,prefix(a1c1…e1) = a1c1,prefix(a1c1…e2)= a1c1,输出[ a1c1…e1,a1c1…e2]。
所以,图7中,与TP匹配且以a1为根节点的结果为[a1],[a1b1,a1b2],[a1c1],[a1c1…e1,a1c1…e2]之间的笛卡尔积。例如[a1, a1b1, a1c1, a1c1…e1 ],[a1, a1b1, a1c1, a1c1…e2] 等都是最终匹配结果。
显然,可以采用递归程序来输出匹配结果。outputSolutions从分支模式的根结点n开始,首先输出n的数据流T n 的当前元素。PathLevel或者TwigLevel算法保证T n 中的所有元素都是匹配对应的路径模式(即都能形成最终的匹配结果)。接着处理每一个T e ,e dbl(n),若e为叶子节点,则直接输出T e 中以current(T n )为前缀的元素e i ;若e为分支节点,则以相同的方式处理e(调用递归函数outputSolutions(e))。
Claims (1)
1.一种自下而上的XML分支模式匹配方法,其特征在于,包括如下步骤:
第一步:采用Dewey*编码模式对XML文档进行节点编码,将每个节点的Dewey*编码存入Berkeley DB中;Dewey*编码采用编码数组Code来编码节点,Code由大写字母A-Z和小写字母a-z组成,下标从1开始,总共52个成员,编码规则如下:
(1)若v是根节点,则label(v)=ε;否则转(2);其中,label(v)表示节点v的Dewey*编码;
(2)若v不是文本节点,且v是其父亲节点的第i个孩子,则label(v)=label(parent_label(v))+i/52+Code[i mod 52];其中,“+”为字符串连接运算;否则转(3);
(3)若v是文本节点,则label(v)=label(parent_label(v))+“”;
第二步:进行分支模式解析,使用五个数组来记录分支模式解析的结果;
第三步:读取数据流,同时进行数据流中元素的筛选;所述数据流中元素的筛选为基于节点层次信息的节点,其筛选机制是FilterStream,通过对分支模式和查询数据集中对应节点层次的分析来筛选元素;
第四步:执行单一路径匹配或者分支路径匹配,单一路径匹配PathLevel和分支路径匹配TwigLevel算法采用自下而上的匹配顺序,使判断节点间结构关系的问题就转变为字符串查找问题,从而可以通过查找处理分支模式匹配问题;
第五步:输出最终的匹配结果;
所述步骤二中,五个数组包括:
Nodes:按照从左到右的顺序保存TP中的节点名称;
Relations:保存每个节点与其直接的父亲或祖先节点的结构关系;
BranchingNodes:保存分支模式TP中的分支节点名称;
Pointers:记录每个分支节点的范围,用<startP,endP>来表示,startP为Relations数组中包含“[”的数组下标,endP为Relations数组中与startP相对应的包含“]”的数组下标;
Depths:记录每个节点的深度或层次信息,有三种表示形式:
(1)Depths[i]=“l”:说明匹配TP的节点Nodes[i]只出现在第l层;
(2)Depths[i]=“>l”:说明匹配TP的节点Nodes[i]出现在第j层,l≤j≤MaxLevel,MaxLevel为XML文档的最大深度;
(3)Depths[i]=“>l<h”:说明匹配TP的节点Nodes[i]出现在第j层,且l≤j≤h;
所述步骤三中,其中,FilterStream的筛选原则如下:
给定元素ai节点a的层次数组分别为depth(ai),Depths(a)则:
若则Dewey*编码label(ai)不加入数据流Ta;
若depth(ai)∈Depths(a),则depth(ai)加入到Depths(a)且Dewey*编码label(ai)加入数据流Ta;
所述步骤四中,单一路径匹配PathLevel或分支路径匹配TwigLevel算法采用自下而上的匹配,
具体匹配步骤是:把判断元素ai和bi是否满足PC或AD关系的操作转化为判断prefix(ai,depth(b))在数据流Tb中是否存在;若存在,则数据流Tb中存在ai的父亲或者祖先节点;否则,不存在;其中prefix(ai,depth(b))表示取元素ai前depth(b)层的Dewey*编码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210229103.6A CN102760173B (zh) | 2012-07-02 | 2012-07-02 | 一种自下而上的xml分支模式匹配方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210229103.6A CN102760173B (zh) | 2012-07-02 | 2012-07-02 | 一种自下而上的xml分支模式匹配方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102760173A CN102760173A (zh) | 2012-10-31 |
CN102760173B true CN102760173B (zh) | 2015-04-08 |
Family
ID=47054630
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210229103.6A Active CN102760173B (zh) | 2012-07-02 | 2012-07-02 | 一种自下而上的xml分支模式匹配方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102760173B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103294791A (zh) * | 2013-05-13 | 2013-09-11 | 西安电子科技大学 | 一种可扩展标记语言模式匹配方法 |
CN104484337B (zh) * | 2014-11-19 | 2018-09-14 | 西安电子科技大学 | Xml文档的存储方法 |
CN107342881B (zh) * | 2016-05-03 | 2021-03-19 | 中国移动通信集团四川有限公司 | 一种操作维护中心北向接口数据处理方法及装置 |
US11520782B2 (en) | 2020-10-13 | 2022-12-06 | Oracle International Corporation | Techniques for utilizing patterns and logical entities |
CN113590895B (zh) * | 2021-07-28 | 2023-04-25 | 西华大学 | 一种字符串检索方法 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101807211A (zh) * | 2010-04-30 | 2010-08-18 | 南开大学 | 一种面向海量小规模xml文档融合路径约束的xml检索方法 |
-
2012
- 2012-07-02 CN CN201210229103.6A patent/CN102760173B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101807211A (zh) * | 2010-04-30 | 2010-08-18 | 南开大学 | 一种面向海量小规模xml文档融合路径约束的xml检索方法 |
Non-Patent Citations (3)
Title |
---|
Indexing and querying XML using extended Dewey labeling scheme;Jiaheng Lu等;《Data & Knowledge Engineering》;20111231;全文 * |
一种新的基于Dewey编码的XML路径索引;李玲娟等;《计算机技术与发展》;20101031;第20卷(第10期);全文 * |
面向更新的扩展Dewey 编码;周军锋等;《Journal of Frontiers of Computer Science and Technology》;20101031;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN102760173A (zh) | 2012-10-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Faye et al. | A survey of RDF storage approaches | |
US8255394B2 (en) | Apparatus, system, and method for efficient content indexing of streaming XML document content | |
Pal et al. | Indexing XML data stored in a relational database | |
CN102760173B (zh) | 一种自下而上的xml分支模式匹配方法 | |
Hachicha et al. | A survey of XML tree patterns | |
CN101727498A (zh) | 一种基于web结构的网页信息自动提取方法 | |
CN102043852A (zh) | 一种基于路径信息的可扩展标记语言祖先后代索引方法 | |
Bramandia et al. | On incremental maintenance of 2-hop labeling of graphs | |
Alghamdi et al. | Semantic-based Structural and Content indexing for the efficient retrieval of queries over large XML data repositories | |
US20130297657A1 (en) | Apparatus and Method for Forming and Using a Tree Structured Database with Top-Down Trees and Bottom-Up Indices | |
Liu et al. | Tree pattern matching in heterogeneous fuzzy XML databases | |
CN102087666A (zh) | 一种基于节点与关键字覆盖关系的索引及其构建方法和查询方法 | |
Boussaid et al. | Warehousing complex data from the web | |
Lu | An Introduction to XML Query Processing and Keyword Search | |
Alghamdi et al. | Object-based semantic partitioning for XML twig query optimization | |
Liu et al. | Efficient keyword search in fuzzy XML | |
Zuopeng et al. | An efficient index structure for XML based on generalized suffix tree | |
Lee et al. | Bitmap indexes for relational XML twig query processing | |
Chang et al. | Automatic extraction of information blocks using pat trees | |
Wang et al. | Deriving relation keys from XML keys | |
Davulcu et al. | OntoMiner: automated metadata and instance mining from news websites | |
Wang et al. | Holistically stream-based processing Xtwig queries | |
LU et al. | TJFast: Efficient processing of XML twig pattern matching | |
Zezula et al. | Processing XML queries with tree signatures | |
Qunai | Hierarchical Stack-Based Twig Query Algorithm of XML Data |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |