orientx 系统开发报告
DESCRIPTION
OrientX 系统开发报告. XML Group. 大纲. OrientX3.5 的主要特征 问题分析 Transform—— 基于代数的实现 数据抽取 ——Holistic Twig 实现 总结. V3.5 的主要特征. Support XQuery/Update (transform) A set of programming API Query Optimization Holistic Twig Query enabled Usable index management. 大纲. OrientX3.5 的主要特征 问题分析 - PowerPoint PPT PresentationTRANSCRIPT
OrientX 系统开发报告
XML Group
大纲• OrientX3.5 的主要特征• 问题分析• Transform—— 基于代数的实现• 数据抽取—— Holistic Twig 实现• 总结
V3.5 的主要特征• Support XQuery/Update (transform)
• A set of programming API
• Query Optimization– Holistic Twig Query enabled – Usable index management
大纲• OrientX3.5 的主要特征• 问题分析• Transform—— 基于代数的实现• 数据抽取—— Holistic Twig 实现• 总结
问题 1
• 如何实现 Transform 查询?– 查询编译
• Lex 、 Yacc
– 查询处理• 修改 XML 代数• 添加 Transform 操作符
问题 2bib
book
title authoryear
1994 C++ Rose
price
30
publisher
Addison
book
title authoryear
2000 XML Peter
price
50.5
publisher
Kluwer
bib.xmlbib.xml
问题 2
数据抽取:数据抽取:访问磁盘的操作访问磁盘的操作
结果构造:结果构造:内存中的中间结果内存中的中间结果
结果构造:结果构造:内存中的中间结果内存中的中间结果
数据抽取的效率很数据抽取的效率很大程度上决定了代大程度上决定了代
数系统的效率数系统的效率
<bib><bib> {for $b in {for $b in
doc("bib.xml")/bib/bookdoc("bib.xml")/bib/book let $a := $b/authorlet $a := $b/author where $b//publisher/text() = where $b//publisher/text() =
"Addison-Wesley" "Addison-Wesley" and and
$b/@year > 1991$b/@year > 1991 returnreturn <book year="{ <book year="{
$b/@year }">$b/@year }"> { $b/author}{ $b/author} </book>}</book>}</bib> </bib>
问题 2— 数据抽取效率• 数据抽取的方法 [1] 有:
– Navigation :对文档树进行遍历,找到满足pattern tree 的实例树;效率低下。
– Structure Join :利用对 XML 数据的编码和Tag Index ,快速地找到满足祖先后代关系的结点。
– Holistic Twig Join :整体求解[1] [1] 孟小峰,罗道锋,蒋瑜,王宇,孟小峰,罗道锋,蒋瑜,王宇, OreintXA:OreintXA: 一种有效的一种有效的 XQueryXQuery 查询代数,软件学报,卷查询代数,软件学报,卷 1515 (( 1111 ),), 1648-16601648-1660 ,,20042004 ,, 11 11
OrientXOrientX 采用策采用策略略
大纲• OrientX3.5 的主要特征• 问题分析• Transform—— 基于代数的实现• 数据抽取—— Holistic Twig 实现• 总结
大纲• OrientX3.5 的主要特征• 问题分析• Transform—— 基于代数的实现
– Transform 操作概述– 查询编译器对 transform 的支持– Transform 的代数计划生成– Transform 的物理操作符的算法实现
• 数据抽取—— Holistic Twig 实现• 总结
Transform 的语法定义• <transformExpr>::=
‘copy’ $var ‘:=‘ <Expr> (‘,’ $var ‘:=’ <Expr>)*
‘modify’ <Expr> ‘return’ <Expr>• Modify 操作的 Expr 是由 update 组成的表达式
( insert\delete\rename\replace )• Transform 更新操作与原有的四个更新操作的区
别是并不改变数据库的状态
Insert Insert nodes nodes <user_tuple><user_tuple> <userid>U07</userid><userid>U07</userid> <name>Tom</name><name>Tom</name> </user_tuple></user_tuple>IntoInto doc("users.xml")/users doc("users.xml")/users
Copy Copy $nu:= doc("users.xml")/users$nu:= doc("users.xml")/users
Modify Insert Modify Insert nodesnodes <user_tuple><user_tuple>
<userid>U07</userid><userid>U07</userid> <name>Tom</name><name>Tom</name>
</user_tuple></user_tuple>IntoInto $nu $nu
ReturnReturn $nu $nu
ExtractExtract $u=doc(“users.xml”)//users$u=doc(“users.xml”)//users
Insert Insert $node into $u$node into $u
Construct Construct $node$node
<user_tuple><user_tuple> <userid>U07</userid><userid>U07</userid> <name>Tom</name><name>Tom</name>
</user_tuple></user_tuple>
Transform中的更新语句
基本更新语句
修改内容 内存拷贝 磁盘数据返回结果 构造结果并返回 没有返回
CopyCopy $nu:=$u$nu:=$u
Insert Insert $node into $u$node into $u
Construct Construct $node$node
<user_tuple><user_tuple> <userid>U07</userid><userid>U07</userid> <name>Tom</name><name>Tom</name>
</user_tuple></user_tuple>
ExtractExtract $u=doc(“users.xml”)//users$u=doc(“users.xml”)//users
Construct Construct $u$u
Transform 查询引入新的代数操作
• Copy :𝜅 P1,NL(X)
• Modify 中所含的更新操作 ( 与 update 操作有区别 -modify 只对内存中的数据更新 ) :– Modify_insert: 𝜏m P1,P2,IS(X1,X2)
– Modify_delete: 𝜓m P, NL(X)– Modify_rename: 𝜌m P, RS(X)– Modify_replace: 𝜇m P1,P2,RS,RF(X1,X2)
大纲• OrientX3.5 的主要特征• 问题分析• Transform—— 基于代数的实现
– Transform 操作概述– 查询编译器对 transform 的支持– Transform 的代数计划生成– Transform 的物理操作符的算法实现
• 数据抽取—— Holistic Twig 实现• 总结
transform 查询解析• 在 lex 词法解析器中增加对 copy 、 modify
的支持• 该写 yacc ,扩展语法树
词法解析• Transform 语句的解析
– Lex
语法解析• Transform 语句的解析
– Yacc
– 需要注意的是,在语法树中对 Copy 后的那个结点加一个标识,标志这棵语法树上的所有点都无需写回内存
大纲• OrientX3.5 的主要特征• 问题分析• Transform—— 基于代数的实现
– Transform 操作概述– 查询编译器对 transform 的支持– Transform 的代数计划生成– Transform 的物理操作符的算法实现
• 数据抽取—— Holistic Twig 实现• 总结
Transform 的代数查询计划生成
AlgebraTreeGenerator
PatternTreeGenerator
XQuery syntax tree
PatternTree List & Predicate List
AlgebraTree
XQueryParser
Excutor
Transform 的代数查询计划生成算法<transformExpr>::= ‘copy’ $var ‘:=‘<Expr1>‘modify’<Expr2>
‘return’ <Expr3>
ProcessAsXQuery(PTProcessAsXQuery(PT, Expr1), Expr1)
$var$var 加入加入 VARIALES,VARIALES, 指向指向PT.targetNodePT.targetNode
New copy(PT, PT.targetNode)New copy(PT, PT.targetNode)
AddToAlgebraPlan(copy)AddToAlgebraPlan(copy)
Process(modify(Expr2))Process(modify(Expr2))
ProcessasXQuery(NULL, Expr3)ProcessasXQuery(NULL, Expr3)
实例Let $doc := doc(“bib.xml”)return copy $ndoc :=$doc
modify delete $ndoc/book[publisher = “Addison- Wesley”]/price return $ndoc/book[author = “Rose”]
大纲• OrientX3.5 的主要特征• 问题分析• Transform—— 基于代数的实现
– Transform 操作概述– 查询编译器对 transform 的支持– Transform 的代数计划生成– Transform 的物理操作符的算法实现
• 数据抽取—— Holistic Twig 实现• 总结
Copy 操作符的实现• Copy :𝜅 P1,NL(X)
1.从 PatternTree List 中取出 P1,
2.begin:
read ( x ) //x 是 X 的一个实例树If( Match(x,P1))
return(x’) // x’ 由 NL 中的结点拷贝构成else goto step2
end: 直到将 X 中的实例比较完3.将结果 x’ 传给下一个操作符
M odify 操作符的实现• Modify 中包含四个更新操作
Modify_insert 、 Modify_delete 、 Modify_rename 、Modify_replace
• 与原来的更新操作不同,只对 copy 操作的结果进行更新,并不修改数据库
大纲• OrientX3.5 的主要特征• 问题分析• Transform—— 基于代数的实现• 数据抽取—— Holistic Twig 实现
– 三种比较• 总结
大纲
• Twig 查询– 导航式
– 二元结构连接
– TwigStack
Twig 查询
......allauthorsallauthors
((11,,55::6060,,22))
authorauthor 11((11,,66::2020,,33))
fnfn11((11,,77::99,,44))
janejane 11((11,,88,,55))
poepoe((11,,1111,,55))
authorauthor 22
fnfn22 lnln22
johnjohn doedoe11((11,,2626,,55))
authorauthor 33
fnfn 33 lnln33
janejane 22((11,,4343,,55))
doedoe 22((11,,4646,,55))
lnln 11
查询查询 : : //author[fn=‘jane’ AND ln=‘doe’]//author[fn=‘jane’ AND ln=‘doe’]
Twig patternTwig pattern
authorauthor
fnfn lnln
janejane doedoe
导航
a1a1
b1b1 b2b2 b3b3 c1c1
d1d1 d2d2 e1e1 f1f1
aa
dd
QueryQuery DocumentDocument
特点:特点:•容易实现容易实现•效率低下效率低下
导航式地匹配导航式地匹配 Twig PatternTwig Pattern 上的每一结点:从上的每一结点:从 twig patterntwig pattern 根节点根节点开始,深度优先遍历整个文档开始,深度优先遍历整个文档
二元结构连接
aa
bb
dd
cc
aa
bb
bb
dd
aa
cc
a1a1
b1b1 b2b2 b3b3 c1c1
d1d1 d2d2 e1e1 f1f1
33 22 1122
1.1. 将将 Twig Twig PatternPattern 分解成二分解成二元结构关系元结构关系
2.2. 匹配二元关系匹配二元关系
3.3. 缝接缝接
大量中间结果大量中间结果
TwigStack
• 区间编码• 每个结点看成一个流,并且按 star_pos 排序
StreamsStreamsTTaa: a1, a2, a3: a1, a2, a3
TTfnfn: fn1, fn2, fn3: fn1, fn2, fn3
TTlnln: ln1, ln2, ln3: ln1, ln2, ln3
TTjj: j1, j2: j1, j2
TTdd: d1, d2: d1, d2
......allauthorsallauthors
((11,,55::6060,,22))
authorauthor11((11,,66::2020,,33))
fnfn11((11,,77::99,,44))
janejane11((11,,88,,55))
poepoe((11,,1111,,55))
authorauthor22
fnfn22 lnln22
johnjohn doedoe11((11,,2626,,55))
authorauthor 33
fnfn33 lnln33
janejane22((11,,4343,,55))
doedoe22((11,,4646,,55))
lnln11
栈和游标
q1
q2 q3
Cq1
Cq2 Cq3
q1对应的有序元素集
q2对应的有序元素集q3对应的有序元素集
Sq1
Sq2
Sq3
TwigStackTwigStack 中的栈和游标中的栈和游标
• getNext 函数从流中获取满足 SE 的结点– 根据 Max-Child 结点跳过不可能是解的元素– 当当前结点与所有子查询结点构成匹配时,返回
当前结点,否则返回 Min-Child
getNextgetNextTwigStackTwigStack getNextgetNext
递归调用直到查询树的叶子递归调用直到查询树的叶子结点结点
……
主函数产生局部的单主函数产生局部的单 PathPath 路径路径 最后 最后 merge merge 所有单所有单 PathPath 路路
径径
allauthorsallauthors(1,3:60,2)(1,3:60,2)
author1author1(1,4:11,3)(1,4:11,3)
fn1fn1(1,5:7,4(1,5:7,4
))
author2author2(1,12:19,3)(1,12:19,3)
author3author3(1,20:27,3)(1,20:27,3)
ln1ln1(1,8:10,4)(1,8:10,4)
jane1jane1(1,6,5)(1,6,5)
poepoe(1,9,5)(1,9,5)
johnjohn(1,14,5)(1,14,5)
doe1doe1(1,17,5)(1,17,5)
jane2jane2(1,22,5)(1,22,5)
doe2doe2(1,25,5)(1,25,5)
fn2fn2(1,13:15,4)(1,13:15,4)
ln2ln2(1,16:18,4)(1,16:18,4)
fn3fn3(1,21:23,4)(1,21:23,4)
ln3ln3(1,24:26,4)(1,24:26,4)
QueryQuery
DocumentDocument
authorauthor
fnfn lnln
janejane doedoe
StreamsStreamsTTa a : a1, a2, a3: a1, a2, a3
TTfnfn: fn1, fn2, fn3: fn1, fn2, fn3
TTlnln: ln1, ln2, ln3: ln1, ln2, ln3
TTj j : j1, j2: j1, j2
TTd d : d1, d2: d1, d2
StacksStacks
SaSf nSl nSjSd
allauthorsallauthors(1,5:60,2)(1,5:60,2)
author1author1(1,4:11,3)(1,4:11,3)
fn1fn1(1,5:7,4(1,5:7,4
))
author2author2(1,12:19,3)(1,12:19,3)
author3author3(1,20:27,3)(1,20:27,3)
ln1ln1(1,8:10,4)(1,8:10,4)
jane1jane1(1,6,5)(1,6,5)
poepoe(1,9,5)(1,9,5)
johnjohn(1,14,5)(1,14,5)
doe1doe1(1,17,5)(1,17,5)
jane2jane2(1,22,5)(1,22,5)
doe2doe2(1,25,5)(1,25,5)
fn2fn2(1,13:15,4)(1,13:15,4)
ln2ln2(1,16:18,4)(1,16:18,4)
fn3fn3(1,21:23,4)(1,21:23,4)
ln3ln3(1,24:26,4)(1,24:26,4)
QueryQuery
DocumentDocument
authorauthor
fnfn lnln
janejane doedoe
StreamsStreamsTTa a : a1, a2, a3: a1, a2, a3
TTfnfn: fn1, fn2, fn3: fn1, fn2, fn3
TTlnln: ln1, ln2, ln3: ln1, ln2, ln3
TTj j : j1, j2: j1, j2
TTd d : d1, d2: d1, d2
StacksStacks
SaSf nSl nSjSd
allauthorsallauthors(1,5:60,2)(1,5:60,2)
author1author1(1,4:11,3)(1,4:11,3)
fn1fn1(1,5:7,4(1,5:7,4
))
author2author2(1,12:19,3)(1,12:19,3)
author3author3(1,20:27,3)(1,20:27,3)
ln1ln1(1,8:10,4)(1,8:10,4)
jane1jane1(1,6,5)(1,6,5)
poepoe(1,9,5)(1,9,5)
johnjohn(1,14,5)(1,14,5)
doe1doe1(1,17,5)(1,17,5)
jane2jane2(1,22,5)(1,22,5)
doe2doe2(1,25,5)(1,25,5)
fn2fn2(1,13:15,4)(1,13:15,4)
ln2ln2(1,16:18,4)(1,16:18,4)
fn3fn3(1,21:23,4)(1,21:23,4)
ln3ln3(1,24:26,4)(1,24:26,4)
QueryQuery
DocumentDocument
authorauthor
fnfn lnln
janejane doedoe
StreamsStreamsTTa a : a1, a2, a3: a1, a2, a3
TTfnfn: fn1, fn2, fn3: fn1, fn2, fn3
TTlnln: ln1, ln2, ln3: ln1, ln2, ln3
TTj j : j1, j2: j1, j2
TTd d : d1, d2: d1, d2
StacksStacks
SaSf nSl nSjSd
allauthorsallauthors(1,5:60,2)(1,5:60,2)
author1author1(1,4:11,3)(1,4:11,3)
fn1fn1(1,5:7,4(1,5:7,4
))
author2author2(1,12:19,3)(1,12:19,3)
author3author3(1,20:27,3)(1,20:27,3)
ln1ln1(1,8:10,4)(1,8:10,4)
jane1jane1(1,6,5)(1,6,5)
poepoe(1,9,5)(1,9,5)
johnjohn(1,14,5)(1,14,5)
doe1doe1(1,17,5)(1,17,5)
jane2jane2(1,22,5)(1,22,5)
doe2doe2(1,25,5)(1,25,5)
fn2fn2(1,13:15,4)(1,13:15,4)
ln2ln2(1,16:18,4)(1,16:18,4)
fn3fn3(1,21:23,4)(1,21:23,4)
ln3ln3(1,24:26,4)(1,24:26,4)
QueryQuery
DocumentDocument
authorauthor
fnfn lnln
janejane doedoe
StreamsStreamsTTa a : a1, a2, a3: a1, a2, a3
TTfnfn: fn1, fn2, fn3: fn1, fn2, fn3
TTlnln: ln1, ln2, ln3: ln1, ln2, ln3
TTj j : j1, j2: j1, j2
TTd d : d1, d2: d1, d2
StacksStacks
SaSf nSl nSjSd
allauthorsallauthors(1,5:60,2)(1,5:60,2)
author1author1(1,4:11,3)(1,4:11,3)
fn1fn1(1,5:7,4(1,5:7,4
))
author2author2(1,12:19,3)(1,12:19,3)
author3author3(1,20:27,3)(1,20:27,3)
ln1ln1(1,8:10,4)(1,8:10,4)
jane1jane1(1,6,5)(1,6,5)
poepoe(1,9,5)(1,9,5)
johnjohn(1,14,5)(1,14,5)
doe1doe1(1,17,5)(1,17,5)
jane2jane2(1,22,5)(1,22,5)
doe2doe2(1,25,5)(1,25,5)
fn2fn2(1,13:15,4)(1,13:15,4)
ln2ln2(1,16:18,4)(1,16:18,4)
fn3fn3(1,21:23,4)(1,21:23,4)
ln3ln3(1,24:26,4)(1,24:26,4)
QueryQuery
DocumentDocument
authorauthor
fnfn lnln
janejane doedoe
StreamsStreamsTTa a : a1, a2, a3: a1, a2, a3
TTfnfn: fn1, fn2, fn3: fn1, fn2, fn3
TTlnln: ln1, ln2, ln3: ln1, ln2, ln3
TTj j : j1, j2: j1, j2
TTd d : d1, d2: d1, d2
StacksStacks
SaSfnSlnSjSd
aa33fnfn33lnln33JJ22dd22
Path1: a3-fn3-j2Path1: a3-fn3-j2
Path2: a3-ln3-d2Path2: a3-ln3-d2
Merge (j2, fn3, d2, ln3, a3)Merge (j2, fn3, d2, ln3, a3)
大纲• OrientX3.5 的主要特征• 问题分析• Transform—— 基于代数的实现• 数据抽取—— Holistic Twig 实现• 总结
总结• Transform 的实现• Holistic Twig 的实现
• 进展:
• 发布:– 本月底
TransDelete 操作符 已完成TransInsert 操作符 已完成TransReplace 操作符 开发测试中TransRename 开发中Holistic Twig 开发测试中
Thanks !