一种可扩展标记语言路径查询翻译为结构查询的方法

文档序号:6381743阅读:192来源:国知局
专利名称:一种可扩展标记语言路径查询翻译为结构查询的方法
技术领域
本发明涉及一种数据库查询的技术方法,尤其是一种将XML数据的可扩展标记语言路径查询XPath翻译为任何商用关系数据库之上的高效结构查询语言SQL(Structural Query Language,关系数据查询标准)的方法,属于数据库与信息系统技术领域。
背景技术
随着可扩展标记语言XML已经成为Internet之上的数据表示和交换的标准,如何管理海量的XML文档日益重要。由于关系数据库技术成熟,市场中占有主导地位,利用关系数据库来管理海量的XML文档是当前迫切需要解决的问题。
利用关系数据库来管理XML文档,面临的首要问题之一就是如何将XML数据的标准查询XPath翻译为关系数据库之上的标准查询SQL。XPath是W3C提出的XML文档树中查询数据节点的机制,广泛被目前XML查询语言XQuery,XQL所接受。但是,由于XML的树状数据模型和关系数据库的二维表的数据模型存在很大不同,加之XPath支持的特性非常多,如何转换XPath到等价的SQL面临巨大挑战。
目前,已有的XPath翻译方法,按照中间过程是否利用了模式信息,粗略分为基于XML模式的和不考虑XML模式的翻译方法。基于XML模式的查询翻译方法,能够方便处理XPath中的父子查询,但是对于祖先/后代的查询,形成的SQL执行效率较低,甚至有可能产生递归的SQL;而不考虑XML模式的查询翻译方法,侧重于研究Pre/Post编码,这种方法能够方便处理祖先/后代的查询,但是包含’*’和’/’的XPath所翻译的SQL的效率较低。
综上所述,由于XPath特征丰富,加上XML数据模式和关系模式的不同,按照现有技术的方法,转换XPath查询得到的SQL查询存在执行效率的问题,这成为利用关系数据库管理XML的严重障碍。利用关系数据库管理XML文档应用的发展迫切需要一种将XPath查询翻译为高效SQL查询的方法。

发明内容
本发明所要解决的技术问题在于提供一种可扩展标记语言路径查询翻译为高效的结构查询的方法。
本发明所述的可扩展标记语言路径查询XPath翻译为结构查询SQL的方法,包括如下步骤步骤一、判断XPath查询中是否包含‘[’或‘]’操作符号,如果存在,则按照‘[’或‘]’将XPath查询分解为不包含‘[’或‘]’的XPath分段查询;否则,直接进行下一步处理;步骤二、将XPath分段查询按SQL翻译模板,得出翻译的SQL语句;步骤三、如果存在DTD,则分别构造DTD树自动机和XPath树自动机,再完成DTD树自动机和XPath树自动机的乘积,根据乘积生成另一个SQL语句,并估算该SQL语句和步骤二中产生SQL语句的代价;获取代价低的SQL语句作为翻译SQL语句;否则,直接进行下一步处理;步骤四、对于每一个XPath分段,将各个分段翻译的SQL语句结果组合,得出执行该XPath的SQL语句,结束翻译过程。
根据本发明转换XPath获得的SQL,假定XPath的查询目的是XPath树模式的叶节点的数据。本发明利用XML节点的唯一编码表示XML节点的内容,具体应用过程中,产生SQL的形式可能会发生变化,但是其结构一致。
本发明的技术方案中,一方面利用了pre/post/parent_pre编码,以空间复杂性换取SQL执行的高效性;另一个方面,利用了DTD进行XPath查询进行进一步优化,由此,产生SQL的执行高效性。


图1是一种构建本发明技术方案适用的数据库的示意图;图2是本发明的整体示意图;图3是本发明的流程示意图;图4是对XPath查询进行分段处理的流程示意图;图5是一个XPath查询的模式图;图6是本发明直接进行XPath翻译成SQL的流程示意图;图7是本发明DTD生成自动机的流程示意图;图8是本发明XPath查询生成自动机的流程示意图;图9是本发明DTD自动机与XPath查询自动机相乘的流程示意图;图10是本发明DTD自动机与XPath查询自动机相乘的示意图;图11是本发明DTD自动机与XPath查询自动机相乘结果翻译成SQL的流程示意图;图12是本发明对SQL进行代价估计的流程示意图;图13是本发明分段XPath查询组合的流程示意图。
具体实施例方式
XPath的翻译是和XML文档的存储密切相关的。本发明存储XML数据的关系数据库可以是当前流行的任意一种关系数据库。XPath查询的翻译为SQL的过程,需要利用XML元素和关系表的映射关系,所以XPath查询的翻译和XML数据存储结构是密切结合的。另外,在XML数据存储过程中,所产生的关系表中,可能包含大量的其他辅助信息,这些信息有助于查询的高效翻译。
图1所示是本发明的数据库存储的示意图,XML数据存储为关系数据库中的表,同时获取元素与表之间的映射关系。
由于XML文档的体积可能很大,所以采用SAX的XML数据解析器。SAX解析器不是在内存中构造XML数据树,而是输出前序扫描XML文档的事件序列。XML的SAX解析器具体使用方法,可以参考Apache网站的相关内容。
本发明的关系数据库中利用结构编码(pre,post,parent,parene_pre)来捕捉XML文档的结构。
下面具体说明结构编码的语义对于在XML数据树中的两个节点,n1和n2,如果n1是n2的祖先,则要求,n1.pre<n2.pre,n1.post>n2.post;如果n1是n2的右兄弟,则要求n2.post<n1.pre。如果n1是n2的父亲节点,则要求,n1.pre=n2.parent_pre。
分析上述编码对于XPath查询的影响。对于XPath查询中的//操作符号,表示祖先和后代的关系,则利用pre/post编码序列能够方便翻译上述查询;对于XPath查询中的/操作符号,表示父亲和儿子的关系,则可以利用pre/parent_pre编码序列来翻译上述查询。
每个元素的结构编码构造原理如下利用简单的前序扫描XML数据树,在系统中记录一个标号,初始值为0;每次扫描到一个元素,标号加1;把该元素开始标记时的标号纪录为该元素的pre编码,该元素结束标记时的标号纪录为该元素的post编码。非常容易证明,根据这种扫描所产生的编码,能够满足pre/post编码的语义约束。
为了避免在数据库中产生一个存放任意元素的大表,可以采用每个元素分别构造关系表的策略。对于XML数据集合中出现的任意一种元素,我们创建一个表。这样,则避免了所生成的SQL中的大量表自连接查询的巨大代价。
在具体的实现过程中,本发明利用了一个标记(见图1中GUI)来表示XML前序扫描中的系统标号,GUI用来产生XML元素的pre和post编码。
首先将GUI设置归0,然后,开始处理经过SAX解析的XML事件。判断解析的事件是否是StartElement()事件,如果是,则将GUI赋值为GUI+1,并且当前元素(currentElement)和当前GUI,压入堆栈;由于StartElement()事件标记元素的开始,所以只是将GUI+1后进入堆栈,然后再进行后续的处理。
如果是EndElement事件,则先将GUI赋值为GUI+1;再将GUI赋值到Post变量;然后,获取堆栈最顶层currentElemen和Element变量GUI(处理StartElement()时压入堆栈的),将其赋值到Pre变量;弹出堆栈的最顶层;此时,当前堆栈的最顶层是的XML当前处理元素的父元素,获取当前层的GUI作为Parent_pre变量,将根据(pre,post,parent,parent_pre)插入当前Element表,完成处理。插入的方法,利用产生SQL中的Insert语句直接完成。
下面是一个XML的DTD片段实例,以及该段XML数据形成的数据库关系模式。
<!ELEMENT site (categories)>
<!ELEMENT categories (category+)>
<!ELEMENT category(source,name,description)>
<!ELEMENT source (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT description(text|parlist)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT parlist (listitem)*>
<!ELEMENT listitem (text|parlist)*>
存储执行之后产生的关系模式如下Site(pre,post,parent,parent_pre);Categories(pre,post,parent,parent_pre);Category(pre,post,parent,parent_pre);Source(pre,post,parent,parent_pre);Name(pre,post,parent,parent_pre);Description(pre,post,parent,parent_pre);Text(pre,post,parent,parent_pre);Parlist(pre,post,parent,parent_pre);listitem(pre,post,parent,parent_pre)通过以上的分析,可以看出,本发明的翻译方法所应用的数据库具有如下的特点一是,对于DTD定义的每一个元素,关系数据库中都存在一个与该元素对应的表,用来存储DTD定义中该元素的相关数据和结构信息;二是,对于关系数据库中的每一个表,表的名称和元素名称相关,表中包含四个表项pre,post,parent,parent_pre,记录所对应元素的结构编码。对于在XML数据树中的两个节点,n1和n2,如果n1是n2的祖先,则要求,n1.pre<n2.pre,n1.post>n2.post;如果n1是n2的右兄弟,则要求n2.post<n1.pre。如果n1是n2的父亲节点,则要求,n1.pre=n2.parent_pre。Parent纪录当前元素的父元素名称。
XML数据上述的存储方法,并不是限定本发明技术方案中的翻译方法仅适用于上述存储过程产生的数据库,而是通过描述来清楚地表明本发明所应用的关系数据库所具有的特点,所有满足与以上方式建立的数据库相同的关系数据库均可以适用于下述的本发明的技术方案。
下面详细地说明本发明的翻译方法的技术方案图2所示是本发明的XPa th翻译成SQL查询的整体示意图,XPath在DTD,以及元素和关系的映射关系的作用下,形成高效的SQL语句。
XML可以看作是点标记的有向树。XPath作为XML树中导航查询的基本机制,在XLST,Xquery中都得到广泛的应用。XPath支持丰富的路径查询特性,但是,由于很少应用涉及到所有的特性,传统的技术都是集中于部分常用的特性。
本技术讨论的XPath特性定义如下XPath表达式通过下列语法定义P=/E|//EE=label|text O |*|@*|E/E|E//E|(E/E)Q=E|E Operl Const|Q and QOprel=<|≤|>|≥|=|≠非形式化的,给出XPath中出现的操作符号的语义。对于给定XML数据树,’/’表示数据节点之间的父子关系,’//’表示节点之间的祖孙关系,’@’表示XML的元素属性,’|’表示查询路径的或操作,’*’表示任意的数据元素,另外支持在路径表达式中定义逻辑表达式,包括’<|≤|>|≥|=|≠’。
如图3所示是本发明的查询转换方法的整体流程图,包括如下步骤步骤一、判断XPath查询中是否包含‘[’或‘]’操作符号,如果存在,则按照‘[’或‘]’将XPath查询分解为不包含‘[’或‘]’的XPath分段查询;否则,直接进行下一步处理;步骤二、将XPath分段查询按SQL翻译模板,得出翻译的SQL语句;步骤三、如果存在DTD,则分别构造DTD树自动机和XPath树自动机,再完成DTD树自动机和XPath树自动机的乘积,根据乘积生成另一个SQL语句,并估算该SQL语句和步骤二中产生SQL语句的代价;获取代价低的SQL语句作为翻译SQL语句;否则,直接进行下一步处理;步骤四、对于每一个XPath分段,将各个分段翻译的SQL语句结果组合,得出执行该XPath的SQL语句,结束翻译过程。
采用步骤二的方法能够较好的处理XPath查询中的’/’,’//’和’[]’操作符号,但是对于’*’,则很难获取效率较高的查询表达式,因为这种操作符号需要union所有的元素关系。另外,由于’//’所对应的SQL是区域查询,‘/’所对应的SQL是点查询,所以本发明希望能够提高上述查询转换的执行效率。
DTD是XML结构约束的事实标准。本发明的步骤三利用DTD产生XPath的等价表达形式,等价的XPath表达形式不包括’//’和’*’操作符号。这样,根据XPath新的表达形式,根据SQL翻译模板产生另一个SQL表达式。
本发明可以利用SQL代价估算器,来选择产生分段XPath所对应的高效SQL,然后将不同分段的高效SQL组合起来,完成最终SQL的生成。
如图4所示是本发明根据XPath获取树模式的流程图。XPath实际上对应查询树。树的节点代表树中的元素,节点之间的边代表元素之间的关系,如果XPath中存在‘[]’操作符,实际上对应了树中的分支;对每一个‘[]’操作符采用递归分别处理,这样对于每一个‘[]’而言,其内部不再含有‘[]’操作符,完成XPath的分段,大大简化了后续的处理过程,提高处理的效率。最后再将所有的每一段‘[]’操作符所确定的XPath查询组合起来,形成整体的SQL查询。
具体包括如下步骤步骤10、顺次扫描XPath表达式,并设树的根节点为c,c标记为当前点,获取当前符号token;步骤11、如果已经处理完了所有的符号,则结束并返回最终的树,否则执行下一步;步骤12、如果当前符号是‘/’,则创建新的边e,e边标记为/,e的起点连接当前点,当前点修改为e的终点;步骤13、如果当前符号是‘//’,则创建新的边e,e边标记为//,e的起点连接当前点,当前点修改为e的终点;步骤14、如果当前符号是‘*’,则当前点标记为*;步骤15、如果当前符号是‘[’,则以当前点c为根结点,开始递归处理;节点c是一个分支节点;如果当前符号是’]’,则结束递归处理。
步骤16、如果当前符号是具体元素,则当前点标记为具体元素;步骤17、重复执行步骤11。
如图5所示,是给定的下述XPa th查询所创建的树模式图。
p1=/site//*/category[name][//text]。
下面就要进行具体的XPath查询翻译,由于上一步骤中,已经获取了分段XPath,以下给出只包含’//,/,*’的XPath操作符号的翻译方法。
如图6所示,包括如下步骤步骤20、按照自上而下扫描XPath查询,并检查所获取XPath查询操作符号;
步骤21、如果已经处理完了所有的XPath查询操作符号,则结束翻译过程;否则执行下一步;步骤22、如果当前节点c是‘*’操作符号,则c所对应的SQL是包含所有元素对应关系的Union结果,为select*from t1 Union....Union select * from tn,其中,t1,...tn是XML元素所对应的全部关系表;步骤23、如果是‘/’操作符号,则对于状如p1=‘a/b’的XPath来讲,a节点之上所翻译的SQL结果VA,至少包含列(pre,post,parent,parent_pre),b节点对应的关系表为TB=(pre,post,parent,parent_pre),则b节点所翻译的SQL为select TB.pre,TB.post,TB.parent,TB.parent_pre from TB.VA whereTB.parent_pre=VA.pre;如果a是分支节点,则select的选择列表变为select TB.pre,TB.post,TB.parent,TB.parent_pre,VA.pre as VApre,VApre作为当前分支节点的信息;如果VA中包含祖先分支节点的信息,则将VA的祖先分支节点的信息也增加到Select列表中。
步骤24、如果是‘//’操作符号,则对于状如p1=‘a//b’的XPath来讲,a节点之上所翻译的SQL结果VA,至少包含列(per,post,parent,parent_pre),b节点对应的关系表为TB=(pre,post,parent,parent_pre),则b节点所翻译的SQL为select TB.pre,TB.post,TB.parent,TB.parent_pre from TB.VA whereTB.pre>VA.pre and TB.post<VA.post;如果a是分支节点,则select的选择列表变为select TB.pre,TB.post,TB.parent,TB.parent_pre,VA.pre as VApre,VApre作为当前分支节点的信息;如果VA中包含祖先分支节点的信息,则将VA的祖先分支节点的信息也增加到Select列表中。
步骤25、重复执行步骤21。
以图5中的XPath查询为例,按照分段XPath其产生SQL如下分段XPath/site//*/category产生的SQL表达式为V1select * from site;V2select all.pre,all.post,all.parent,all.parent_pre from(select * siteunion,...select * from text)as all,V1Where all.pre>V1.pre and all.post<V1.post;//all是所有元素对应关系的union结果V3select category.pre,category.post,category.parent_pre,category.parent from category,V2Where category,parent_pre=V2.pre;分段XPath/name产生的SQL为V4select name.pre,name.post,name.parent,name.parent_pre,V3.pre as V3prefrom V3.nameWhere name.parent_pre=V3.pre;其中,V3pre记录了分支节点的信息,分段XPath//text产生的SQL为V5select text.pre,text.post,text.parent,text.parent_pre,V3.pre asV3pre from V3.textWhere text.pre>V3.pre and text.post<V3.post,其中,V3pre记录了分支节点的信息;如果最后希望获取XPath查询树中的叶节点中的信息,则最终的SQL为select V4.pre,V5.pre from V4,V5 where V4.V3pre=V5.V3pre由于XML树状数据模型,而关系数据是二维表的数据模型,翻译XPath的结果可能是多种SQL查询,这些不同的SQL的执行代价彼此不同,因此,如果仅仅基于父子关系来获取SQL表达式,则对于某些XPath查询,尤其是包含‘//’的XPath查询,可能产生出递归的SQL表达式。而递归的SQL表达式只有部分的商业数据库才能支持,所以应该避免在生成的SQL中含有递归表达式。
由于XPath中存在的‘//’和’*’元素,使得按照上述方法所产生的SQL在执行效率上可能存在某些效率问题。本发明可以利用XML的结构约束DTD,进一步获取高效的SQL语句。采取的方法是利用DTD来重写XPath查询,获得等价的查询表达形式,但是不包含’//’和’*’的操作符号。
传统也存在基于DTD的XPath重写变换的方法,其主要的思路是从DTD中获取结构规则,应用到XPath之上,但是这种方法不能保证所有的规则都被提取出来。本方法基于树自动机,能够将DTD和XPath的操作集中于统一的框架中,保证了方法的完备性。
根据树自动机的理论,XPath可以通过树自动机来等价表示,DTD也可以通过树自动机来表示。详细分析两种自动机的表达能力,DTD树自动机的状态转换规则中转换前允许状态的正则表达式,XPath树自动机中的状态转换规则中接收任意元素的输入,本技术提出了XPath树自动机和DTD树自动机的乘积的形式,完成了XPath等价形式的获取。
如图7所示,是本发明根据DTD产生自动机的示意图,包括如下步骤步骤300、扫描DTD中元素规则的定义e-f(e1,e2,..e3),f是正则表达式;步骤301、检查元素定义中是否存在未处理规则,如果已经处理了所有的规则,则结束产生树自动机T的步骤;否则,执行下一步;步骤302、如果元素e,e1,..en在树自动机T中没有对应状态,则新增状态s,s1,..sn,并假定元素e,e1,..en对应状态分别是s,s1,..sn;步骤303、将新增的状态追加到自动机A的状态集合中;步骤304、建立转换规则,f(s1,s2,..sn)-e->s,该状态转换规则表明如果树自动机T的当前状态s1,..sn的在f的作用下为真,当前的输入是e,则树自动机T的当前状态转移为s;步骤305、将新增的转换规则追加到树自动机T中的转换规则集合中,追加e到树自动机T中的输入字母集合中,追加新增状态到树自动机的状态集合中;步骤306、重复执行步骤301。
例如根据上例中的DTD,可以获取DTD树自动机T1=(Q1,∑1,δ1,F1),其中Q1={s1,s2,s3,s4,s5,s6,s7,s8},∑1={text,listitem,parlist,source,description,name,category,categories,site},δ1={{}-text->s1,s1-listitem->s2s2*-parlist->s3s3*-listitem->s2,s1s3-discription->s4,{}-name->s5,{}-source->s9,s9s4s5-category->s6,s5-categories->s7,s7-site->s8},F1={s8}。
如图8所示,接下来,根据分段Xpath查询来产生自动机,包括如下步骤步骤310、根据XPath表达式构造树模式,树的每个节点ni设置一个状态si,节点中的值设置为d;步骤311、检查是否存在节点尚未被处理,如果已经处理完所有的节点,则结束Xpath创建自动机的步骤,输出当前形成的树自动机;否则,执行下一步;步骤312、假设节点n的子节点为n1,..nk,n的状态对应为s,n1...nk的状态对应为s1,...sk;如果s的值d为*,所接受数据为all,表示接受所有数据,否则状态转移规则所接受的数据等价于当前数据d;步骤313、构造转换规则p1....pn-d->p;该状态转换规则表明,如果当前状态p1....pn满足,并且输入数据是d,则转换后的状态为p。如果ni到n的边标记为’/’,则pi用si来替代;如果ni到n的边标记为’//’,则增加转换规则pi-a11->si,si-a11->si;步骤314、增加状态{s1,...sk,p1....pn}到自动机A状态集合中,增加新的接受数据{d}到自动机A的数据集合中,增加新的转换规则{p1....pn-d->p}以及所有的{pi-a11->si,si-a11->si}到自动机A中;
步骤315、重复执行步骤311。
通过以上的步骤,得到了Xpath等价的自动机。下面是一个从Xpath获得自动机的实例p1=/site//*/category[name][//text]给定XPath查询p1,则p1所对应的树自动机如下T2=(Q2,∑2,δ2,F2),where Q2={d1,d2,d3,d4,d5},∑2={name,text,category,site},δ2={{}-name->d1,{}-text->d2,d2-a11->d2,d1d2-category->d3,d3-a11->d4,d4-a11->d4,d4-site->d5},F2={d5}。
上面论述了DTD树自动机和XPath树自动机的构造方法,构造树自动机的目的是希望在统一的框架中处理DTD和XPath查询,充分利用DTD的结构信息来重写XPath查询。
下面通过DTD的自动机与Xpath的自动机的乘积,得到一个新的Xpath的查询。由于DTD表示XML数据的结构约束条件,而原有的Xpath是可以针对于一切的XML数据的,通过乘积,将Xpath查询化简,限制于必须应用于满足该DTD的XML数据。而利用树自动机能够在一个框架中处理DTD和XPath查询,则基于DTD的XPath查询重写是完备的。在大多情况下,这样做可以极大的化简Xpath查询的表达式,并且最为重要的是将不确定元素‘*’确定化,并且将祖先关系转换为父子关系。
给出本技术方案中定义DTD树自动机和XPath树自动机乘积过程中所使用的字符串包含给定字符串s1,和正则表达式E,如果对于正则表达式E所产生的任意语言s2,我们能够建立s1到s2的等价映射E,形状为c1->c2,其中,c1等价于c2,c1出现在s1中,c2出现在s2中,则称s1包含于正则表达式E。
例如,给定字符串s1为ab,正则表达式e1为ab(d)*b,根据上述定义,s1包含于正则表达式e1。如果s1为ab,正则表达式e1为ab*,则给定s2=a,s2属于e1所产生的语言,s1不能够建立到s2的等价映射,所以s1不包含于正则表达式e1。
如图9所示,是DTD的自动机与Xpath的自动机的乘积流程示意图,包括步骤320、假定根据XPath建立一个XPath树自动机PT=(Qp,Ep,Tp,Fp);步骤321、根据DTD,建立一个DTD树自动机DT=(Qd,Ed,Td,Fd);步骤322、初始化树自动机T=(Q,E,T,F)为空树自动机,作为输出的结果;步骤323、建立状态集合Q={(qp,null)|qp属于Qp}并{(null,qd)|qd属于Qd)};步骤324、建立集合F={(fp,fd)|fp属于Fp,fd属于Fd};步骤325、检查是否存在下列的状态转换规则f((q11,q21),...,(q1n,q2n))-ra->(q1,q2),其中,Tp中存在状态转换规则(f(q11,....q1n)-qa->q1),并且,在Td中存在(f(q21′,....q2m′)-da->q2),f(q21,....q2n)字符串包含于f(q21′,....q2m′),ra=qa交da,(q11,q21),...,(q1n,q2n)属于Q;如果存在,则执行下一步;否则,输出树自动机T;步骤326、完成以下的赋值和合并T=T并{f((q11,q21)...(q1n,q2n))-ra->(q1,q2)};Q=Q并{(q1,q2)};T=T并{ra};步骤327、重复执行步骤325。
如图10所示,是DTD自动机与Xpath的自动机的乘积一个例子,其结果如下Q3={(d1,s3),(d2,s1),(d2,s2),(d2,s3),(d2,s4),(d3,s6),(d4,s7),(d5,s8)},∑3={text,listitem,parlist,description,name,category,categories,site},δ3={{}-name->(d1,s5),{}-text->(d2,s1),(d2,s1)-listitem->(d2,s2),(d2,s2)-parlist->(d2,s3),(d2,s1)-description->(d2,s4),(d2,s3)-description->(d2,s4),(d1,s5)(d2,s4)-category->(d3,s6),(d3,s6)-categories->(d4,s7),(d4,s7)-site->(d5,s8)},F3={(d5, s8)}。
从图10可见,如果我们根据XPath查询自动机的乘积转化为XPath查询表达式p,则由于在乘积中不包含一个接受所有字母输入的转换表达式,则将p翻译为SQL表达式中会极大减少Union的操作。
下面就可以根据乘积化简后的XPath查询,得出其确定的SQL表达式,如图11所示,具体包括如下步骤步骤330、假定n1和n2是分段XPath的起始节点和中止节点,s1和s2是分段XPath所对应的树自动机的状态,则S1={(s1,d)|(s1,d)是树自动机乘积的状态,d是DTD自动机中的任意状态。},S2={(s2,d)|(s2,d)是树自动机乘积的状态,d是DTD自动机中的任意状态。};步骤331、初始化输出结果ResultSQL=null;步骤332、对于p1属于S1,p2属于S2,获取状态p1到p2的所接受的语言;步骤333、检查p1到p2的状态转换过程中是否存在圈,如果存在,则是,resultSQL赋值为空,结束产生SQL的方法;否则,根据p1到p2的状态转换,获得等价的正则表达式,这种表达式相当于仅仅存在’/’父子关系的Xpath查询,根据正则表达式和parent编码,产生SQL表达式S1;并完成赋值,ResultSQL=ResultSQL union S1;步骤334、重复执行步骤333。
例如,图10所示的乘积结果中,状态s58到s36所产生的SQL为V1 on s58Select * from site;V2 on s47Select categorys.pre,categorys.post,from categorys,V1 wherecategorys.parent_pre=V1.pre;V3 on s36Select category.pre,category.post from category,V2 wherecategory.parent_pre=V2.pre;状态s36到s15所产生的SQL为
V4 on s15Select name.pre,name.post from name,V3 wherename.parent_pre=V3.pre因为从状态s36到状态s22存在状态转移圈,这表明按照父子关系产生的SQL包含递归特性。在这种情况下,我们无需产生相关的SQL语句。因为根据乘积所产生的SQL语句是需要和直接产生的SQL语句作代价比较,存在递归的SQL的执行代价必定高于利用pre/post编码所产生的非递归SQL的执行代价。而且,如果存在状态转换圈,产生SQL可能需要指数的时间代价和空间代价。这两方面都表明,如果状态之间存在圈,则不需要按照乘积产生SQL。
根据以上的分析,应该估计两种方式产生的SQL语句的效率,以便采取效率较高的查询方式。估计执行代价的方式,如图12所示,估算SQL语句的执行代价,其执行代价和SQL语句中的操作符号相关步骤350、获取SQL表达式的不同操作符;步骤351、判断是否存在尚未处理的操作符号,如果存在,则执行下一步;否则,输出SQL的代价结果;步骤352、是否是区域查询连接,如果是则增加区域连接代价;步骤353、是否是点查询连接,如果是则增加点连接代价;步骤354、是否是Union操作,如果是则增加Union操作代价;步骤355、是否是点查询,如果是则增加点查询代价;步骤356、重复执行步骤351。
我们利用|r|表示关系r的元组数目。
其中,Crangejoin(r1,r2)表示基于Pre/post编码的处理’a//b’所对应SQL的范围查询连接代价,如果关系r1和关系r2进行范围查询连接,则估算的范围查询连接的代价估算为MIN(|r1|,|r2|)*log(MAX(|r1|,|r2|)。
Cexactjoin(r1,r2)表示基于parent编码的处理’a/b’所对应SQL的点查询连接代价,如果关系r1和关系r2点查询连接,则估算的代价表示为Max(|r1|,|r2|);Cunion(r1,r2)表示Union操作的代价。如果关系r1和r2完成union操作,则估算的代价为(|r1|+|r2|);Cselect(r1)表示选择操作的代价。如果关系r1被选择,则估算的代价为|r1|Crecursive表示进行递归操作的代价,可以假定递归操作的代价为最大代价。
对两种方式产生的SQL语句的通过执行代价的比较,就可以直接判定哪种方式产生的SQL语句的执行效率更高,从而获得最佳的执行效果。
具体分析例子所示的Xpath查询,对于分段XPath所对应的SQL查询/site//*/categoryV1select * from site;V2select a11.pre,a11.post,a11.parent,a11.parent_pre from(select * siteunion,...select * from text)as a11.V1Where a11.pre>V1.pre and a11.post<V1.post;V3select category.pre,category.post,category.parent_pre,category.parent from category,V2Where category.parent_pre=V2.pre;设定a11=(|Site|+|Categories|+|Category|+|Source|+|Name|+|Description|+|Text|+|Parlist|+|listitem|),估算的代价为|category|+|site|+|a11|+|site|*log(a11)+a11;其中|r|表示关系r中元组的个数。
对于自动机乘积的状态s58到s36所对应的SQLV1 on s58Select * from site;V2 on s47Select categorys.pre,categorys.post,from categorys,V1 wherecategorys.parent_pre=V1.pre;V3 on s36Select category.pre,category.post from category,V2 wherecategory,parent_pre=V2.pre;
估算的代价为|Category|+|site|+|categories|+MAX(|Category|,|Site|)+MAX(|Category|,|Categories|).
显然,从状态s58到s36所产生的SQL的代价要远远低于直接从/site//*category直接产生SQL的代价。
处理完所有的分段之后,将所有的分段组合,就可以得到整体的Xpath查询所对应的SQL查询,由于所有的分段的SQL查询都是经过优化选择的,所以组合之后的效率仍为最好。
如图13所示,具体的组合,包括如下步骤步骤40、获取叶节点ni之上的SQL表达式vi,其中,1≤i≤M,M是叶节点总数;步骤41、ResultSQL初始化为Select v1.pre,...vM.pre from v1,..vM;步骤42、处理每个叶节点对(na,nb)的连接条件,其中,1≤a≤M,1≤b≤M,na所对应的SQL表达式va,nb所对应的SQL表达式vb,获取树模式中c1,..cs节点,其中c1,..cs节点是分支节点,c1,..cs是na和nb的共同祖先,则na和nb的连接条件是va.c1pre=vb.c1pre and..andva.cspre=vb.cspre;c1pre,..cspre是在产生每个节点SQL过程中加入的分支节点信息;步骤43、获得所有节点对的连接条件,作为连接条件,加入到ResultSQL。
例如,对于上述的Xpath查询,所产生的SQL语句如下对于分段XPath/site//*/category,选择从对应树自动机乘积的SQL表达式。
对于分段XPath/name,自动机乘积所产生的SQL等价于直接产生的SQL。
对于分段XPath//text,直接产生的SQL的代价要远远小于自动机乘积所产生的SQL代价。
最终的SQL表达式为With V1 as;Select * from site;With V2 asSelect categorys.pre,categorys.post,from categorys,V1 wherecategorys.parent_pre=V1.pre;With V3 asSelect category.pre,category.post from category,V2 wherecategory.parent_pre=V2.pre;//前三个视图定义通过自动机乘积获得With V4 as Select name.pre,name.post from name,V3 wherename.parent_pre=V3.pre;//两种途径的结果一致With V5 as select text.pre,text.post,text.parent,text.parent_pre,V3.pre as V3pre from V3,text Where text.pre>V3.pre and text.post<V3.post//通过在Xpath之上直接翻译如果最后希望获取XPath查询树中的叶节点中的信息,则最终的SQLselect V4 pre,V5.pre from V4,V5 where V4.V3pre=V5.V3pre如果商业数据库系统不支持‘with’语句,可以通过定义临时视图的方式,最终组合SQL的翻译。
本技术中的高效SQL的产生,主要体现在两个方面,一个是利用pre/post/parent_pre编码,本发明如果单独采用pre/post或者是parent编码也能捕捉XML的结构特性,采用两套编码,希望以空间复杂性换取SQL执行的高效性。另一个方面,本发明利用DTD进行XPath查询优化,进一步提高产生SQL的执行高效性。
最后所应说明的是以上实施例仅用以说明而非限制本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求范围当中。
权利要求
1.一种可扩展标记语言路径查询翻译为结构查询的方法,其特征在于在结构查询的关系数据库中,包括如下步骤步骤一、判断XPath查询中是否包含‘[’或‘]’操作符号,如果存在,则按照‘[’或‘]’将XPath查询分解为不包含‘[’或‘]’的XPath分段查询;否则,直接进行下一步处理;步骤二、将XPath分段查询按SQL翻译模板,得出翻译的SQL语句;步骤三、如果存在DTD,则分别构造DTD树自动机和XPath树自动机,完成DTD树自动机和XPath树自动机的乘积,根据乘积生成另一个SQL语句,并估算该SQL语句和步骤二中产生SQL语句的代价;获取代价低的SQL语句作为翻译后的SQL语句;否则,直接进行下一步处理;步骤四、对于每一个XPath分段,将各个分段翻译的SQL语句结果组合,得出执行该XPath的SQL语句,结束翻译过程所述的数据库中关系模式具有如下的特点一是,对于DTD定义的每一个元素,关系数据库中都存在一个与该元素对应的表,用来存储DTD定义中该元素的相关数据和结构信息;二是,对于关系数据库中的每一个表,表的名称和元素名称相关,表中包含四个表项pre,post,parent,parent_pre,记录所对应元素的结构编码。
2.根据权利要求1所述的可扩展标记语言路径查询翻译为结构查询的方法,其特征在于所述的对XPath查询进行分段处理,包括如下步骤步骤10、顺次扫描XPath表达式,并设树的根节点为c,c标记为当前点,获取当前符号token;步骤11、如果已经处理完了所有的符号,则结束并返回最终的树,否则执行下一步;步骤12、如果当前符号是‘/’,则创建新的边e,e边标记为/,e的起点连接当前点,当前点修改为e的终点;步骤13、如果当前符号是‘//’,则创建新的边e,e边标记为//,e的起点连接当前点,当前点修改为e的终点;步骤14、如果当前符号是‘*’,则当前点标记为*;步骤15、如果当前符号是‘[’,则以当前点c为根结点,开始递归处理;当前节点c作为分支节点;如果当前符号是’]’,则结束递归处理。步骤16、如果当前符号是具体元素,则当前点标记为具体元素;步骤17、重复执行步骤11。
3.根据权利要求1所述的可扩展标记语言路径查询翻译为结构查询的方法,其特征在于所述的将XPath分段查询按SQL翻译模板,得出翻译的SQL语句,包括如下步骤步骤20、按照自上而下扫描XPath查询,并检查所获取XPath查询操作符号;步骤21、如果已经处理完了所有的XPath查询操作符号,则结束翻译过程;否则执行下一步;步骤22、如果当前节点c是‘*’操作符号,则c所对应的SQL是包含所有元素对应关系的Union结果,为select * from t1 Union....Union select * from tn,其中,t1,...tn是XML元素所对应的全部关系表;步骤23、如果是‘/’操作符号,则对于状如p1=‘a/b’的XPath来讲,a节点之上所翻译的SQL结果VA,至少包含列(pre,post,parent,parent_pre),b节点对应的关系表为TB=(pre,post,parent,parent_pre),则b节点所翻译的SQL为select TB.pre,TB.post,TB.parent,TB.parent_pre from TB,VA whereTB.parent_pre=VA.pre;如果a是分支节点,则select的选择列表变为select TB.pre,TB.post,TB.parent,TB.parent_pre,VA.pre as VApre,VApre作为当前分支节点的信息;如果VA中包含祖先分支节点的信息,则将VA的祖先分支节点的信息也增加到Select列表中。步骤24、如果是‘//’操作符号,则对于状如p1=‘a//b’的XPath来讲,a节点之上所翻译的SQL结果VA,至少包含列(pre,post,parent,parent_pre),b节点对应的关系表为TB=(pre,post,parent,parent_pre),则b节点所翻译的SQL为select TB.pre,TB.post,TB.parent,TB.parent_pre from TB,VA whereTB.pre>VA.pre and TB.post<VA.post;如果a是分支节点,则select的选择列表变为select TB pre,TB.post,TB.parent,TB.parent_pre,VA.pre as VApre,VApre作为当前分支节点的信息;如果VA中包含祖先分支节点的信息,则将VA的祖先分支节点的信息也增加到Select列表中。步骤25、重复执行步骤21。
4.根据权利要求1所述的可扩展标记语言路径查询翻译为结构查询的方法,其特征在于所述的步骤三中,DTD生成自身的树自动机,包括步骤300、扫描DTD中元素规则的定义e-f(e1,e2,..e3),f是e的子元素正则表达式;步骤301、检查元素定义中是否存在未处理规则,如果已经处理了所有的规则,则结束产生树自动机T的步骤;否则,执行下一步;步骤302、如果元素e,e1,..en在树自动机T中没有对应状态,则新增状态s,s1,..sn到树自动机T的状态集合,并假定元素e,e1,..en对应状态分别是s,s1,..sn;步骤303、将新增的状态追加到自动机A的状态集合中;步骤304、建立转换规则,f(s1,s2,..sn)-e->s,该状态转换规则表明如果树自动机T的当前状态s1,..sn按照f的表达式返回真,当前的输入是e,则树自动机T的当前状态转移为s;步骤305、将新增的转换规则追加到树自动机T中的转换规则集合中,追加e到树自动机T中的输入字母集合中;步骤306、重复执行步骤301。
5.根据权利要求1所述的可扩展标记语言路径查询翻译为结构查询的方法,其特征在于XPath查询生成自身的自动机,包括步骤310、根据XPath表达式构造树模式,树的每个节点ni设置一个状态si,节点中的值设置为d;步骤311、检查是否存在节点尚未被处理,如果已经处理完所有的节点,则结束Xpath创建自动机的步骤,输出当前形成的树自动机;否则,执行下一步;步骤312、假设节点n的子节点为n1,..nk,n的状态对应为s,n1...nk的状态对应为s1,...sk;如果s的值d为*,所接受数据为all,表明接受任意数据,否则状态转移规则所接受的数据等价于当前数据d;步骤313、构造转换规则p1....pn-d->p,p1,..pn作为新状态;该状态转换规则表明,如果当前状态是p1....pn,在输入数据d的作用下,自动机的当前状态转换为p。如果ni到n的边标记为’/’,则pi用si来替代;如果ni到n的边标记为’//’,则增加转换规则pi-all->si,si-all->si;步骤314、增加状态{s1,...sk,p1....pn}到自动机A状态集合中,增加新的接受数据{d}到自动机A的数据集合中,增加新的转换规则{p1....pn-d->p}以及所有的{pi-all->si,si-all->si}到自动机A中;步骤315、重复执行步骤311。
6.根据权利要求1所述的可扩展标记语言路径查询翻译为结构查询的方法,其特征在于所述的DTD与XPath自动机相乘,获得新的XPath查询,包括如下步骤步骤320、假定根据XPath建立一个XPath树自动机PT=(Qp,Ep,Tp,Fp);步骤321、根据DTD,建立一个DTD树自动机DT=(Qd,Ed,Td,Fd);步骤322、初始化树自动机T=(Q,E,T,F)为空树自动机,作为输出的结果;步骤323、建立状态集合Q={(qp,null)|qp属于Qp}并{(null,qd)|qd属于Qd)};步骤324、建立集合F={(fp,fd)|fp属于Fp,fd属于Fd};步骤325、检查是否存在下列的状态转换规则f((q11,q21),...,(q1n,q2n))-ra->(q1,q2),其中,在Tp中存在转换规则(f(q11,....q1n)-qa->q1),并且,在Td中存在(f(q21′,....q2m′)-da->q2),f(q21,....q2n)字符串包含于f(q21′,....q2m′),ra=qa交da,(q11,q21),...,(q1n,q2n)属于Q;如果存在,则执行下一步;否则,输出树自动机T;步骤326、完成以下的赋值和合并T=T并{f((q11,q21)...(q1n,q2n))-ra->(q1,q2)};Q=Q并{(q1,q2)};T=T并{ra};步骤327、重复执行步骤325。
7.根据权利要求1所述的可扩展标记语言路径查询翻译为结构查询的方法,其特征在于根据树自动机的乘积,获取对应的SQL语句,包括如下步骤步骤330、假定n1和n2是分段XPath的起始节点和中止节点,s1和s2是分段XPath所对应的树自动机的状态,则S1={(s1,d)|(s1,d)是树自动机乘积的状态,d是DTD自动机中的任意状态。},S2={(s2,d)|(s2,d)是树自动机乘积的状态,d是DTD自动机中的任意状态。};步骤331、初始化输出结果ResultSQL=null;步骤332、对于任意p1属于S1,p2属于S2,获取状态p1到p2的所接受的语言;步骤333、检查p1到p2的状态转换过程中是否存在圈,如果存在,则是,resultSQL赋值为空,结束产生SQL的方法;否则,根据p1到p2的状态转换,获得等价的正则表达式,这种表达式相当于仅仅存在’/’父子关系的Xpath查询,根据正则表达式和parent编码,产生SQL表达式S1;并完成赋值,ResultSQL=ResultSQL union S1;步骤334、重复执行步骤333。
8.根据权利要求1所述的可扩展标记语言路径查询翻译为结构查询的方法,其特征在于所述的对翻译的SQL语句进行执行代价估计,包括如下步骤步骤350、获取SQL表达式的不同操作符;步骤351、判断是否存在尚未处理的操作符号,如果存在,则执行下一步;否则,输出SQL的代价结果;步骤352、是否是区域查询连接,如果是则增加区域连接代价;步骤353、是否是点查询连接,如果是则增加点连接代价;步骤354、是否是Union操作,如果是则增加Union操作代价;步骤355、是否是点查询,如果是则增加点查询代价;步骤356、重复执行步骤351。
9.根据权利要求1所述的可扩展标记语言路径查询翻译为结构查询的方法,其特征在于所述的将各个分段翻译的SQL语句结果组合,包括如下步骤不失一般性,假定XPath所查询的目标是XPath树模式中叶节点中的数据步骤40、获取叶节点ni之上的SQL表达式vi,其中,1≤i≤M,M是叶节点总数;步骤41、ResultSQL初始化为Select v1.pre,...vM.pre from v1,..vM;步骤42、处理每个叶节点对(na,nb)的连接条件,其中,1≤a≤M,1≤b≤M,na所对应的SQL表达式va,nb所对应的SQL表达式vb,获取树模式中c1,..cs节点,其中c1,..cs节点是分支节点,c1,..cs是na和nb的共同祖先,则na和nb的连接条件是va.clpre=vb.clpre and..andva.cspre=vb.cspre;clpre,..cspre是在产生每个节点SQL过程中加入的分支节点信息;步骤43、获得所有节点对的连接条件,作为连接条件,加入到ResultSQL。
全文摘要
本发明公开了一种可扩展标记语言路径查询XPath翻译为高效结构查询SQL的方法,包括首先,在pre/post/parent_pre编码之上,定义了针对XPath中不同操作符号的SQL翻译模板,将XPaht翻译成为等价的SQL语句;其次,如果存在DTD,则可以利用DTD的结构信息,来进一步提高所翻译SQL的执行效率,本发明根据DTD构建了DTD树自动机,根据XPath构建了XPath树自动机,在DTD树自动机和XPath树自动机之上定义了乘积操作,根据乘积获取了另一个SQL表达式,估算该表达式和原有表达式的执行代价,选择执行代价低的SQL表达式,结束翻译过程。本发明的技术方案中,一方面利用了pre/post/parent_pre编码,以空间复杂性换取SQL执行的高效性;另一个方面,利用了DTD进行XPath查询进行进一步优化,由此,提高所翻译SQL的执行高效性。
文档编号G06F17/28GK1560763SQ20041000441
公开日2005年1月5日 申请日期2004年2月19日 优先权日2004年2月19日
发明者高军, 王腾蛟, 杨冬青, 唐世渭, 军 高 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1