首页> 中国专利> 基于XQuery的查询引擎系统

基于XQuery的查询引擎系统

摘要

本发明公开了一种基于XQuery的查询引擎系统,包括中介器和包装器,中介器包括:词法分析模块,将XQuery语句分割为携带属性的令牌;语法分析模块,依据XQuery语法规范将令牌组织为抽象语法树;正规化模块,对语法树进行整理,产生形式良好的语法树;查询分解模块,遍历语法树,产生针对底层数据源的子查询,调用相应包装器;结果处理模块接收包装器传来的查询结果,并以XML形式将查询结果返回用户。包装器包括关系型数据源包装器和XML数据源包装器,接收中介器传来的XQuery子查询,转换为数据源支持的查询语言进行底层数据源查询,最终结果重构为XML格式传给结果处理模块。本发明提高了查询效率,对抽象语法树的正规化使得构造出的查询子句结构良好,可读性增强。

著录项

  • 公开/公告号CN101667190A

    专利类型发明专利

  • 公开/公告日2010-03-10

    原文格式PDF

  • 申请/专利权人 天津大学;

    申请/专利号CN200910070718.7

  • 发明设计人 冯志勇;李柳青;陈世展;刘超;

    申请日2009-09-29

  • 分类号G06F17/30(20060101);

  • 代理机构12201 天津市北洋有限责任专利代理事务所;

  • 代理人李素兰

  • 地址 300072 天津市南开区卫津路92号

  • 入库时间 2023-12-17 23:35:48

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2013-11-20

    未缴年费专利权终止 IPC(主分类):G06F17/30 授权公告日:20110727 终止日期:20120929 申请日:20090929

    专利权的终止

  • 2011-07-27

    授权

    授权

  • 2010-04-28

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20090929

    实质审查的生效

  • 2010-03-10

    公开

    公开

说明书

技术领域

本发明涉及数据集成技术领域,特别涉及一种以XML作为数据模型,XQuery作为查询语言的数据集成平台实现。

背景技术

信息社会的发展,导致海量异构数据的出现,使得数据共享成为瓶颈。随着XML技术成为数据交换的标准,以XML作为数据摸型的数据集成平台引起人们的关注。

比较有代表性的针对XML的查询语言包括:

1)W3C提出的XSL可扩展样式表语言,专用于处理XML文档,但只能读取文档内容,不能更改或编辑文档;

2)XQL语言,用于定位和过滤XML文档中元素和文本的符号,但适用范围仅限于XML文档,因而可扩展性差;

3)Alin Denutsh等人在《A Query Language for XML》中提到的XML-QL,能对XML文档进程查询、构造、转换和集成,在查询条件中加入模式匹配时它与其他半结构化查询语言最大的不同,但是不执行全称量词,且通用性较差;

4)Serge Abiteboul等人在The Lorel Query Language for Semistructured Data中提到Lorel将XML文档映射成图,将XML元素映射为图中的节点,将元素间关系映射为图中的边,这种查询语言结构复杂,表达式冗长。

面对现有XML查询语言通用性的不足,万维网协会在2001年2月提出XQuery第一个草案。XQuery语言操作的是针对XML文档的抽象、逻辑结构的,从XML-QL中吸取了变量绑定和用被绑定变量构造新的文档结构的方法;从SQL中获得了用一组关键字(select-from-where)构成查询语句的思想,扩展了XPath2.0规范,能在XML文档中定位节点,并使用扩展了的XML Schema规范中的类型系统。

针对XQuery规范的查询引擎有XQEngine、Saxon、Galax及Aqualogic。XQEngine是对XQuery规范的最基本实现,对查询的处理流程做了很好的实现,但却仅能实现规范定义的几个核心函数。Saxon能同时作为XSLT与XQuery的查询引擎,实现了XQuery的标准并做出了扩展,并对关系数据数据的集成实现了自己的扩展,但是这也使得它的结构异常复杂。Galax是对XQuery规范的忠实实现,它使用O’Caml语言实现,对XQuery语法树的处理严格按照XQuery规范的定义实现,对外提供C、Java、O’Caml调用接口,但该语言的特点限制了该引擎的扩展性,不利于对异构数据实现适配器模块。Aqualogic是BEA公司推出的,对XQuery规范做出了扩展,在XQuery查询语句中加入大量描述数据源的元数据信息,基于Weblogic Platform实现了GUI界面,图形化的操作界面屏蔽了底层数据的具体信息,便利了数据集成的操作,由于其强大的功能使得查询语句的书写存在困难。

因此,现有技术中的基于XQuery的查询引擎各有不足,如何更好地解决数据集成中异构数据源查询问题,正是本发明所要解决的问题

发明内容

本发明旨在为克服上述现有技术存在的问题,而提出一种基于XQuery的查询引擎系统。在以XML为数据模型,XQuery作为查询语句的基于中介模式的数据集成平台上,借由中介器将XQuery全局查询分解为针对每个数据源的子查询,调用相应的包装器进行底层数据源的查询,接收查询结果,将查询结果重组为XML数据形式传递给用户,能够解决数据集成中异构数据源查询问题。

本发明还提供了一种基于XQuery的查询引擎系统,该系统包括中介器和包装器,其中,中介器包括五个模块,即词法分析模块,用于将XQuery语句分割为携带属性的令牌(tokens);语法分析模块,用于将令牌(tokens)组织为抽象语法树;正规化模块,用于对语法树进行整理,以产生形式良好的语法树;查询分解模块,用于遍历该语法树,产生针对底层数据源的子查询,调用相应的包装器;结果处理模块接收包装器返回的查询结果,将中间结果以resultsequence类型的格式缓存在MAP中,以XML形式构建最终的查询结果返回给用户;包装器包括XML数据源包装器、关系型数据源包装器;包装器接收中介器传来的针对每个数据源的XQuery子查询,将其转变为数据源能够支持的查询语句进行底层数据源查询,将查询结果构造成XML形式返还给结果处理模块。

所述词法分析模块,包括以下操作:

在XQStaticContext中加入记录变量信息的MAP,每出现一个变量,通过XQStaticContext中的MAP查找该变量类型是否出现过,若出现过,用已存在的变量名替代新出现的变量名,若该变量名未出现过,则将该变量名及变量类型信息存入变量MAP。

所述语法分析模块,包括以下操作:

借助语法树构造工具JJTree,完成将词法分析后的令牌tokens依照规定的XQuery语法规范组织成一棵语法树。

所述正规化模块,包括以下操作:

在XQuery语句中每遇到For或Let子句,就重新构造一个FLWOR语句嵌套在当前FLWOR语句的return子句内,将遇到的For或Let子句提取出来作为新构造的FLWOR语句的For或Let子句。

所述查询分解模块,包括以下操作:

将当前节点指针指向根节点,由根向下深度优先遍历语法树,判断当前节点是否为叶子节点,若为叶子节点,直接取出属性值,返回父节点即可,否则,判断当前节点是否有未遍历的子节点,若有,则遍历以该子节点为根的子树,否则,根据对当前节点执行dump算法,获得FLWOR语句片段,返回父节点,若父节点为空,表明整棵语法树处理完成,操作结束。

所述XML数据源包装器,包括以下操作:

接收中介器传递过来的针对XML数据源的XQuery子查询,对XML数据源进行查询,将查询结果直接传递给结果处理模块。

所述关系型数据源包装器,包括以下操作:

接收包装器传递过来的针对关系型数据源的XQuery子查询,将其转换为等价的SQL语句查询关系型数据源,将查询结果构建成XML格式传给结果处理模块。

与现有技术相比,本发明能将平台内全局XQuery查询语句查询等价的分解为针对每一数据源的子查询语句,在词法分析模块已将要查询的数据源相关信息以变量形式记录在MAP中,有效的防止将针对相同变量类型、不同变量名的变量的子查询多次提取后传给包装器,提高了效率,XQuery抽象语法树又经过正规化模块处理,结构良好,使得构造的子查询格式良好,统一;将查询中间结果存储在MAP中,防止多次连接底层数据源,将针对关系型数据源的子查询采用“SQL”下推交给DBMS进行查询,都使得查询效率有所提高。

附图说明

图1为本发明的查询引擎系统结构示意图;

图2为本发明的查询分解模块的流程示意图。

具体实施方式

以中介方式实现的查询引擎系统设计如图1所示。该系统包括中介器和包装器,其中中介器包括五个模块,词法分析模块,用于将XQuery语句分割为携带属性的令牌(tokens);语法分析模块,用于将令牌(tokens)组织为抽象语法树;正规化模块,用于对语法树进行整理,以产生形式良好的语法树;查询分解模块,用于遍历该语法树,产生针对底层数据源的子查询,调用相应的包装器;结果处理模块接收包装器传来的查询结果,并以XML形式将最终查询结果返回给用户;

词法分析模块的操作为,词法分析借助XQJ提供的编程接口XQStaticContext,即XQJ提供的用于记录变量或函数定义等信息的静态环境。通过在XQStaticContext中加入记录变量信息的MAP,每出现一个变量,通过XQStaticContext中的MAP查找该变量类型是否出现过,若出现过,用已存在的变量名替代新出现的变量名,表示这是同一个变量的两个不同变量名。若该变量名未出现过,则将该变量信息存入变量MAP。

正规化模块的操作为:在XQuery语句中每遇到For或Let子句,就重新构造一个FLWOR语句嵌套在当前FLWOR语句的return子句内,将遇到的For或Let子句提取出来作为新构造的FLWOR语句的For或Let子句。如此操作将符合XQuery语法规范的XQuery语句正规化为XQuery1.1 and Xpath2.0 Formal Semantics中定义的格式。

包装器包括XML数据源包装器、关系型数据源包装器。根据数据源类型的不同将子查询传递给不同的包装器,包装器接收子查询,将其转换数据源支持的查询语言进行底层数据源查询,将查询结果以XML格式传递给包装器的结果处理模块。各组成模块介绍如下:

首先,需要给出本发明依赖的XQuery规范,它是w3c提供的XQuery语言规范的一个子集,用于完成本发明的基本功能。

Expr::=ExprSingle(″,″ExprSingle)*

EnclosedExpr::=″{″Expr″}″

ExprSingle::=FLWORExpr|OrExpr

FLWORExpr::=(ForClause|LetClause)+WhereClause?″return″ExprSingle

ForClause::=″for″″$″VarName″in″ExprSingle

LetClause::=″let″″$″VarName″:=″ExprSingle

WhereClause::=“where”ExprSingle

OrExpr::=AndExpr(″or″AndExpr)*

AndExpr::=ComparisonExpr(″and″ComparisonExpr)*

ComparisonExpr::=AdditiveExpr(GeneralComp AdditiveExpr)?

AdditiveExpr::=MultiplicativeExpr((″+″|″-″)MultiplicativeExpr)*

MultiplicativeExpr::=UnaryExpr((″*″|″div″|″idiv″|″mod″)UnaryExpr)*

UnaryExpr::=(″-″|″+″)*ValueExpr

ValueExpr::=ValidateExpr|PathExpr|ExtensionExpr

GeneralComp::=″=″|″!=″|″<″|″<=″|″>″|″>=″

PathExpr::=(″/″RelativePathExpr?)|(″//″RelativePathExpr)|RelativePathExpr

RelativePathExpr::=StepExpr((″/″|″//″)StepExpr)*

AxisStep::=(AbbrevReverseStep)PredicateList

AbbrevReverseStep::=″..″

FilterExpr::=PrimaryExpr PredicateList

PredicateList::=Predicate*

Predicate::=″[″Expr″]″

PrimaryExpr::=Literal|VarRef|ParenthesizedExpr|FunctionCall|Constructor

Literal::=NumericLiteral|StringLiteral

NumericLiteral::=IntegerLiteral|DecimalLiteral|DoubleLiteral

VarRef::=″$″Qname

ParenthesizedExpr::=″(″Expr?″)″

FunctionCall::=QName″(″(ExprSingle(″,″ExprSingle)*)?″)″

Constructor::=″<″QName DirAttributeList(″/>″|(″>″DirElemContent*″</″QNameS?″>″))

DirAttributeList::=(S(QName S?″=″S?DirAttributeValue)?)*

DirAttributeValue::=(″″(EscapeQuot|QuotAttrValueContent)*″″)|(″″′(EscapeApos|AposAttrValueContent)*′″″)

QuotAttrValueContent::=QuotAttrContentChar|CommonContent

AposAttrValueContent::=AposAttrContentChar|CommonContent

DirElemContent::=Constructor|CommonContent

SingleType::=QName″?″?

AttributeName::=QName

ElementName::=QName

TypeName::=QName

模块一:词法分析模块

借助JavaCC(java Compiler Compiler)将接收到的符合上述语法规范的全局XQuery语句作为词法分析模块的输入,将该语句分解为带有特定语义的令牌(tokens)。在词法分析的过程中,借助XQJ提供的编程接口,在XQStaticContext中加入MAP(变量名,变量类型),每出现一个变量,就要通过StaticContext中的MAP查找该变量类型是否出现过,若出现过,用已存在的变量替代新出现的变量,若该变量类型信息未出现过,则将该变量连同类型信息存入MAP中。

模块二:语法分析模块

借助JavaCC自带的语法树构造工具JJTree,完成将词法分析后的带特定属性的tokens依照规定的XQuery语法规范组织成一棵语法树。

模块三:正规化模块

将符合XQuery语法规范的XQuery语句正规化为XQuery1.1 and Xpath2.0 FormalSemantics中定义的格式,方法是在XQuery语句中每遇到For和Let子句,构建新的FLWOR语句嵌套在当前层的内部,例如:

for $i in doc(‘student.xml’)/user,for $y in col(‘b’)where(($i/age>18)and($y/id=$i/id)return<student>{$i/namr}{$y/grade}</student>

上述的语句中有两个for子句,正规化时,首先,创建一条FLWOR语句,将第一个for子句作为他的for节点,然后构造return节点,在return节点内嵌套新的FLWOR语句,将第二个for子句作为他的子节点,以此方法,将例子中的where与return子句作为最内层FLWOR语句的子节点。上述语句可以正规化为for $i indoc(‘student.xml’)/user return{for $y in col(‘b’)where(($i/age>18)and($y/id=$i/id)return<student>{$i/namr}{$y/grade}</student>}。

模块四:查询分解模块

该模块接收到正规化后的语法树,运行XQuery查询分解算法,算法流程如图2所示,采用深度优先遍历语法树,在遍历过程中,结合tokens节点的属性值,重构出FLWOR语句片段,最终将重构子句传递给包装器进行数据源查询。该流程包括以下步骤:

步骤1,将当前节点指针指向根节点;

步骤2,获得当前节点;

步骤3,判断步骤2所获得的当前节点是否为语法树的叶子节点?

步骤4,如果是叶子节点,则获取叶子节点的属性值;执行步骤8;

步骤5,如果不是叶子节点,再判断该当前节点是否存在未遍历的子节点?

步骤6,如果非叶节点的当前节点存在未遍历的子节点,将当前节点指针指向第一个未遍历的节点,跳转到步骤2;

步骤7,如果非叶节点的当前节点不存在未遍历的子节点,则根据节点类型对该节点进行处理,获得FLWOR片段,并将该节点标记为已遍历,将当前节点指针指向父节点,返回步骤9;

步骤8,记录节点信息的值,将当前节点指针指向它的父节点,执行步骤2;

步骤9,判断该父节点是否为空,如是,则表明语法树中的节点处理完毕,流程结束;如否,转至步骤2,继续执行流程,直到语法树中的节点都处理完。

如图2所示,将当前节点指针指向根节点,由根向下深度优先遍历语法树,判断当前节点是否为叶子节点,若为叶子节点,直接取出属性值,返回父节点即可,否则,判断当前节点是否有未遍历的子节点,若有,将第一个未遍历子节点设置为当前节点,根据当前节点类型执行dump算法,遍历以该子节点为根的子树。否则,根据当前节点类型提取出FLWOR语句片段,返回父节点,若父节点为空,说明整棵树处理完成,结束即可。

其中,dump算法的描述如下:

【算法1】dump算法

输入:当前节点  输出:FLWOR语句片段

If类型为或JJTSTRINGLITERAL或JJTFUNCTIONQNAME或JJTINTEGERITERAL或JJTDECIMALLITERAL或JJTDOUBLELITERAL,跳转到算法2;

If类型为JJTFORCLAUSE或JJTLETEXPR,跳转到算法3;

If类型为JJTFUCTIONCALL,跳转到算法4;

If类型为JJTANDEXPR或JJTOREXPR,跳转到算法5;

If类型为JJTWHEREEXPR或JJTPARENTNESIZEEDEXPR,跳转到算法6;

If类型为JJTCONSTRUCTOR,跳转到算法7;

If类型为JJTFLWOREXPR,跳转到算法8;

Else执行算法9.

【算法2】LITERAL算法

输入:当前节点  输出:FLWOR语句片段

用s1记录当前节点的属性值;

If是JJTQNAME返回“$”+s1;

If是JJTFUNCTIONQNAME设置数据源类型为s1返回s1;

Else返回s1;

【算法3】FORLET算法

输入:for|let节点  输出:for|let子句

对第一个节点执行dump算法,用s1记录返回值;

对第二个节点执行dump算法,用s2记录返回值;

记录节点处数据源类型;

If当前节点类型是JJTFORCLAUSE,返回语句”for”+s1+”in”+s2否则,返回语句”let”+s1+”:=”+s2

【算法4】FUNCTIONCALL算法

输入:当前节点  输出:FLWOR语句片段

对第一个子节点执行dump算法,用s1存储;

对第二个子节点执行dump算法,用s2存储;

获取第一个节点的数据源类型;

设置属性值为s1+“(”+s2+“)”,返回该属性值;

【算法5】LOGICEXPR算法

输入:当前节点  输出:FLWOR语句片段

对第一个子节点执行dump算法,用s1存储;

对第二个子节点执行dump算法,用s2存储;

If当前节点类型为JJTANDEXPR,设置属性值为S1and S2,输出该属性值;

Else设置属性值为S1or S2,输出该属性值;

【算法6】FORLET算法

输入:当前节点  输出:FLWOR语句片段

对第一个子节点执行dump算法,用s1存储;

If当前节点类型为JJTWHEREEXPR,设置属性值为where+S1,输出该属性值;

Else设置属性值为“(”+S1+“)”,输出该属性值;

【算法7】CONSTRUCTOR算法

输入:当前节点  输出:FLWOR语句片段

For当前节点的每个子节点

用s1记录对第i个节点执行dump算法的返回值;

If是第一个节点且类型为JJTDIRELELCONTENT

取下一个节点,对它执行dump算法;设置该节点属性值为”</”+s1+”>”,返回该值;

Else当前节点属性值为s1,返回该属性值;

【算法8】FLWOR算法

输入:当前节点  输出:FLWOR查询语句

For FLWOR的每个子节点

对每个子节点执行dump算法;

If子节点类型为JJTFORCLAUSE,设置FLWOR节点数据源类型为该节点数据源类型

If达到FLWOR的最后一个子节点,将return片段加入,使FLWOR子查询完整,根据数据源类型传递给相应的包装器;

【算法9】OTHER算法

输入:当前节点  输出:FLOWR语句片段

For当前节点的每个子节点

对第i个节点执行dump算法,用s1记录返回值;

用s2记录第i个节点的n_value;

If(第i个节点的类型为JJTFUNCTIONCALL)

将当前节点的n_value设置为s2;,将当前节点的e_value设置为s1;

Else将当前节点的e_value设置为s1;

Return s1;

模块五:结果处理模块

设计为两部分:中间子查询结果的缓存和最终查询结果的传递。设计中间结果存储在MAP(变量名,resultsequence)中,若底层数据源是XML文件,其查询结果是resultsequence类的实例,则可以直接存在MAP中。若子查询查是是关系型数据源,经过SQL查询后,结果是resultset类的实例,应该将resultset设置为resultsequence的一个私有属性,仍以(变量名,resultsequence)形式存储在MAP中。若为嵌套查询,则内层查询中会用的外层查询中出现的变量,可以通过模块一和模块五中的MAP获得外层查询结果。

最终查询结果要构造成如下XML形式返还用户:

    <resultsequence>

        <usernamrtoken>

            <username>

            <password>

    </usernametoken>

    <result>

    </result>

</resultsequence>

将最终查询结果存放在<result>中,其中<usernamrtoken>用于验证用户信息,是通过用户提交的HttpServletRequest中的用户信息中提取出来的。

本发明的查询引擎系统的上述四个模块组成中介器,是本发明的重点,在该中介器中,词法分析模块接收全局XQuery语句作为输入,输出带有属性的令牌(tokens)到语法分析模块,语法分析模块输出抽象语法树到正规化模块,该模块输出的是形式良好的语法树,经过查询分解模块分解为针对每类数据源的子查询,传给相应的包装器进行底层数据源查询,查询结果经由由包装器处理为XML格式后传递给结果处理模块,经该模块将最终查询结果返回给用户。

本专利实现了以XML作为公共数据模型,XQuery作为全局查询语言的数据集成平台中多数据源查询引擎,能将符合上述XQuery语法标准的,非嵌套的XQuery语句分解为针对每个数据源的子查询,调用包装器,接收包装器返回结果并缓存,重构最终结果传递给用户。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号