支持 XML 查询代数和树模式查询的 XQuery 系统框架_

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

*The Natural Science Foundation of Beijing of China under Grant No. 4082003 (北京市自然科学基金). Received 2010-05, Accepted 2010-07.
ISSN 1673-9418 CODEN JKYTA8 E-mail: fcst@ Journal of Frontiers of Computer Science and Technology
1673-9418/2010/04(11)-0996-09 Tel: +86-10-51616056
DOI: 10.3778/j.issn.1673-9418.2010.11.004
支持XML 查询代数和树模式查询的XQuery 系统框架*
张晓博+, 廖湖声
北京工业大学 计算机学院, 北京100124
A Framework for XQuery System with XML Algebra and Tree Pattern Query *
ZHANG Xiaobo +, LIAO Husheng
College of Computer Science, Beijing University of Technology, Beijing 100124, China + Corresponding author: E-mail: jwilljacob@
ZHANG Xiaobo, LIAO Husheng. A framework for XQuery system with XML algebra and tree pattern query. Journal of Frontiers of Computer Science and Technology, 2010, 4(11): 996-1004.
Abstract: High-performance implementation of XQuery needs to use query optimization methods provided by XML query algebra, also needs to use efficient holistic twig matching algorithm. In order to combine these two XML query processing techniques in XQuery processing system, this paper proposes a general framework to sup-port XQuery high-performance implementation. In this framework, it provides an open date source connection, and supports to represent a variety of query algebra operators and twig algorithms by using a functional query plan de-scription language FXQL(functional XML query language) as an intermediate language; and can implement query rewritings based on each query algebra by using this intermediate program transformation and separate independent tree pattern calculation from query plan. Thus, it allows that two query processing techniques to smoothly integrate into the same system framework, and effectively supports XQuery language implementation in a variety of envi-ronments.
Key words: XML query; XQuery language; framework; tree pattern
摘 要: XQuery 语言的高性能实现需要利用XML 查询代数提供的查询优化方法, 也需要采取高效的树模式整体匹配算法。

为了将这两种XML 查询处理技术有效地结合在XQuery 语言处理系统中, 提出了一种通用系统框架来支持XQuery 语言的高性能实现。

在这个框架内, 提供开放式XML 数据源连接, 并且通过作
张晓博等:支持XML查询代数和树模式查询的XQuery系统框架 997
为中间语言的一种函数式查询计划描述语言FXQL来支持各种查询代数算子和树查询模式的表示, 既允许采用各种XML查询代数, 又允许采用各种树模式查询算法; 进而, 通过这种中间层的程序变换可以实现基于各种查询代数的查询重写, 并从查询计划中分离出独立的树模式查询计算, 使两种查询处理技术适当地统一在同一系统框架中, 有效地支持了多种环境下XQuery语言的实现。

关键词: XML查询; XQuery语言; 框架; 树模式
文献标识码:A 中图分类号:TP311
1引言
随着计算机网络技术的发展, XML语言已成为事实上的数据交换和数据共享标准, 作为W3C 推荐的XML数据查询语言, XQuery也得到了普遍的重视。

鉴于XML半结构化数据的特征以及XQuery语言的函数式特征, 使得XQuery语言的优化实现技术面临不少新的挑战。

一方面, 研究人员提出了各种XML查询代数[1−5], 用于XQuery 查询请求的处理与优化; 另一方面, 针对XQuery 查询请求的树模式特征, 探讨这种核心查询操作的实现算法。

查询代数和树模式查询算法[6−7]成为XML查询处理研究的热点。

文献[8]提出的GTP (generalized-tree-pattern)通用树模式, 试图将XQuery程序所描述的弱绑定、筛选谓词和结果分组等相关功能, 扩展到树模式查询, 以提高树查询算法的应用性。

近来, 采用整体模式匹配的树模式查询算法展现出较大优势, 使人们认识到在查询代数中支持树模式的导入是十分必要的。

有些查询代数提供这种支持。

TAX[3]和OrientXA代数[4]以无序的树集合作为数据模型, 采用了基于树模式的查询算子; 后者面向XQuery复杂查询需求, 扩展了弱绑定、序列绑定等功能。

Michiels[5]的方法则将树模式作为一个专用算子结合到查询代数。

随着XQuery语言的应用发展, 数据集成、移动环境、嵌入式系统、流数据处理、Web 服务组合和并行数据处理等众多领域都需要使用XQuery查询引擎。

然而, 不同XML查询处理和查询优化技术往往适用于不同的应用场景。

因此, 有必要研究一种能够支持各种查询处理和查询优化技术的系统框架, 来支持XQuery语言的实现。

在XQuery语言处理系统框架中, 实现查询代数和树模式的有机结合将面临以下问题:
(1) 在XML查询处理中, 树模式查询请求采用树形的请求方式, 查询结果通过树模式匹配产生。

由于XQuery是一种函数式语言, 查询计划描述难以采用函数调用的方式来描述树查询请求和结果引用。

(2)不同的XQuery查询可能有相同的树查询模式, 如$src//D[B/C]/A、$src//D[A]/B[C]、$src//D[A]/B/C 三个XPath语句具有图1所示的、相同的查询模式, 但却分别返回A、B、C节点。

相同的模式树表示难以区分出语义不同的XQuery查询请求。

Fig.1 Tree pattern
图1树模式图
(3) XQuery查询中可能出现更加丰富的树查询请求, 图3(a)中所示FLWOR表达式也具有与图1类似的模式树, 但存在弱绑定问题; 谓词中亦允许使用自定义函数调用。

(4) 鉴于树模式查询的结果允许采用不同的组织方式, 并且同时出现在表达式中的不同位置。

计算结果组织方式的表示以及不同的求值策略
998 Journal of Frontiers of Computer Science and Technology计算机科学与探索 2010,
4(11)
都应该得到查询计划描述语言的支持。

为了解决上述问题, 提出了一种XQuery语言的通用实现框架, 力图在同一框架下允许采用不同的查询代数和不同的树模式查询算法, 并提供开放式数据源连接, 以支持XQuery语言的高性能实现和扩展。

本文主要贡献如下:
(1) 提出一种XQuery语言通用实现框架。

该框架不仅允许使用各种高效的树模式算法, 而且能够表示各种不同的查询代数。

(2) 作为一种支持XML查询语言实现的中间语言, 提出查询计划描述语言FXQL(functional XML query language); 分离了表达式求值计算和XML查询计算的表示, 并支持基于查询代数的查询重写。

(3) 介绍了一种XML查询代数XQA及其翻译算法, 给出了面向FXQL语言的树模式提取算法。

(4) 基于上述框架, 研制了一个XQuery引擎; 实现了XML查询代数XQA和树模式提取。

通过XQuery语言的实现和测试说明了这种通用实现框架的可用性。

本文组织如下:第2章综述XQuery语言实现框架; 第3章介绍FXQL语言的设计; 第4章介绍查询代数XQA和数据模型; 第5章介绍查询代数翻译规则和树模式提取的重写算法; 第6章介绍相关研究工作; 第7章给出实验; 第8章总结本文。

2 XQuery语言实现框架
XQuery查询引擎的体系结构如图2所示。

处理XQuery查询请求需要经过如下几个阶段。

分析阶段:分析器对输入的XQuery查询进行词法分析和语法分析, 生成XQuery语法树, 并且将查询序言中的内容导入到XQuery静态上下文中。

翻译阶段:将XQuery语法树变换为FXQL 语法树, FXQL是一种简易的函数式中间语言, 具有强大的描述能力(详见第3章); 它有足够的描述能力, 能够表示多种查询代数, 因此在翻译模块中可以针对不同的查询代数配置不同的翻译算法。

第4章将介绍查询代数XQA及其实现算法, 其翻译过程分为两步:初步翻译和树查询模式提取。

Fig.2 Architecture of system framework
图2 系统框架的体系结构图
初步翻译阶段:将XQuery程序翻译为由不含树模式的FXQL程序形式的XQA代数表示。

如图3(a)中的XQuery查询, 经过初步翻译后变换为图3(b)所示的FXQL程序。

树查询提取阶段:从初步翻译得到的FXQL 表达式中提取出树模式, 并用FXQL语言的with 子句来表示树模式, 改写为图3(c)所示的FXQL 程序; 其中的with子句表示提取出的树查询, 等价的树查询如图1所示, 并支持各种形式的复杂谓词描述。

在翻译阶段和解释执行阶段之前, 通常可以添加多层次的查询优化处理, 例如基于查询代数
张晓博等:支持XML查询代数和树模式查询的XQuery系统框架 999
1 For $s in $src//D
2 Return
foo($s/A, $s/B[C])
(a) XQuery program
(a) XQuery 程序
1 Flat(
2 For each( $src//D ,
3 fun($s) foo($s/A,
4 $s/B[fun($x,$i,$n)$x/C])
5 )
(b) FXQL program after first translation
(b) 初步翻译后的FXQL程序
2 For
each($r1, fun($s) foo($s.$t2, $s.$t3) )
3 ) with $r1 := $src//D {
4 $r2:=/A,
5 $r3:=/B{ $t4=/C }
6 }
(c) FXQL program after extracting tree pattern
(c) 树查询提取后的FXQL程序
Fig.3 Programs in translation
图3 翻译过程中的程序
的查询优化、基于类型信息的查询模式的优化等等。

所有这些查询优化, 都可以通过FXQL语言的程序变换来实现相应的查询重写。

解释执行阶段:将FXQL所描述的查询计划传入解释器模块进行求值计算。

针对FXQL表达式的解释过程中, 遇到标准函数调用时, 调用标准函数库; 遇到with子句时, 则调用树查询算法库。

XML查询代数的算子都作为FXQL内置函数, 通过查询代数库的调用来实现。

此外, 数据源模块提供了多种数据源供解释器使用, 解释器根据查询指令, 通过数据源管理模块选择指定的XML数据源, 进行数据访问或更新。

按照图2所示的系统框架, 开发者可以采用不同的翻译和优化算法, 提供不同查询代数库以支持不同的查询代数及其优化算法; 也可以采用不同的树模式查询算法来实现独立的树查询模块; 并且, 按照数据库管理模块提供的通用数据访问接口, 配置不用的数据源模块, 以支持XML 数据源的扩展。

3 查询计划描述语言FXQL
FXQL作为XQuery查询计划的描述语言, 是一种基于λ演算的函数式XML查询语言。

该语言采用表达式作为程序主体, 以函数作为程序模块, 通过函数调用的组合来描述计算关系, 支持自定义函数。

同时, 为了支持XPath查询和树查询等XML 专用数据处理功能, 提供XPath表达式和树查询表达式, 作为专用查询原语, 从语言结构上分离了表达式求值计算和XML查询计算, 以内置函数的方式表示各种查询代数算子。

该语言提供一种with子句来表示树模式查询请求。

FXQL语言不仅具有很强的抽象描述能力, 而且语法和语义简洁明了, 其语法表示见表1。

Table 1 Productions of FXQL
表1 FXQL产生式
产生式说明
<Prog> Æ <Exp>
<Prog> Æ <Exp> where<Func>*
FXQL程序
<Bind> ÆId := <Exp> 变量绑定定义
<Func> ÆId := fun(Id*)<Exp> 全局函数定义
<Exp> ÆId变量名
<Exp> Æ Const 常量
<Exp> Æ Axis(<Exp>,NodeTest) 轴操作
<Exp> Æif <Exp> then<Exp> else<Exp> 条件表达式
<Exp> ÆId(<Arg>*) 函数调用
<Exp> ÆId<Path>Path表达式
<Exp> Æ <Exp> where <Bind>+
where子句定义局部
变量绑定
<Arg> Æ <Exp> | fun(Id*)<Exp> 参数
<Step> Æ /<NodeTest>[<Arg>]*
<Step> Æ //<NodeTest>[<Arg>]*
查询步
<NodeTest> ÆNameTes t
<NodeTest> ÆKindTest
节点检测
<Exp> Æ <Exp> with
Id:=Id<Path>{<TBind>+}
树模式查询表达式
<Exp> ÆId.Id获取查询分量
<TBind> ÆId:= <Path> 树模式叶节点弱绑定<TBind> ÆId= <Path> 树模式叶节点强绑定<TBind> ÆId:= <Path>{<TBind>+} 树模式节点弱绑定
<TBind> ÆId= <Path>{<TBind>+} 树模式节点强绑定
<Path> Æ <Step>+ 路径表达式
树模式查询请求表示为嵌套的节点变量绑定<TBind>ÆId:=<Path>; 后续结构{<TBind>+}
1000 Journal of Frontiers of Computer Science and Technology计算机科学与探索 2010,
4(11)
表示多个分支。

通过这种递归定义, 表示树模式节点的层次关系。

为了提高树查询算法的应用性, FXQL扩展了强弱节点绑定及分组返回节点, 以支持GTP[8]通用树模式。

FXQL语言支持两种树节点绑定:强绑定和弱绑定。

弱绑定相对强绑定而言允许绑定到空节点。

在FLWOR表达式的翻译阶段, 对于for和where子句中变量绑定都作为强绑定, 对于let和return子句则采用弱绑定。

通过with子句指定的树模式根节点绑定的变量, 可以获得树模式查询的结果集。

利用Id.Id方式的分量选取可以获得树模式查询得到的叶节点和中间节点。

按照图2所示的系统结构, 查询计划的执行是通过FXQL代码的解释执行实现的。

执行中可以采用各种求值策略和物理优化方法。

4 查询代数XQA和数据模型
FXQL语言可以表示多种查询代数, 本文以基于广义表数据模型的查询代数XQA为例, 介绍通用系统框架中的查询代数实现方法。

XDM数据模型由原子值(如double、Boolean 等类型)、XML节点和扁平的数据序列(sequence) 组成。

在XQA代数的设计中, 为了挖掘XQuery 序列运算中的优化机会, 将XDM的扁平数据序列扩充基于广义表的数据模型。

如表2所示, 广义表的元素可以是原子值和XML节点(元素节点、属性节点等)。

Table 2 Data model
表2 数据模型
产生式说明
<List>Æ[ ]空表
<List> Æ [<Elem>+]有多个元素的广义表
<Elem>ÆAtom 元素为原子值
<Elem>ÆNode 元素为XML节点
<Elem>Æ<List>元素为广义表
在这种数据模型的基础上, 各种XQuery序列运算将表示为广义表运算和扁平化运算的组合, 在查询优化中有可能将两种运算分解后适当地重新组合, 提供了更多的优化机会。

查询代数XQA为了有效地描述各种查询优化方法, 针对广义表表示的数据模型提供了一组查询算子。

这些查询算子都可以定义为FXQL语言标准函数, 以下介绍XQA查询代数中的主要查询算子。

(1) Flat:List ÆList
XDM只支持扁平化的序列, 各种序列操作都隐含了扁平化操作。

对于扩展的广义表数据模型, 需要将扁平化操作显式化, 因此引入Flat算子。

Flat算子的作用是把广义表扁平化, 即减少一个广义表的最外层层次, 例如Flat([[[1,2], [3]], [[4,5]]])的求值结果是[[1,2], [3], [4,5]]; 对于空表的运算结果仍是空表; 对于输入是只有一层的广义表(即序列), 返回的仍是输入序列本身。

(2) For each:ListÆ( ElemÆElem )ÆList
For each算子用于对一个广义表进行逐项迭代运算, 并将每项的运算结果组成新的广义表。

Foreach算子的输入是一个广义表s和一个函数f。

函数f的输入是一个广义表元素, 输出仍是一个广义表元素。

Foreach算子的求值过程是对广义表s中的每项元素都使用函数f进行计算, 并用每项计算出的结果构建新的广义表。

(3) Filter:ListÆ( ElemÆBool )ÆList
Filter算子的作用是对一个广义表中的元素依次进行筛选。

Filter算子的输入是一个广义表s 和一个筛选函数f。

筛选函数f的输入是一个广义表元素, 输出是布尔值。

Filter算子的求值过程是对广义表s中的每项元素都使用函数f进行筛选, 并用经过筛选的元素构建新的广义表。

(4) Axis:String Æ List ÆNode*
Axis算子代表一系列轴操作算子, 如child、descendent等。

Axis算子的输入是一个节点名称n和一个广义表s。

其求值过程是对广义表s中的每项元素, 计算出满足其相应轴操作关系的所有节点, 并构建新的广义表。

张晓博等:支持XML查询代数和树模式查询的XQuery系统框架 1001
(5) Constructor:String Æ List Æ Node
Constructor算子代表一系列节点构造操作, 如元素、属性的构造等。

输入是一个节点名n和一个广义表元素e, 构造出一个相应类型的节点
(6) SortTuple:List ÆList ÆList
Sort算子的作用是对第一个广义表中的各项进行排序, 排序的依据是后面广义表中的各项, 将排好序的广义表输出。

各种查询代数算子都可以作为FXQL语言的内置函数来实现, 进而提供从XQuery程序到查询代数的翻译程序, 利用FXQL语言来查询代数算子的组合关系, 就可以表示查询代数的计算关系。

通过程序变换来调整算子的组合关系或引入新的算子, 可以实现XQuery查询的逻辑优化。

5 翻译重写规则
如第2章所介绍, 翻译重写阶段分为两个阶段:初步翻译和树查询提取。

初步翻译是将XQuery语言翻译为FXQL语言表示的查询代数XQA。

限于文章篇幅, 本文仅介绍从XQuery到XQA的核心翻译规则; 其中XQA采用FXQL描述, XQA算子作为FXQL内置函数, 翻译结果表现为这些查询算子函数的复合运算。

XPath表达式在初步翻译时基本保留, 仅当XPath中有反向轴时将其翻译为轴操作, 这是因为一般的树模式查询算法不能处理反向轴的情况。

此外, 查询步中谓词翻译为匿名函数: fun($x, $i,$n)expr, 用于筛选数据, 其中$x为当前节点; $i 为当前节点的序号; $n为所有节点个数。

A[expr]形式的Path表达式被翻译为A[fun($x,$i,$n) expr]。

图4给出了FLWOR表达式的核心翻译规则。

翻译规则1将for子句翻译为嵌套调用的for each算子, 令return子句的表达式作为最内层for each算子的迭代函数; 翻译规则2将let子句翻译为多个局部变量绑定, 定义在return子句表达式上; 翻译规则3将where子句翻译为filter算子,算法Trns
输入: XQuery表达式; 输出: FXQL表达式
1. Trns [for $fv1 in e1, … ,$fvn in en return er]
Æ Flat( for each(Trns [e1],
fun($fv1) for each(Trns [e2],
fun($fv2),…,fun($fvn)Trns [er]))) 2. Trns [for $fv1 in fe let $lv1 :=e1, … ,$lvn := en return er]
Æ Flat(for each(Trns [fe],
fun($fv1) Trns [er] where $lv1 =e1, … ,
$lvn = en ) ) 3. Trns[for $fv1 in e1 where cond return er]
ÆFlat(for each(filter(Trns [e1] ,
fun($fv1) Trns [cond] ) ,
fun($fv1) Trns [er] ) )
4. Trns [for $fv1 in e1 order by o1 return er]
ÆFlat(SortTuple(
For each (Trns [e1],fun($a) Trns [e]), For each (Trns [e1],fun($a) Trns [o1]))
Fig.4 The core translation rules of FLWOR expression 图4 FLWOR表达式的核心翻译规则
作为最内层for each的应用对象序列; 遇到order by子句, 需要引入算子SortTuple, 并传入return 子句返回的序列和对应的排序项o1的序列, 见翻译规则4。

上述这些规则可以混合使用, 并且根据语言结构中特定的组合关系, 找出性能更优的代数算子, 排列出更有效的查询计划。

例如, 同时出现where子句和order by子句时, 其翻译规则如下:Trns[for$a in e1,$b in e2where cond order by o1 return e3]
Æ Flat(SortTuple(
For each(Trns[e1],
fun($a) for each(filter(Trns[e2],
fun($b)Trns[cond]),
fun($b)Trns[e3])) ,
For each( Trns[e1],
fun($a)for each(filter(Trns[e2],
fun($b)Trns[cond]),
fun($b)Trns[o1]) ) ) )
经过初步翻译阶段给定的翻译规则, XQuery 程序已经变换为FXQL语言表示的XQA代数, 但尚没有涉及到树模式查询请求。

随后进入下一阶段, 根据for each算子以及XPath中的节点关系提取出树模式查询, 并用with子句表示, 树查询提取变换的核心算法设计如下:
1002 Journal of Frontiers of Computer Science and Technology计算机科学与探索 2010,
4(11)
树查询提取算法Extract将初步翻译阶段得到的FXQL程序翻译为具有with子句的FXQL程序。

如图5所示, 算法Extract对条件表达式、变量绑定和匿名函数中出现的嵌套FXQL表达式进行递归处理。

对于for each函数调用的处理如7~ 11行:针对输入序列创建节点绑定t, 将作为树模式的根节点; 随后, 对迭代函数的函数体使用算法ExtrExp从中提取出树模式的各个分支。

对于XPath的处理, 调用算法ExtrStep提取XPath表达式中的树模式。

算法Extract
输入e:Expr; 输出e′:Expr
中间变量 t: TBind // 树模式根节点
Extract[e]
2. If e ÆConst return Const
3. If eÆif e1 then e2else e3return
If Extract[e1] then Extract[e2] else Extract[e3]
4. IfÆId(arg1,arg2,…)
5. If Ide!=foreach
6. Return Id(Extract [arg1], Extract [arg2],…)
7. // eÆfor each(e1,fun($a)e2)
8. x = allocateVariable(); //新变量名
9. t = newTbind <Extract[e1], x>;
10. a = $a; e2′ = ExtrExp(e2)a t
11.Return for each(x, fun($a) e2′) with t;
12. If eÆId step*
13. t = newTBind< Id, allocateVariable( )>;
14. Return ExtrStep[step*]Id with t
15. If eÆe1 where Id ‘:=’ e2
16. Return Extract [e1] where Id := Extract [e2]
17. If e Æfun(Id*) e1
18. Return fun(Id*) Extract [e1]
辅助说明:
eÆ e′表示表达式e的结构符合e′的格式
newTbind <path, Id > 创建变量Id到path的绑定Fig.5 Algorithm of extracting tree pattern: Extract
图5 树模式提取算法Extract
如图6所示, 算法ExtrExp作用于FLWOR 循环体的分析和变换, 采用递归方式处理各种嵌套的内部表达式。

在遇到XPath表达式时, 则调用ExtrStep算法来提取树模式的分支, 并返回变换后的XPath表达式。

图7所示为算法ExtrStep负责处理XPath表达式, 返回变换后的表达式, 并且将生成的树模式作为指定树模式节点t的分支返回。

缓冲区buf 用于保存连续出现的节点检测符号。

算法ExtrExp
输入e:Expr; 输出e′:Expr
外部变量a: Variable, t: TBind //树模式根节点
ExtrExp[e]a t
2. If eÆConst return Const
3. If eÆif e1 then e2 else e3 return
If ExtrExp[e1]a t then ExtrExp[e2] else ExtrExp[e3]
4. If eÆId(arg1,arg2,…)
5. Return Id(ExtrExp [arg1], ExtrExp [arg2],…)
6. If eÆId step*
7.v=findBind(t, e)
8. If aÆId and b=null return ExtrStep(step*)t
9.If aÆId return v
10.Return to Axis(Id step*)
11. If e Æe1 where Id ‘:=’ e2
12. Return ExtrExp [e1] where Id := ExtrExp [e2]
13. If e Æfun(Id*) e1
14. Return fun(Id*) ExtrExp [e1]
辅助说明:
to Axis(path)将path翻译为轴操作表达式
findBind(tBind, path)在变量绑定中找出变量名
Fig.6 Algorithm of extracting tree pattern for loop: ExtrExp 图6 循环处理中树模式提取算法ExtrExp
算法ExtrStep
输入s:Step*, t:Tbind; 输出Id:Variable
中间变量buf:Step*
ExtrStep[s]t
1. If s Æs1 s* //多查询步
2. buf Ås1.nodeTest; //节点检测
3. If s1.predict=null //不存在谓词
4. Return ExtrStep(s*);
5. t′ = newTbind <buf, allocateVariable()>
6. addTBind (t, t′); //树模式分支的添加
7. buf Ånull
8. ExtrExp[s1.predict] $x t′; //处理谓词
9. Return ExtrStep[s*]t′; //处理其余查询步
10. If sÆs1 //末端的查询步
11. v = allocateVariable( );
12. buf Ås1.nodeTest;
13. If s1.predict=null //不存在谓词
14. addTBind (t, newTbind <buf, v>);
15. bufÅnull;
16. Return v;
17. t′= newTbind < buf, v >;
18. addTBind(t, t′);
19. bufÅnull;
20. ExtrExp[s1.predict] $x t′
21. Return v;
辅助说明:
buf ÅnodeTest将nodeTes t添加到buf中
addTBind (t, t′) 将树节点绑定t′作为子树添加到t中Fig.7 Algorithm of extracting tree pattern for XPath: ExtrStep 图7 XPath提取算法ExtrStep
张晓博等:支持XML查询代数和树模式查询的XQuery系统框架 1003
在处理过程中, 首先检查输入查询步是中间步还是末端的查询步, 分情况进行处理:在2~9行中, 对于中间出现的查询步, 如果没有谓词则将当前查询步放入缓冲区, 递归调用ExtrStep算法处理后续查询步。

对于存在谓词的情况, 例如对于A//B[fun($x,$i,$n)$x/C]//D的处理, 进行查询步B时属于这种情况。

此时, 缓冲区中存放着A。

则将B放入缓冲区, 构建节点绑定t′=<A//B,$v>, 作为变量t的子节点; 然后, 再利用ExtrExp算法提取谓词中XPath表达式的树模式, 得到节点绑定<C, x′>, 并作为子节点添加到t′下面, 此时就构造出了A//B[C]的树模式; 随后, 再对查询步D 进行处理, 生成t′的另一分支。

对于XPath表达式中末端查询步的处理(11~20行):如果不存在谓词, 将缓冲区中的节点检测符号组合起来, 构建树节点绑定并添加到变量t返回, 并清空缓冲区。

存在谓词的情况, 处理方法和多步处理基本相同。

在上述翻译规则和重写算法的描述中, 不难看出存在相当多的优化机会。

一方面, 采用更加有效的翻译算法, 可以得到更有效的查询计划; 另一方面, 利用XML Schema等类型信息, 也可以在FXQL这种中间语言的层次上, 完成基于类型的逻辑优化和合法性检查。

限于篇幅, 本文仅给出了最基本的翻译规则和重写算法, 其他优化技术的探讨将另文阐述。

6 相关工作
由于整体树查询算法可以提高XQuery查询的效率, 不少研究[3−5]都在尝试将树查询操作结合到查询代数当中。

TAX代数[3]的操作对象是树集合, 而不是采用关系代数中的元组集合。

它提供了一组基于树模式的代数算子, 通过模式树和实例树(witness tree)的概念来表示树查询。

但TAX中的模式树存在一定的局限性, 难以表示XQuery查询中的复杂谓词表示。

由于TAX以树集合作为操作对象, 难以实现去除相关性等基于元组的逻辑优化。

OrientXA代数[4]在简单的模式树基础上扩充了强绑定、弱绑定、节点绑定与序列绑定的概念, 增强了模式树的描述能力, 并且引入了用于结果构造操作的算子。

但同样由于以树集合作为操作对象, 难以实现去除相关性等基于元组的逻辑优化。

Michiels的方法[5]能够将树模式结合到查询代数中, 在基于元组的查询代数中扩充了树模式算子。

该方法对树模式有一定的限制, 要求树模式只能有单一的输出节点。

这种方法能够支持较多的逻辑优化方法进行关系代数方面的优化。

本文所提出的实现框架通过FXQL语言分离了表达式求值计算和XML查询计算, 提供了比较丰富的树模式描述手段。

在这个框架内, 各种查询代数的算子都可以定义为内置的FXQL函数, 只要提供专用的数据模型和翻译算法就可以实现基于各种XML查询代数的XQuery查询处理系统。

同样, 独立的树查询模块也可以采用不同的树模式查询算法来实现。

7实验
按照上述系统框架在查询代数XQA的基础上研制了一个XQuery查询引擎, 实现了XQuery 语言的多数功能, 包括路径表达式、序列表达式、算术表达式、比较表达式、逻辑表达式、FLWOR 表达式、条件表达式和量词表达式, 以及多数标准函数。

系统中采用Twiglist树查询算法[7]实现了树模式查询。

系统测试采用W3C发布的XQuery Use Case 中的部分案例(见表3), 基本覆盖了XQuery语言的主要功能。

测试环境为:Intel Core 2 6400 2.13 GHz CPU, 2 GB内存, 500 GB 硬盘, Windows 7操作系统; 引擎系统采用Java语言实现。

测试结果如图8所示。

8 结论
本文提出一种XQuery语言通用实现框架, 能够支持各种高效树模式匹配算法的采用, 也允许使用各种不同风格的查询代数。

该框架的核心
1004
Journal of Frontiers of Computer Science and Technology 计算机科学与探索 2010, 4(11)
Table 3 Test case 表3 采用的测试案例
序号 W3C 中案例名
测试的功能
T1 1.2.4.1 Q1
自定义函数递归调用、
节点构造、FLWOR T2 1.2.4.2 Q2 FLWOR 、节点构造、属性 T3 1.2.4.3 Q3 路径表达式、节点构造、序列连接T4 1.2.4.4 Q4 路径表达式、节点构造、count 函数T5 1.2.4.5 Q5
节点构造、FLWOR 、
属性构造、count 函数
测试案例
Fig.8 Test results 图8 测试结果
是一种查询计划描述语言FXQL, 作为一种支持XML 查询语言实现的中间语言, 能够同时描述 查询代数和树模式查询。

XQA 查询代数的实现说明了系统框架的可用性, 基于查询代数的逻辑优化和各种树模式查询算法的实现都可以在该系统框架中展开, 能够适应多种应用场景下对XQuery 语言的实现要求。

References:
[1] Zhang X, Rundensteiner E. XAT: XML algebra for the
rainbow system, WPI-CS-TR-02-24[R]. Worcester Poly-technic Institute, 2002.
[2] Beeri C, Tzaban Y . SAL: An algebra for semistructured
data and XML[C]//Proceedings of the 2nd ACM SIGMOD Workshop on the Web and Databases. Philadelphia, Penn-sylvania: ACM Press, 1999: 37–42.
[3] Jagadish H, Lakashmanan L, Srivastava D, et al. TAX: A
tree algebra for XML[C]//Proceedings of the 8th Interna-tional Workshop on Database Programming Languages, Frascati, Italy, 2001. Rome: Springer-V erlag, 2001: 149–164. [4] Meng Xiaofeng, Luo Daofeng, Jiang Yu, et al. OrientXA:
An effective XQuery algebra[J]. Journal of Software, 2004, 15(11): 1648–1660.
[5] Michiels P, Mihaila G , Simeon J. Put a tree pattern in your
algebra[C]//Proceedings of IEEE 23rd International Confe-rence on Data Engineering, Istanbul, Turkey, 2007: 246–255. [6] Chen S, Li H, Tatemura J, et al. Twig-stack: Bottom-up
processing of generalized-tree-pattern queries over XML
documents[C]//Proceedings of the 32nd International Con-ference on Very Large Data Bases, Seoul, Korea, 2006: 283–294.
[7] Qin L, Yu J, Ding B. TwigList: Make twig pattern
matching fast[C]//Proceedings of the 12th International Conference on Database Systems for Advanced Applica-tions, Bangkok, Thailand, 2007: 850–862.
[8] Chen Z, Jagadish H, Lakshmanan L, et al. From tree
patterns to generalized tree patterns: On efficient evalua-tion of XQuery[C]//Proceedings of the 29th International Conference on Very Large Data Bases, Berlin, Germany, 2003: 237–248.
附中文参考文献:
[4] 孟小峰, 罗道锋, 蒋瑜, 等. OrientXA: 一种有效的
XQuery 查询代数[J]. 软件学报, 2004, 15(11): 1648–1660.
ZHANG Xiaobo was born in 1986. He is a M.S. candidate at Beijing University of Technology. His re-search interest is XML database technology.
张晓博(1986−), 男, 北京人, 北京工业大学硕士研究生, 主要研究领域为XML 数据库技术。

LIAO Husheng was born in 1954. He is a professor and doctoral supervisor at Beijing University of Tech-nology. His research interests include software automation methods and data integration technology, etc. 廖湖声(1954−), 男, 广东大埔人, 目前为北京工业大学教授、博士生导师, 主要研究领域为软件自动化方法, 数据集成技术等。

相关文档
最新文档