一种xml压缩数据的多查询处理方法

文档序号:6469300阅读:170来源:国知局
专利名称:一种xml压缩数据的多查询处理方法
技术领域
本发明属数据库技术领域,具体涉及一种快速有效 地对一个XML文档进行多查询处理的方法。采用该方法 可以在分布式协作的服务器/客户端网络下,有效地克服 XML文档自身的冗余问题,并高效地实现多查询处理。
背景技术
继HTM"Hyper Text Markup Language) 语言之后,
XML (eXtensibleMarkup Language)语言业已逐渐成为互
联网信息的主要表示和交换工具。随着XML文档的使用
曰频繁广泛网络上越来越多的信息以XML的模式来
进行存储和传递,同时一些需要传递的XML文档规模也
不断增大。在有限带宽和处理能力的条件下,怎样有效
的进行信息的传递,既能提高查询技术又减小对带宽的
消耗,成为当、/ * 目'J研究的热点话题之一。对XML文档进行
压縮从而减小其规模成为一种可能的解决方式。由于XML
文档不同于般的文本性文档,它同时包含了数据信息
和数据间的结构关系,怎样才能有效地利用XML文档的
特征来进行有效的压縮,同时又不会对查询处理带来过
多的冗余操作,是针对XML压縮的两个关键问题。
2000年第 一 种针对XML的压縮方法XMill被提出, 其动机是最大程度的减小XML文档的规模。因此XMill 将XML的结构和数据分割开来,先对文档抽取结构 (skeleton),再对文档进行遍历,对相同路径下的所有 结点归类到同一个桶中,遍历结束之后,每个桶内的数据具有相同的特性,如全部都是整数,或全都是字符串。 由于针对整数、字符串和浮点数的最优压縮技术互不相
同,针对分类之后得到的桶,XMill选择最适合的方法进 行压縮,从而保证了整个文档的高压縮率。
不同于XMill, XMLPPM针对遍历XML文档的SAX流 进行动态的压縮,这个方法通过采用了部分匹配预测 (Prediction by Partial Match)方法进行压縮而得以 命名。在SAX遍历的过程中,对于每个XML标签,都构 造一个PPM模型进行编码。该模型包含了几个部分Syms 部分,用于存储首次出现的标签和属性(attribute)名; Elts部分,利用索引表示当前的标签并保存下来以维持 原文档的结构;Atts则用于区分标签和属性,因为其中 只保存了属性名和文本数据;Chars用来保存每个标签对 应的数据。在Chars中的每个文本数据之前,都标注上 对应元素的索弓l;而Atts和Chars中都通过"〈n> "来 维持四个模型之间的关系,从而维持模型之间的交叉依 赖。通过使用PPM模型来对即将来到的字符串进行预测, XMLPPM方法实现了当前XML压縮方法中的最高压縮率。
XMill和XMLPPM通过对XML文档的数据和结构进行 分离并针对数据类型选择压縮方法实现了较高的压縮 率,但是这两种方法得到的压縮文档不能保存原有的结 构,如果要对压縮文档进行查询,就需要将整个文档进 行解压縮,而这将耗费比压縮更多的时间和空间。因此 学者们转向了支持直接査询的压縮方法。2002年,针对 日益广泛的手机,PDA和Palm的有限CPU,第 一 种同态 压縮技术XGRIND得以提出。
XGRIND是一种非自适应的压縮方法,在压縮开始前, 它必须采用DTD来建立字典,同时还要对原文档进行一次预扫描以搜集所有的词频信息,从而建立对应的
Huffman编码器。在压縮过程中,对于文档中每个元素和 属性,直接采用字典中对应的索引数进行替代。而对大 量的非枚举型元素,采用已有的Huffman编码器进行编 码。此外枚举型数据则直接使用二元编码。XGRIND旨在 保留原文档的结构,因此压縮后的文档实现了和原文档 的——对应,也使得大部分的XPath査询能够直接在压 縮文档上进行执行。但对于包含范围谓词(range predicate)查询,必须对压縮文档进行对应部分的局部 解压縮。由于该方法只针对XML文档的冗余标签,而没 有解决文档中的路径和数据重复问题,其压縮率远远低 于XMill和XMLPPM。同时由于无法对所有的复杂查询进 行直接解析,XGRIND的査询支持率也不尽人意。
在分析了 XGRIND的优点和缺点之后,2004年XPress 被提出。这一方法创新性地提出了针对标签压縮的逆向 数学编码,不仅有效地进行编码,同时增强了其对查询 执行的支持。这一方法将标签(包括元素和属性)转化 为 一 个浮点数据,转化规则依赖于该标签所处的路径和 所有的祖先结点信息。这种压縮方法通过数值区间的包 含来表示结点之间的祖先和后代关系。对于文档中的文 本数据,XPress则根据数据特征来选择使用字典或 Huffman编码。由于逆向编码有效的保持了路径信息, XPress对查询的支持率大大提高。同时这一编码方式, 对于复杂路径中的后代査询也进行了有效的解决。

发明内容
本发明的目的在于提供一种XML压縮数据的多查询 处理方法,其是一种在分布式网络环境下的结构化査询索引树结构,使之作为全局结构优化整个网络的稳定性, 并具有多样的査询支持能力。 该方法步骤是
a,对原始的XML文档进行压縮;
b,采用 SQIT构造算法,建立结构化査询索引树
SQIT;
c,根据建立的构化査询索引树SQIT,进行SQIT查 询算法处理。
所述的SQIT构造算法,其步骤是 步骤l,输入参数Sq和R,其中,Sq是査询集合,R是査 询树的根节点;
步骤2,初始化循环变量qn为0,用来标记当前处理的 査询;
步骤3 ,判断条件,如果Sq中还有未被处理的査询,就执 行4 ;否则,就执行1 2 ;
步骤4,Q是Sq中正在被处理的查询,如果Q是复杂查询, 就将Q转化为SXP,然后初始化循环变量sn; 步骤5,针对当前每一个栈,都执行6;
步骤6,如果Q包含当前栈顶元素,就执行7;否则,执
行8;
步骤7,把Q压入当前栈内,如果Q包含多个栈顶元素, 就合并这些栈,并把Q作为栈顶元素;
步骤8 ,如果栈顶元素包含Q ,就执行9 ;否则,执行5 ;
步骤9,把Q压入到栈的次顶元素中;
步骤10,如果Q与所有的栈顶元素都没有包含关系,就 新建一个栈,把Q压入新栈;
步骤11,计算共享前缀,并把所有栈顶元素记为R的孩 子;步骤12,初始化循环变量n为0;
步骤13,针对每一个栈,如果含有多个元素,就递归执 行1;
步骤14,输出SQIT树,结束。
所述的SQIT査询算法处理,其步骤是 步骤1,输入参数Doc和Sqit,其中,Doc是压縮的XML 文档,Sqit是包含所有子査询的SQIT树; 步骤2,初始化,新建关于Doc根节点的路径结构PSr, 并将Sqit的根压入到PSr的UnsatNodes中,再把PSr压入 到路径栈中;
步骤3 ,针对每 一 个标志T ,执行4 ;
步骤4,新建T的路径结构PST,并把路径栈的栈顶元素
记为PSp。
七发明的优点在于,在分布式协作的服务器/'客户端网
络下为了有效地克服XML文档自身的冗余问题,并高
效地实现多査询处理,我们提出了 一种针对压縮数据的
基于结构化査询索引树(SQIT)的多查询处理算法该
方法不仅能够支持更加复杂的査询,还能增强通査询
树在分布式环境中的鲁棒性,以适应分布式环境中中转
节点不稳定的情况。在同类技术和方法中,本发明处于
领先水平,是相关领域的技术突破。在与其他技术所作
的同等实验中,这些技术优势得到了极佳的验证。


图1SQIT构造流程图。
图2基于SQIT的査询处理流程图。
图3一组查询及对应的SQIT示意图。
图4SQIT上的复杂査询执行过程示意图。
具体实施例方式
有关的一些名词、概念和定义 1, XPath的包含关系
对两个XPath查询Ql和Q2,如果对任何给定的XML 文档Q 1的结果都被Q2的查询结果所包含,我们称Q 1被 Q2所包含,并将这个关系记为Q2 Ql。
2 , 查询树
对客户端针对服务器端一个XML文档提交的/7个 XPath查询("…。 ),服务器端根据以下规则构造査询树 a)服务器端持有的压縮XML文档记为査询树的虚拟根 节点,因为任何 一 个査询结果都是被该文档所包含;
根节点的后代节点鱼厶 朱 口由所有查询的对应节点所组
欣 对每个査询节占 "、、作递归定义对于当前节点,必、有
个后代査询节占隹A 朱 口(为空时即为叶节点)。利用
分类算法对集合内所有查询进行分类。分类结束后
每个类内最大査询对应的节点是当前节点的孩子节
点类内的其它査询节点组成该孩子的后代查询节
点集。
3, XPath的简化 对于一个形如。=…/a"的XPath, 可简化为『=/a,/^…/a,,记为。-C;对于形如 C = //a…,则等同于对整个XML文档(doc)进行查询。 4, 查询索弓|树(Query Index Tree, QIT):
QIT是在服务器端的查询索引。对客户端提交的/2
个査询",C ......,",根据查询之间的包含关系,
确定査询树如下a) 由于所有查询的结果都是被査询文 査询树的根标记为";
b) 每个分支节点都有一个子孙集合, 都被当前分支节点的查询所包含;
c) 每个节点标记为(Qid, begin, end
表示提交该节点査询对应的客户端 作为该节点査询结果在压縮文档中 当前节点位置标记的结果精确与否 5,子索引
客户端提交的査询。对应的子索引为服务器端的QIT 中以。的节点的子树,该子树提供的信息包括节点。的 所有子孙节点查询,以及每个子孙节点查询在压縮文档 中的查询结果索引。
6,复杂路径结构SXP:
给定XPath査询。,根据。的分割片断以及片断之间 的关系组合而成的结构即为SXP。SXP作为 一 种树形结构, 表示为(r, A, &),其中
a) K表示有查询。的分割片断组成的集合;
b) A为主链接集合,即组成P的主路径中的所有有向 边,其中最后一个分割片断的结束元素即为最终返 回的元素名。
c) &为次链接集合,其中每条边都用于连接谓词中的 分支片断和对应主路径上的分割片断。
7,结构化査询索引树SQIT:
与普通査询树相同,SQIT是基于査询之间的包含关 系确定层次结构,但进一步挖掘了父子节点之间的共享 前缀关系以提高查询处理的时间。SQIT的定义如下
给定 一 个提交的XPath查询集SQ= {Ql, Q2, , Qn},
档"的 一 部分, 集合中所有查询
,p/l )。其中Qid id, begin禾卩 end 的位置,P/I表示SQ对应的SQIT表示为一个三元组(VQ, E, R),其中每 个元素的意义为
VQ是一个查询节点的有限集合,其中每个节点对应 一个SQ中独立的査询。E是代表査询树中父子关系的边 的集合;R为查询树的虚拟根,用以保证根据包含关系得 到的结构是树而不是森林。在下文中我们交替使用"査 询"和"査询节点"表示查询树中的节点及其对应查询。
每个査询节点都被定义为一个 (Qcid, SXPQ, begin[], end[])的四元结构,其中"Qcid"用于表示 对应客户端的标志,"SXPQ"为该查询对应的SXP结构; 而"begin [] " " end []"分别用来记录该查询对应每个结 果片段的起始和结束位置。
所有的查询节点组成根节点R的后代集合;E是用于 代表VQ中节点间包含关系的边的集合。
算法描述 1 , SQIT的构造算法
SQIT的构造算法如图l所示。SQIT的构造算法,主 要通过递归计算查询之间的包含关系来实现。在算法主 体当中,我们采用栈结构来存储 一 个分支上的查询节点, 而每个栈中的节点都会被递归地进行分类直到每个分类 中只有一个节点为止。构造SQIT的流程图如图2所示, 其 一 般步骤如下
Step 1:首先建立一个空栈,并将随机抽取的第一 个査询推入该栈当中。
Step 2:针对每一个新到来的査询,如果是复杂查 询,就对它转化为SXP,然后,将它和当前所有栈的栈顶
査询比较,针对不同情况,分别做如下的处理
a)如果该査询被某个栈的栈顶查询所包含,新查询的节点将被推入这个栈,而目前的栈顶节点将保持不 变。
b)如果新查询包含了某个栈的栈顶节点査询,它将作 为这个栈的桟顶被保存,同时继续和其他栈顶比 较,因为可能有其他桟的栈顶也被当前査询所包 含。 一 旦这种情况出现,我们将把两个栈进行合并, 并且把新査询作为合并栈的栈顶。
C)如果对新査询没有栈顶与之存在包含关系,我们将 为它建立一个新栈。
Step 3:在所有查询都执行完成后,每个栈代表一 个独立的查询类。对包含超过一个节点的类,递归调用 分类算法并根据包含关系建立层次结构,直到整棵SQIT 建立完成。
在以上的算法执行过程中,我们讨论了 一个査询包 含多个分类的情况,但同时还有 一 种情况,即 一 个查询 可能被超过一个的分支所包含。如果要在SQIT中完全保 存这种关系,SQIT将被构造成为 一 个图而不是树,这样 使得査询处理的过程需要判断哪些是祖先哪些是后代。 例如 XPath 査询 QH= " /a/求/d/e ,,, 同时被 QC = "/a/*/d"和QD二" /a/7e"所包含。为了避免SQIT演
变成图,我们可以采用一些启发式策略,例如选择包含
节点比较少的分支(例如QD )。这是因为分支中节点越多,嵌套的层数可能越深,那么对每个XML节点递归判断的
可能性就越高,因此选择节点较少的分支可以减小查询
处理的复杂度。另外 一 种直观的方法则是将这个查询归
类到遇到的第一个包含它的分支中,在我们的算法里,
为了简化问题就采用了这种策略。
2 ,多査询处理算法在查询处理的过程中,压縮文档将按照SAX流的方 式被遍历。对每个压縮状态下的标签,SQIT中的每个査 询都有且只有以下的一种状态满足,不满足或部分满 足。在査询处理过程中,三种不同类型的数据结构将被 用来保存对应这个标签T的查询节点状态
a) UnsatNodes保存SQ I T中不满足子树的根节点;
b) WaitCXPs保存在T处获得部分满足的片段对应的后 继片段;
c) SatNodes保存在T处获得完全满足的所有节点。
最后,我们用 一 个栈path structure来保存这个压 縮标签T对应的三个结构。
对 一 个压縮的XML标签T,如果SQIT中的 一 个查询 不能被满足,则没有必要检测它的任何 一 个子孙。我们 只用保存栈中这些节点的不满足状态即可。因为SQIT中 的祖先节点査询包含了所有后代的査询, 一旦SQIT中一 棵子树的根不能得到满足,那么这棵子树内的所有其他 节点都不可能被当前标签所满足。
对于每个到来的标签,还有 一 些节点可能在这个标 签上获得部分满足。对每个部分满足的复杂査询来说, 我们将保存其SXP结构中等待被满足的部分(当前被满 足片断的后继片断)放入当前标签的WaitCXPs当中。
图3详细描述了基于SQIT的多査询处理算法,图4 是其流程图。其 一 般执行步骤如下
Step 1:首先,对查询文档的根元素构造一个初始 的pathstructure(PS)结构,并把SQIT根节点的所有 孩子插入到该PS结构的UnsatNodes中去。
Step 2:当一个遍历到下一个新的压縮标签T时(假 设T的父亲标签为P),每个P的UnsatNodes中的査询节点Qu和P的WaitCXPs中等待的分割片断都要与T进行 比较。对任何 一 个Qu节点,我们按照以下策略来检测该 节点是否能被当前标签满足利用共享索引5\来确定哪 些检测可以直接跳过。 一 旦5",的值大于当前检测CXP的 层数,那么当前CXP将被跳过。只有当比较的CXP层数 与&相等时,这个CXP的后继片断将被加入到WaitCXPs 当中对于共享索引为零的SXP孩子,它们的首个分割片 断将被与71比较。
针对査询节点Qu的不同情况,分别做如下的处理
a) 如果Qu的查询是简单路径查询,对应的区间将和 当前压縮标签的值进行比较;
b) 如果Qu的查询是复杂查询且己经被转化成为对应 的SXP ,则根片断将和T进行比较,
c) 如果跟片断被满足,那么所有的后继片断将作为等 候片断被插入T的WaitCXPs中,同时Qu的SXP孩 子节点也要与当前的T继续比较。
d) 如果Qu在此处获得完全满足,那么Qu的所有孩子 都必须跟T进行比较。但如果Qu在T处仍然处于 不满足状态,那么Qu将被保存到T的UnsatNodes 中去。
下面通过 一 个实例来说明如何执行XML数据多查询 处理技术。它可以通过如下几个步骤来完成 首先对原始XML文档进行压縮 利用算法1,建立结构化查询索引树SQIT。 根据建立完成的结构化査询索引树SQIT,利用查询 算法3进行査询处理。
其中,每一步的具体过程在发明内容部分已有详细 描述。附图5 —组査询及对应的SQIT:
査询集SQ={QA, QB, QI}在图5下方的框当中,由
客户端提交的九个査询,并被组织成上方的树所示的 SQIT。可以看出由于QB被QA包含,QB对应的节点成为 QA节点的后代。
当标签<^>到来时,。,的第 一 个片段 "/a "获得满 足,同时"的第一个片段与。p的相同,当然也可以被满 足。因此"和"的第 一 个片段可以被同时评估;否则当 "被完全满足后才开始评估。w时,。。结果中每个元素的 路径信息都己经被丢失。除了及时地保留了每个潜在结 果的路径信息以外,我们可以通过前缀共享原则来避免 "和。w反复地与标签Q,比较,因为这样的比较可能由于 前缀的不断共享而重复到更深的层次,使得查询评估的 复杂度呈指数增长。因此我们使用了共享索引标记到从 SQIT分支节点指出的有向边上。在例3中,从"到"的 有向边上,标记的共享索引"(1)"表示"共享了与其父 亲节点相同的第 一 个片段。而。,的第 一 个片段 "/a/b " 对应的区间与 "/a "的区间没有直接的关系,因此。f和 "之间的共享索引为"(0)"。
附图6SQIT上的复杂查询执行过程
在图5中,QA, QC, QD, QB, QF和QH是由不同客户 端A-H提交的复杂査询。在SQIT构造阶段,这些查询都 被转化为SXP结构并插入到SQIT当中。我们用Qij表示 每个查询的分割片断,其中i〈{A, B,…,H},而j代表 每个SXP中每个片断(即CXP)的编号。图6展示了查询 执行的过程。
首先QA作为根节点的孩子在初始化过程中插入文档 根元素的 UnsatNodes中。在压縮标签〈a〉到来时,在根节点UnsatNodes中的节点QA被检测,并发现与当前标 签匹配,因此QA作为〈a〉的SatNodes被插入,同时QA 的所有孩子(包括SXP与路径查询的孩子)都将与当前 标签〈a〉进行比较。显然QC和QD的第一个CXP能够获得 满足,因此它们的SXP孩子将被继续检测,同时QH的第 一个CXP也获得满足。对于以上几个获得满足的CXP,他 们的后继片断(QC2, QD2和 QH2)将被插入到〈a〉的 WaitCXPs当中。其中QG作为简单路径,对应的区间无法 与〈a〉的编码相匹酉己。因此QG将丰皮插入〈a〉的UnsatNodes 中。同样的动作在不同标签到来时执行。例如当标签〈d〉 到来时,QC将获得完全满足并插入到〈d〉的SatNodes中, 而他的孩子节点QB ,作为无法被满足的复杂查询,将被 插入至U对应的UnsatNodes中。
权利要求
1、一种XML压缩数据的多查询处理方法,该方法步骤是a,对原始的XML文档进行压缩;b,采用SQIT构造算法,建立结构化查询索引树SQIT;c,根据建立的构化查询索引树SQIT,进行SQIT查询算法处理。
2、 按权利要求l所述的XML压縮数据的多査询处理方法, 其中SQIT构造算法的步骤是步骤l,输入参数Sq和R,其中,Sq是査询集合,R是査 询树的根节点;步骤2,初始化循环变量qn为0,用来标记当前处理的 查询;步骤3 ,判断条件,如果Sq中还有未被处理的查询,就执 行4 ;否则,就执行1 2 ;步骤4,Q是Sq中正在被处理的査询,如果Q是复杂查询, 就将Q转化为SXP,然后初始化循环变量sn; 步骤5,针对当前每一个栈,都执行6;步骤6 ,如果Q包含当前栈顶元素,就执行7 ;否则,执 行8;步骤7,把Q压入当前栈内,如果Q包含多个栈顶元素, 就合并这些栈,并把Q作为栈顶元素 ,步骤8 ,如果栈顶元素包含Q ,就执行9 ;否则,执行5 ; 步骤9,把Q压入到栈的次顶元素中;步骤10,如果Q与所有的栈顶元素都没有包含关系,就 新建一个栈,把Q压入新栈;步骤11,计算共享前缀,并把所有栈顶元素记为R的孩 子;步骤12,初始化循环变量n为0;步骤13,针对每一个栈,如果含有多个元素,就递归执 行1;步骤14,输出SQIT树,结束。
3、按权利要求l所述的XML压縮数据的多査询处理方法, 其中SQIT査询算法处理,其步骤是步骤1,输入参数Doc和S,it,其中,Doc是压縮的XML 文档,S。it是包含所有子查询的SQIT树; 步骤2,初始化,新建关于Doc根节点的路径结构PSr, 并将S,"的根压入至lJ PSr的U固tNodes中,再把PSr压入 到路径栈中;步骤3 ,针对每 一 个标志T ,执行4 ;步骤4,新建T的路径结构PST,并把路径栈的栈顶元素 记为PSp。
全文摘要
本发明为一种压缩XML数据多查询处理方法,其是一种在分布式网络环境下的结构化查询索引树结构,使之作为全局结构优化整个网络的稳定性,并具有多样的查询支持能力;该方法步骤是a,对原始的XML文档进行压缩;b,采用SQIT构造算法,建立结构化查询索引树SQIT;c,根据建立的构化查询索引树SQIT,进行SQIT查询算法处理。在给定XML源文档和查询语句的基础上,首先构造对应的结构化查询索引树SQIT,然后在此基础上进行查询处理。本发明方法新颖高效,并具有很好的可扩展性。
文档编号G06F17/30GK101436199SQ20081020069
公开日2009年5月20日 申请日期2008年9月27日 优先权日2008年9月27日
发明者周傲英, 和菊珍, 王晓玲 申请人:复旦大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1