基于XQuery的查询引擎系统的制作方法

文档序号:6483444阅读:212来源:国知局
专利名称:基于XQuery的查询引擎系统的制作方法
技术领域
本发明涉及数据集成技术领域,特别涉及一种以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中提至U Lord将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、 ' 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子句。
5所述査询分解模块,包括以下操作
将当前节点指针指向根节点,由根向下深度优先遍历语法树,判断当前节点是否为 叶子节点,若为叶子节点,直接取出属性值,返回父节点即可,否则,判断当前节点是 否有未遍历的子节点,若有,则遍历以该子节点为根的子树,否则,根据对当前节点执 行dump算法,获得FLWOR语句片段,返回父节点,若父节点为空,表明整棵语法树
处理完成,操作结束。
所述XML数据源包装器,包括以下操作
接收中介器传递过来的针对XML数据源的XQuery子查询,对XML数据源进行 査询,将査询结果直接传递给结果处理模块。 所述关系型数据源包装器,包括以下操作-
接收包装器传递过来的针对关系型数据源的XQuery子査询,将其转换为等价的 SQL语句查询关系型数据源,将查询结果构建成XML格式传给结果处理模块。
与现有技术相比,本发明能将平台内全局XQuery査询语句査询等价的分解为针对 每一数据源的子査询语句,在词法分析模块已将要査询的数据源相关信息以变量形式记 录在MAP中,有效的防止将针对相同变量类型、不同变量名的变量的子查询多次提取 后传给包装器,提高了效率,XQuery抽象语法树又经过正规化模块处理,结构良好, 使得构造的子查询格式良好,统一;将查询中间结果存储在MAP中,防止多次连接底 层数据源,将针对关系型数据源的子查询采用"SQL"下推交给DBMS进行査询,都 使得査询效率有所提高。


图1为本发明的查询引擎系统结构示意图; 图2为本发明的査询分解模块的流程示意图。
具体实施例方式
以中介方式实现的查询引擎系统设计如图l所示。该系统包括中介器和包装器,其
中中介器包括五个模块,词法分析模块,用于将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语句正规化为XQuery 1.1 and Xpath2.0 Formal Semantics中定义的格式。
包装器包括XML数据源包装器、关系型数据源包装器。根据数据源类型的不同将 子查询传递给不同的包装器,包装器接收子査询,将其转换数据源支持的査询语言进行 底层数据源査询,将査询结果以XML格式传递给包装器的结果处理模块。各组成模块 介绍如下
首先,需要给出本发明依赖的XQuery规范,它是w3c提供的XQuery语言规范的一 个子集,用于完成本发明的基本功能。 Expr ::= ExprSingle CV'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 (7" RelativePathExpr )l (',〃" ReIativePathExpr)| RelativePathExpr
RelativePathExpr ::= StepExpr (('V" | ',〃") StepExpr)* AxisStep : := (AbbrevReverseStep)PredicateList
AbbrevRe verse Step ::= " ,,
FilterExpr ::= PrimaryExpr PredicateList
PredicateList ::= Predicate*Predicate "[" Expr"]"
PrimaryExpr Literal | VarRef | ParenthesizedExpr | FunctionCall | Constructor Literal ::= NumericLiteral | StringLiteral
NumericLiteral ::= IntegerLiteral 1 DecimalLiteral | DoubleLiteral VarRef ::= "$" Qname ParenthesizedExpr "(" Expr ")"
FunctionCall ::= QName "(" (ExprSingle ("," ExprSingle)*) ")"
Constructor ::= "<" QName DirAttributeList ("/>" | (">" DirElemContent* "</" QName S ">"》
DirAttributeList (S (QName S ',=', S DirAttributeValue) )* DirAttributeValue ::= ("" (EscapeQuot | QuotAttrValueContent)* "") I (""' (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语句正规化为XQueryl.l and Xpath2.0 Formal Semantics中定义的格式,方法是在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 in doc( '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 语句片段,最终将重构子句传递给包装器进行数据源查询。该流程包括以下歩骤
步骤l,将当前节点指针指向根节点;
步骤2,获得当前节点;
步骤3,判断步骤2所获得的当前节点是否为语法树的叶子节点?
歩骤4,如果是叶子节点,则获取叶子节点的属性值;执行步骤8;
步骤5,如果不是叶子节点,再判断该当前节点是否存在未遍历的子节点?
歩骤6,如果非叶节点的当前节点存在未遍历的子节点,将当前节点指针指向第一
个未遍历的节点,跳转到步骤2;
步骤7,如果非叶节点的当前节点不存在未遍历的子节点,则根据节点类型对该节
点进行处理,获得FLWOR片段,并将该节点标记为已遍历,将当前节点指针指向父节
点,返回步骤9;
步骤8,记录节点信息的值,将当前节点指针指向它的父节点,执行歩骤2;
步骤9,判断该父节点是否为空,如是,则表明语法树中的节点处理完毕,流程结 束;如否,转至步骤2,继续执行流程,直到语法树中的节点都处理完。
如图2所示,将当前节点指针指向根节点,由根向下深度优先遍历语法树,判断 当前节点是否为叶子节点,若为叶子节点,直接取出属性值,返回父节点即可,否则, 判断当前节点是否有未遍历的子节点,若有,将第一个未遍历子节点设置为当前节点, 根据当前节点类型执行diimp算法,遍历以该子节点为根的子树。否则,根据当前节点 类型提取出FLWOR语句片段,返回父节点,若父节点为空,说明整棵树处理完成,结
束即可。
其中,dump算法的描述如下算法1dump算法
输入当前节点输出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.算法2LITERAL算法 输入当前节点 输出:FLWOR语句片段 用si记录当前节点的属性值; If是JJTQNAME返回"$" +sl;
If是JJTFUNCTIONQNAME设置数据源类型为si返回si; Else返回si;算法3FORLET算法 输入forllet节点 输出forllet子句 对第一个节点执行dump算法,用si记录返回值; 对第二个节点执行dump算法,用s2记录返回值; 记录节点处数据源类型;
If当前节点类型是JJTFORCLAUSE,返回语句"for" +sl+" in" +s2 否则,返回语句"let" +sl+" +s算法4FUNCTIONCALL算法 输入当前节点 输出FLWOR语句片段 对第一个子节点执行dump算法,用si存储; 对第二个子节点执行dump算法,用s2存储; 获取第一个节点的数据源类型;
设置属性值为sl+ " (" +s2+ ")",返回该属性值;算法5LOGICEXPR算法 输入:当前节点 输出FLWOR语句片段 对第一个子节点执行dump算法,用si存储; 对第二个子节点执行dump算法,用s2存储;
If当前节点类型为JJTANDEXPR,设置属性值为SlandS2,输出该属性值; Else设置属性值为SlorS2,输出该属性值;算法6FORLET算法 输入当前节点 输出FLWOR语句片段 对第一个子节点执行dump算法,用si存储;If当前节点类型为JJTWHEREEXPR ,设置属性值为where+S1 ,输出该属性值;Else设置属性值为"(,,+S1+ ")",输出该属性值;算法7CONSTRUCTOR算法
输入当前节点 输出FLWOR语句片段
For当前节点的每个子节点
用si记录对第i个节点执行dump算法的返回值;
If是第一个节点且类型为JJTDIRELELCONTENT取下一个节点,对它执行dump算法;设置该节点属性值为"</" +sl+" >",返回该值;
Else当前节点属性值为sl,返回该属性值;算法8FLWOR算法
输入当前节点 输出FLWOR查询语句For FLWOR的每个子节点
对每个子节点执行dump算法;
If子节点类型为JJTFORCLAUSE,设置FLWOR节点数据源类型为该节点数据源类型
If达到FLWOR的最后一个子节点,将return片段加入,使FLWOR子査询完整,根据数据源类型传递给相应的包装器;算法9OTHER算法输入当前节点 输出FLOWR语句片段For当前节点的每个子节点
对第i个节点执行dump算法,用si记录返回值;
用s2记录第i个节点的n—value;
If(第i个节点的类型为JJTFUNCTIONCALL)
将当前节点的n—value设置为s2;,将当前节点的e—value设置为si;
Else将当前节点的e一value设置为si;Return si;
模块五结果处理模块
设计为两部分中间子査询结果的缓存和最终査询结果的传递。
设计中间结果存储在MAP (变量名,resultsequence)中,若底层数据源是XML文件,其査询结果是resultsequence类的实例,则可以直接存在MAP中。若子查询查是是关系型数据源,经过SQL查询后,结果是resultset类的实例,应该将resultset设置为resultsequence的一个私有属性,仍以(变量名,resultsequence)形式存储在MAP中。若为嵌套査询,则内层査询中会用的外层查询中出现的变量,可以通过模块一和模块五中的MAP获得外层查询结果。
11最终查询结果要构造成如下XML形式返还用户<resultsequence><usernamrtoken><us6rnamc><password></usemametoken><result></result></resultsequence>
将最终查询结果存放在々esult〉中,其中〈usemamrtoken〉用于验证用户信息,是通过用户提交的HttpServletRequest中的用户信息中提取出来的。
本发明的查询引擎系统的上述四个模块组成中介器,是本发明的重点,在该中介器中,词法分析模块接收全局XQuery语句作为输入,输出带有属性的令牌(tokens)到语法分析模块,语法分析模块输出抽象语法树到正规化模块,该模块输出的是形式良好的语法树,经过査询分解模块分解为针对每类数据源的子查询,传给相应的包装器进行底层数据源查询,查询结果经由由包装器处理为XML格式后传递给结果处理模块,经该模块将最终查询结果返回给用户。
本专利实现了以XML作为公共数据模型,XQuery作为全局查询语言的数据集成平台中多数据源查询引擎,能将符合上述XQuery语法标准的,非嵌套的XQuery语句分解为针对每个数据源的子査询,调用包装器,接收包装器返回结果并缓存,重构最终结果传递给用户。
权利要求
1.一种基于XQuery的查询引擎系统,该系统包括中介器和包装器,其中,中介器包括五个模块,即词法分析模块,用于将XQuery语句分割为携带属性的令牌(tokens);语法分析模块,用于将令牌(tokens)组织为抽象语法树;正规化模块,用于对语法树进行整理,以产生形式良好的语法树;查询分解模块,用于遍历该语法树,产生针对底层数据源的子查询,调用相应的包装器;结果处理模块接收包装器返回的查询结果,将中间结果以resultsequence类型的格式缓存在MAP中,以XML形式构建最终的查询结果返回给用户;包装器包括XML数据源包装器、关系型数据源包装器;包装器接收中介器传来的针对每个数据源的XQuery子查询,将其转变为数据源能够支持的查询语句进行底层数据源查询,将查询结果构造成XML形式返还给结果处理模块。
2. 如权利要求1所述的基于XQuery的査询引擎系统,其特征在于,所述词法分析模块,包括以下操作在XQStaticContext中加入记录变量信息的MAP,每出现一个变量,通过XQStaticContext中的MAP査找该变量类型是否出现过,若出现过,用已存在的变量名替代新出现的变量名,若该变量名未出现过,则将该变量名及变量类型信息存入变量MAP。
3. 如权利要求1所述的基于XQuery的查询引擎系统,其特征在于,所述语法分析模块,包括以下操作-借助语法树构造工具JJTree,完成将词法分析后的令牌tokens依照规定的XQuery语法规范组织成一棵抽象语法树。
4. 如权利要求1所述的基于XQuery的查询引擎系统,其特征在于,所述正规化模块,包括以下操作-在XQuery语句中每遇到For或Let子句,就重新构造一个FLWOR语句嵌套在当前FLWOR语句的return子句内,将遇到的For或Let子句提取出来作为新构造的FLWOR语句的For或Let子句。
5. 如权利要求1所述的基于XQuery的査询引擎系统,其特征在于,所述查询分解模块,包括以下操作将当前节点指针指向根节点,由根向下深度优先遍历语法树,判断当前节点是否为叶子节点,若为叶子节点,直接取出属性值,返回父节点即可,否则,判断当前节点是否有未遍历的子节点,若有,当前节点指针指向第一个未遍历的子节点,根据当前节点类型执行dump算法,遍历以该子节点为根的子树,否则根据当前节点类型构造FLWOR语句片段,返回父节点,若父节点为空,表明整棵语法树处理完成,操作结束。
6. 如权利要求1所述的基于XQuery的查询引擎系统,其特征在于,所述XML数据源包装器,包括以下操作接收中介器传递过来的针对XML数据源的XQuery子査询,对XML数据源进行査询,将査询结果直接传递给结果处理模块。
7.如权利要求1所述的基于XQuery的査询引擎系统,其特征在于,所述关系型数据源包装器,包括以下操作接收包装器传递过来的针对关系型数据源的XQuery子查询,将其转换为等价的SQL语句查询关系型数据源,将查询结果构建成XML格式传给结果处理模块。
全文摘要
本发明公开了一种基于XQuery的查询引擎系统,包括中介器和包装器,中介器包括词法分析模块,将XQuery语句分割为携带属性的令牌;语法分析模块,依据XQuery语法规范将令牌组织为抽象语法树;正规化模块,对语法树进行整理,产生形式良好的语法树;查询分解模块,遍历语法树,产生针对底层数据源的子查询,调用相应包装器;结果处理模块接收包装器传来的查询结果,并以XML形式将查询结果返回用户。包装器包括关系型数据源包装器和XML数据源包装器,接收中介器传来的XQuery子查询,转换为数据源支持的查询语言进行底层数据源查询,最终结果重构为XML格式传给结果处理模块。本发明提高了查询效率,对抽象语法树的正规化使得构造出的查询子句结构良好,可读性增强。
文档编号G06F17/30GK101667190SQ200910070718
公开日2010年3月10日 申请日期2009年9月29日 优先权日2009年9月29日
发明者冯志勇, 超 刘, 李柳青, 陈世展 申请人:天津大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1