亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

基于XQuery的查詢引擎系統(tǒng)的制作方法

文檔序號:6483444閱讀:253來源:國知局
專利名稱:基于XQuery的查詢引擎系統(tǒng)的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及數(shù)據(jù)集成技術(shù)領(lǐng)域,特別涉及一種以XML作為數(shù)據(jù)模型,XQuery作為 査詢語言的數(shù)據(jù)集成平臺(tái)實(shí)現(xiàn)。
背景技術(shù)
信息社會(huì)的發(fā)展,導(dǎo)致海量異構(gòu)數(shù)據(jù)的出現(xiàn),使得數(shù)據(jù)共享成為瓶頸。隨著XML 技術(shù)成為數(shù)據(jù)交換的標(biāo)準(zhǔn),以XML作為數(shù)據(jù)摸型的數(shù)據(jù)集成平臺(tái)引起人們的關(guān)注。 比較有代表性的針對XML的査詢語言包括
1) W3C提出的XSL可擴(kuò)展樣式表語言,專用于處理XML文檔,但只能讀取文檔 內(nèi)容,不能更改或編輯文檔;
2) XQL語言,用于定位和過濾XML文檔中元素和文本的符號,但適用范圍僅限 于XML文檔,因而可擴(kuò)展性差;
3) Alin Denutsh等人在《A Query Language for XML》中提到的XML-QL,能對 XML文檔進(jìn)程査詢、構(gòu)造、轉(zhuǎn)換和集成,在査詢條件中加入模式匹配時(shí)它與其他半結(jié) 構(gòu)化查詢語言最大的不同,但是不執(zhí)行全稱量詞,且通用性較差;
4) Serge Abiteboul等人在The Lorel Query Language for Semistructured Data中提至U Lord將XML文檔映射成圖,將XML元素映射為圖中的節(jié)點(diǎn),將元素間關(guān)系映射為圖 中的邊,這種查詢語言結(jié)構(gòu)復(fù)雜,表達(dá)式冗長。
面對現(xiàn)有XML查詢語言通用性的不足,萬維網(wǎng)協(xié)會(huì)在2001年2月提出XQuery第 一個(gè)草案。XQuery語言操作的是針對XML文檔的抽象、邏輯結(jié)構(gòu)的,從XML-QL中 吸取了變量綁定和用被綁定變量構(gòu)造新的文檔結(jié)構(gòu)的方法;從SQL中獲得了用一組關(guān) 鍵字(select-from-where)構(gòu)成查詢語句的思想,擴(kuò)展了 XPath2.0規(guī)范,能在XML文 檔中定位節(jié)點(diǎn),并使用擴(kuò)展了的XML Schema規(guī)范中的類型系統(tǒng)。
針對XQuery規(guī)范的査詢引擎有XQEngine、 Saxon、 Galax及Aqualogic。 XQEngine 是對XQuery規(guī)范的最基本實(shí)現(xiàn),對査詢的處理流程做了很好的實(shí)現(xiàn),但卻僅能實(shí)現(xiàn) 規(guī)范定義的幾個(gè)核心函數(shù)。Saxon能同時(shí)作為XSLT與XQuery的查詢引擎,實(shí)現(xiàn)了 XQuery的標(biāo)準(zhǔn)并做出了擴(kuò)展,并對關(guān)系數(shù)據(jù)數(shù)據(jù)的集成實(shí)現(xiàn)了自己的擴(kuò)展,但是這也 使得它的結(jié)構(gòu)異常復(fù)雜。Galax是對XQuery規(guī)范的忠實(shí)實(shí)現(xiàn),它使用O' Caml語言 實(shí)現(xiàn),對XQuery語法樹的處理嚴(yán)格按照XQuery規(guī)范的定義實(shí)現(xiàn),對外提供C、 Java、 ' Caml調(diào)用接口,但該語言的特點(diǎn)限制了該引擎的擴(kuò)展性,不利于對異構(gòu)數(shù)據(jù)實(shí)現(xiàn)適配器模塊。Aqualogic是BEA公司推出的,對XQuery規(guī)范做出了擴(kuò)展,在XQuery 査詢語句中加入大量描述數(shù)據(jù)源的元數(shù)據(jù)信息,基于Weblogic Platform實(shí)現(xiàn)了 GUI界 面,圖形化的操作界面屏蔽了底層數(shù)據(jù)的具體信息,便利了數(shù)據(jù)集成的操作,由于其 強(qiáng)大的功能使得查詢語句的書寫存在困難。
因此,現(xiàn)有技術(shù)中的基于XQuery的査詢引擎各有不足,如何更好地解決數(shù)據(jù)集成 中異構(gòu)數(shù)據(jù)源查詢問題,正是本發(fā)明所要解決的問題

發(fā)明內(nèi)容
本發(fā)明旨在為克服上述現(xiàn)有技術(shù)存在的問題,而提出 一種基于XQuery的查詢引擎 系統(tǒng)。在以XML為數(shù)據(jù)模型,XQuery作為査詢語句的基于中介模式的數(shù)據(jù)集成平臺(tái)上, 借由中介器將XQuery全局查詢分解為針對每個(gè)數(shù)據(jù)源的子查詢,調(diào)用相應(yīng)的包裝器進(jìn) 行底層數(shù)據(jù)源的査詢,接收查詢結(jié)果,將査詢結(jié)果重組為XML數(shù)據(jù)形式傳遞給用戶, 能夠解決數(shù)據(jù)集成中異構(gòu)數(shù)據(jù)源査詢問題。
本發(fā)明還提供了一種基于XQuery的査詢引擎系統(tǒng),該系統(tǒng)包括中介器和包裝器, 其中,中介器包括五個(gè)模塊,即詞法分析模塊,用于將XQuery語句分割為攜帶屬性的 令牌(tokens);語法分析模塊,用于將令牌(tokens)組織為抽象語法樹;正規(guī)化模塊, 用于對語法樹進(jìn)行整理,以產(chǎn)生形式良好的語法樹;査詢分解模塊,用于遍歷該語法樹, 產(chǎn)生針對底層數(shù)據(jù)源的子?xùn)嗽?,調(diào)用相應(yīng)的包裝器;結(jié)果處理模塊接收包裝器返回的查 詢結(jié)果,將中間結(jié)果以resultsequence類型的格式緩存在MAP中,以XML形式構(gòu)建最 終的查詢結(jié)果返回給用戶;包裝器包括XML數(shù)據(jù)源包裝器、關(guān)系型數(shù)據(jù)源包裝器;包 裝器接收中介器傳來的針對每個(gè)數(shù)據(jù)源的XQuery子?xùn)嗽儯瑢⑵滢D(zhuǎn)變?yōu)閿?shù)據(jù)源能夠支持 的査詢語句進(jìn)行底層數(shù)據(jù)源査詢,將査詢結(jié)果構(gòu)造成XML形式返還給結(jié)果處理模塊。 所述詞法分析模塊,包括以下操作 在XQStaticContext中加入記錄變量信息的MAP,每出現(xiàn)一個(gè)變量,通過 XQStaticContext中的MAP查找該變量類型是否出現(xiàn)過,若出現(xiàn)過,用已存在的變量名 替代新出現(xiàn)的變量名,若該變量名未出現(xiàn)過,則將該變量名及變量類型信息存入變量 MAP。
所述語法分析模塊,包括以下操作
借助語法樹構(gòu)造工具JJTree,完成將詞法分析后的令牌tokens依照規(guī)定的XQuery 語法規(guī)范組織成一棵語法樹。
所述正規(guī)化模塊,包括以下操作
在XQuery語句中每遇到For或Let子句,就重新構(gòu)造一個(gè)FLWOR語句嵌套在當(dāng) 前FLWOR語句的return子句內(nèi),將遇到的For或Let子句提取出來作為新構(gòu)造的FLWOR 語句的For或Let子句。
5所述査詢分解模塊,包括以下操作
將當(dāng)前節(jié)點(diǎn)指針指向根節(jié)點(diǎn),由根向下深度優(yōu)先遍歷語法樹,判斷當(dāng)前節(jié)點(diǎn)是否為 葉子節(jié)點(diǎn),若為葉子節(jié)點(diǎn),直接取出屬性值,返回父節(jié)點(diǎn)即可,否則,判斷當(dāng)前節(jié)點(diǎn)是 否有未遍歷的子節(jié)點(diǎn),若有,則遍歷以該子節(jié)點(diǎn)為根的子樹,否則,根據(jù)對當(dāng)前節(jié)點(diǎn)執(zhí) 行dump算法,獲得FLWOR語句片段,返回父節(jié)點(diǎn),若父節(jié)點(diǎn)為空,表明整棵語法樹
處理完成,操作結(jié)束。
所述XML數(shù)據(jù)源包裝器,包括以下操作
接收中介器傳遞過來的針對XML數(shù)據(jù)源的XQuery子查詢,對XML數(shù)據(jù)源進(jìn)行 査詢,將査詢結(jié)果直接傳遞給結(jié)果處理模塊。 所述關(guān)系型數(shù)據(jù)源包裝器,包括以下操作-
接收包裝器傳遞過來的針對關(guān)系型數(shù)據(jù)源的XQuery子?xùn)嗽?,將其轉(zhuǎn)換為等價(jià)的 SQL語句查詢關(guān)系型數(shù)據(jù)源,將查詢結(jié)果構(gòu)建成XML格式傳給結(jié)果處理模塊。
與現(xiàn)有技術(shù)相比,本發(fā)明能將平臺(tái)內(nèi)全局XQuery査詢語句査詢等價(jià)的分解為針對 每一數(shù)據(jù)源的子?xùn)嗽冋Z句,在詞法分析模塊已將要査詢的數(shù)據(jù)源相關(guān)信息以變量形式記 錄在MAP中,有效的防止將針對相同變量類型、不同變量名的變量的子查詢多次提取 后傳給包裝器,提高了效率,XQuery抽象語法樹又經(jīng)過正規(guī)化模塊處理,結(jié)構(gòu)良好, 使得構(gòu)造的子查詢格式良好,統(tǒng)一;將查詢中間結(jié)果存儲(chǔ)在MAP中,防止多次連接底 層數(shù)據(jù)源,將針對關(guān)系型數(shù)據(jù)源的子查詢采用"SQL"下推交給DBMS進(jìn)行査詢,都 使得査詢效率有所提高。


圖1為本發(fā)明的查詢引擎系統(tǒng)結(jié)構(gòu)示意圖; 圖2為本發(fā)明的査詢分解模塊的流程示意圖。
具體實(shí)施例方式
以中介方式實(shí)現(xiàn)的查詢引擎系統(tǒng)設(shè)計(jì)如圖l所示。該系統(tǒng)包括中介器和包裝器,其
中中介器包括五個(gè)模塊,詞法分析模塊,用于將XQuery語句分割為攜帶屬性的令牌 (tokens);語法分析模塊,用于將令牌(tokens)組織為抽象語法樹;正規(guī)化模塊,用 于對語法樹進(jìn)行整理,以產(chǎn)生形式良好的語法樹;查詢分解模塊,用于遍歷該語法樹, 產(chǎn)生針對底層數(shù)據(jù)源的子查詢,調(diào)用相應(yīng)的包裝器;結(jié)果處理模塊接收包裝器傳來的査 詢結(jié)果,并以XML形式將最終查詢結(jié)果返回給用戶;
詞法分析模塊的操作為,詞法分析借助XQJ提供的編程接口 XQStaticContext,即 XQJ提供的用于記錄變量或函數(shù)定義等信息的靜態(tài)環(huán)境。通過在XQStaticContext中加 入記錄變量信息的MAP,每出現(xiàn)一個(gè)變量,通過XQStaticContext中的MAP査找該變量類型是否出現(xiàn)過,若出現(xiàn)過,用已存在的變量名替代新出現(xiàn)的變量名,表示這是同一 個(gè)變量的兩個(gè)不同變量名。若該變量名未出現(xiàn)過,則將該變量信息存入變量MAP。
正規(guī)化模塊的操作為在XQuery語句中每遇到For或Let子句,就重新構(gòu)造一個(gè) FLWOR語句嵌套在當(dāng)前FLWOR語句的return子句內(nèi),將遇到的For或Let子句提取 出來作為新構(gòu)造的FLWOR語句的For或Let子句。如此操作將符合XQuery語法規(guī)范 的XQuery語句正規(guī)化為XQuery 1.1 and Xpath2.0 Formal Semantics中定義的格式。
包裝器包括XML數(shù)據(jù)源包裝器、關(guān)系型數(shù)據(jù)源包裝器。根據(jù)數(shù)據(jù)源類型的不同將 子查詢傳遞給不同的包裝器,包裝器接收子?xùn)嗽?,將其轉(zhuǎn)換數(shù)據(jù)源支持的査詢語言進(jìn)行 底層數(shù)據(jù)源査詢,將査詢結(jié)果以XML格式傳遞給包裝器的結(jié)果處理模塊。各組成模塊 介紹如下
首先,需要給出本發(fā)明依賴的XQuery規(guī)范,它是w3c提供的XQuery語言規(guī)范的一 個(gè)子集,用于完成本發(fā)明的基本功能。 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)將接收到的符合上述語法規(guī)范的全局XQuery語 句作為詞法分析模塊的輸入,將該語句分解為帶有特定語義的令牌(tokens)。在詞法分 析的過程中,借助XQJ提供的編程接口,在XQStaticContext中加入MAP(變量名,變 量類型),每出現(xiàn)一個(gè)變量,就要通過StaticContext中的MAP査找該變量類型是否出現(xiàn) 過,若出現(xiàn)過,用已存在的變量替代新出現(xiàn)的變量,若該變量類型信息未出現(xiàn)過,則將 該變量連同類型信息存入MAP中。
模塊二語法分析模塊
借助JavaCC自帶的語法樹構(gòu)造工具JJTree,完成將詞法分析后的帶特定屬性的 tokens依照規(guī)定的XQuery語法規(guī)范組織成一棵語法樹。 模塊三正規(guī)化模塊
將符合XQuery語法規(guī)范的XQuery語句正規(guī)化為XQueryl.l and Xpath2.0 Formal Semantics中定義的格式,方法是在XQuery語句中每遇到For和Let子句,構(gòu)建新的 FLWOR語句嵌套在當(dāng)前層的內(nèi)部,例如
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〉上述的語句中有兩個(gè)for子句,正規(guī)化時(shí),首先,創(chuàng)建一條FLWOR語句,將第一個(gè) for子句作為他的for節(jié)點(diǎn),然后構(gòu)造return節(jié)點(diǎn),在return節(jié)點(diǎn)內(nèi)嵌套新的FLWOR語 句,將第二個(gè)for子句作為他的子節(jié)點(diǎn),以此方法,將例子中的where與return子句作 為最內(nèi)層FLWOR語句的子節(jié)點(diǎn)。上述語句可以正規(guī)化為 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>}。
模塊四査詢分解模塊
該模塊接收到正規(guī)化后的語法樹,運(yùn)行XQuery査詢分解算法,算法流程如圖2所 示,采用深度優(yōu)先遍歷語法樹,在遍歷過程中,結(jié)合tokens節(jié)點(diǎn)的屬性值,重構(gòu)出FLWOR 語句片段,最終將重構(gòu)子句傳遞給包裝器進(jìn)行數(shù)據(jù)源查詢。該流程包括以下歩驟
步驟l,將當(dāng)前節(jié)點(diǎn)指針指向根節(jié)點(diǎn);
步驟2,獲得當(dāng)前節(jié)點(diǎn);
步驟3,判斷步驟2所獲得的當(dāng)前節(jié)點(diǎn)是否為語法樹的葉子節(jié)點(diǎn)?
歩驟4,如果是葉子節(jié)點(diǎn),則獲取葉子節(jié)點(diǎn)的屬性值;執(zhí)行步驟8;
步驟5,如果不是葉子節(jié)點(diǎn),再判斷該當(dāng)前節(jié)點(diǎn)是否存在未遍歷的子節(jié)點(diǎn)?
歩驟6,如果非葉節(jié)點(diǎn)的當(dāng)前節(jié)點(diǎn)存在未遍歷的子節(jié)點(diǎn),將當(dāng)前節(jié)點(diǎn)指針指向第一
個(gè)未遍歷的節(jié)點(diǎn),跳轉(zhuǎn)到步驟2;
步驟7,如果非葉節(jié)點(diǎn)的當(dāng)前節(jié)點(diǎn)不存在未遍歷的子節(jié)點(diǎn),則根據(jù)節(jié)點(diǎn)類型對該節(jié)
點(diǎn)進(jìn)行處理,獲得FLWOR片段,并將該節(jié)點(diǎn)標(biāo)記為已遍歷,將當(dāng)前節(jié)點(diǎn)指針指向父節(jié)
點(diǎn),返回步驟9;
步驟8,記錄節(jié)點(diǎn)信息的值,將當(dāng)前節(jié)點(diǎn)指針指向它的父節(jié)點(diǎn),執(zhí)行歩驟2;
步驟9,判斷該父節(jié)點(diǎn)是否為空,如是,則表明語法樹中的節(jié)點(diǎn)處理完畢,流程結(jié) 束;如否,轉(zhuǎn)至步驟2,繼續(xù)執(zhí)行流程,直到語法樹中的節(jié)點(diǎn)都處理完。
如圖2所示,將當(dāng)前節(jié)點(diǎn)指針指向根節(jié)點(diǎn),由根向下深度優(yōu)先遍歷語法樹,判斷 當(dāng)前節(jié)點(diǎn)是否為葉子節(jié)點(diǎn),若為葉子節(jié)點(diǎn),直接取出屬性值,返回父節(jié)點(diǎn)即可,否則, 判斷當(dāng)前節(jié)點(diǎn)是否有未遍歷的子節(jié)點(diǎn),若有,將第一個(gè)未遍歷子節(jié)點(diǎn)設(shè)置為當(dāng)前節(jié)點(diǎn), 根據(jù)當(dāng)前節(jié)點(diǎn)類型執(zhí)行diimp算法,遍歷以該子節(jié)點(diǎn)為根的子樹。否則,根據(jù)當(dāng)前節(jié)點(diǎn) 類型提取出FLWOR語句片段,返回父節(jié)點(diǎn),若父節(jié)點(diǎn)為空,說明整棵樹處理完成,結(jié)
束即可。
其中,dump算法的描述如下算法1dump算法
輸入當(dāng)前節(jié)點(diǎn)輸出FLWOR語句片段
If類型為或JJTSTRINGLITERAL或JJTFUNCTIONQNAME或JJTINTEGERITERAL 或JJTDECIMALLITERAL或JJTDOUBLELITERAL,跳轉(zhuǎn)到算法2;If類型為JJTFORCLAUSE或JJTLETEXPR,跳轉(zhuǎn)到算法3; If類型為JJTFUCTIONCALL,跳轉(zhuǎn)到算法4; If類型為JJTANDEXPR或JJTOREXPR,跳轉(zhuǎn)到算法5; If類型為JJTWHEREEXPR或JJTPARENTNESIZEEDEXPR,跳轉(zhuǎn)到算法6; If類型為JJTCONSTRUCTOR,跳轉(zhuǎn)到算法7; If類型為JJTFLWOREXPR,跳轉(zhuǎn)到算法8; Else執(zhí)行算法9.算法2LITERAL算法 輸入當(dāng)前節(jié)點(diǎn) 輸出:FLWOR語句片段 用si記錄當(dāng)前節(jié)點(diǎn)的屬性值; If是JJTQNAME返回"$" +sl;
If是JJTFUNCTIONQNAME設(shè)置數(shù)據(jù)源類型為si返回si; Else返回si;算法3FORLET算法 輸入forllet節(jié)點(diǎn) 輸出forllet子句 對第一個(gè)節(jié)點(diǎn)執(zhí)行dump算法,用si記錄返回值; 對第二個(gè)節(jié)點(diǎn)執(zhí)行dump算法,用s2記錄返回值; 記錄節(jié)點(diǎn)處數(shù)據(jù)源類型;
If當(dāng)前節(jié)點(diǎn)類型是JJTFORCLAUSE,返回語句"for" +sl+" in" +s2 否則,返回語句"let" +sl+" +s算法4FUNCTIONCALL算法 輸入當(dāng)前節(jié)點(diǎn) 輸出FLWOR語句片段 對第一個(gè)子節(jié)點(diǎn)執(zhí)行dump算法,用si存儲(chǔ); 對第二個(gè)子節(jié)點(diǎn)執(zhí)行dump算法,用s2存儲(chǔ); 獲取第一個(gè)節(jié)點(diǎn)的數(shù)據(jù)源類型;
設(shè)置屬性值為sl+ " (" +s2+ ")",返回該屬性值;算法5LOGICEXPR算法 輸入:當(dāng)前節(jié)點(diǎn) 輸出FLWOR語句片段 對第一個(gè)子節(jié)點(diǎn)執(zhí)行dump算法,用si存儲(chǔ); 對第二個(gè)子節(jié)點(diǎn)執(zhí)行dump算法,用s2存儲(chǔ);
If當(dāng)前節(jié)點(diǎn)類型為JJTANDEXPR,設(shè)置屬性值為SlandS2,輸出該屬性值; Else設(shè)置屬性值為SlorS2,輸出該屬性值;算法6FORLET算法 輸入當(dāng)前節(jié)點(diǎn) 輸出FLWOR語句片段 對第一個(gè)子節(jié)點(diǎn)執(zhí)行dump算法,用si存儲(chǔ);If當(dāng)前節(jié)點(diǎn)類型為JJTWHEREEXPR ,設(shè)置屬性值為where+S1 ,輸出該屬性值;Else設(shè)置屬性值為"(,,+S1+ ")",輸出該屬性值;算法7CONSTRUCTOR算法
輸入當(dāng)前節(jié)點(diǎn) 輸出FLWOR語句片段
For當(dāng)前節(jié)點(diǎn)的每個(gè)子節(jié)點(diǎn)
用si記錄對第i個(gè)節(jié)點(diǎn)執(zhí)行dump算法的返回值;
If是第一個(gè)節(jié)點(diǎn)且類型為JJTDIRELELCONTENT取下一個(gè)節(jié)點(diǎn),對它執(zhí)行dump算法;設(shè)置該節(jié)點(diǎn)屬性值為"</" +sl+" >",返回該值;
Else當(dāng)前節(jié)點(diǎn)屬性值為sl,返回該屬性值;算法8FLWOR算法
輸入當(dāng)前節(jié)點(diǎn) 輸出FLWOR查詢語句For FLWOR的每個(gè)子節(jié)點(diǎn)
對每個(gè)子節(jié)點(diǎn)執(zhí)行dump算法;
If子節(jié)點(diǎn)類型為JJTFORCLAUSE,設(shè)置FLWOR節(jié)點(diǎn)數(shù)據(jù)源類型為該節(jié)點(diǎn)數(shù)據(jù)源類型
If達(dá)到FLWOR的最后一個(gè)子節(jié)點(diǎn),將return片段加入,使FLWOR子?xùn)嗽兺暾?,根?jù)數(shù)據(jù)源類型傳遞給相應(yīng)的包裝器;算法9OTHER算法輸入當(dāng)前節(jié)點(diǎn) 輸出FLOWR語句片段For當(dāng)前節(jié)點(diǎn)的每個(gè)子節(jié)點(diǎn)
對第i個(gè)節(jié)點(diǎn)執(zhí)行dump算法,用si記錄返回值;
用s2記錄第i個(gè)節(jié)點(diǎn)的n—value;
If(第i個(gè)節(jié)點(diǎn)的類型為JJTFUNCTIONCALL)
將當(dāng)前節(jié)點(diǎn)的n—value設(shè)置為s2;,將當(dāng)前節(jié)點(diǎn)的e—value設(shè)置為si;
Else將當(dāng)前節(jié)點(diǎn)的e一value設(shè)置為si;Return si;
模塊五結(jié)果處理模塊
設(shè)計(jì)為兩部分中間子?xùn)嗽兘Y(jié)果的緩存和最終査詢結(jié)果的傳遞。
設(shè)計(jì)中間結(jié)果存儲(chǔ)在MAP (變量名,resultsequence)中,若底層數(shù)據(jù)源是XML文件,其査詢結(jié)果是resultsequence類的實(shí)例,則可以直接存在MAP中。若子查詢查是是關(guān)系型數(shù)據(jù)源,經(jīng)過SQL查詢后,結(jié)果是resultset類的實(shí)例,應(yīng)該將resultset設(shè)置為resultsequence的一個(gè)私有屬性,仍以(變量名,resultsequence)形式存儲(chǔ)在MAP中。若為嵌套査詢,則內(nèi)層?xùn)嗽冎袝?huì)用的外層查詢中出現(xiàn)的變量,可以通過模塊一和模塊五中的MAP獲得外層查詢結(jié)果。
11最終查詢結(jié)果要構(gòu)造成如下XML形式返還用戶<resultsequence><usernamrtoken><us6rnamc><password></usemametoken><result></result></resultsequence>
將最終查詢結(jié)果存放在々esult〉中,其中〈usemamrtoken〉用于驗(yàn)證用戶信息,是通過用戶提交的HttpServletRequest中的用戶信息中提取出來的。
本發(fā)明的查詢引擎系統(tǒng)的上述四個(gè)模塊組成中介器,是本發(fā)明的重點(diǎn),在該中介器中,詞法分析模塊接收全局XQuery語句作為輸入,輸出帶有屬性的令牌(tokens)到語法分析模塊,語法分析模塊輸出抽象語法樹到正規(guī)化模塊,該模塊輸出的是形式良好的語法樹,經(jīng)過査詢分解模塊分解為針對每類數(shù)據(jù)源的子查詢,傳給相應(yīng)的包裝器進(jìn)行底層數(shù)據(jù)源查詢,查詢結(jié)果經(jīng)由由包裝器處理為XML格式后傳遞給結(jié)果處理模塊,經(jīng)該模塊將最終查詢結(jié)果返回給用戶。
本專利實(shí)現(xiàn)了以XML作為公共數(shù)據(jù)模型,XQuery作為全局查詢語言的數(shù)據(jù)集成平臺(tái)中多數(shù)據(jù)源查詢引擎,能將符合上述XQuery語法標(biāo)準(zhǔn)的,非嵌套的XQuery語句分解為針對每個(gè)數(shù)據(jù)源的子?xùn)嗽?,調(diào)用包裝器,接收包裝器返回結(jié)果并緩存,重構(gòu)最終結(jié)果傳遞給用戶。
權(quán)利要求
1.一種基于XQuery的查詢引擎系統(tǒng),該系統(tǒng)包括中介器和包裝器,其中,中介器包括五個(gè)模塊,即詞法分析模塊,用于將XQuery語句分割為攜帶屬性的令牌(tokens);語法分析模塊,用于將令牌(tokens)組織為抽象語法樹;正規(guī)化模塊,用于對語法樹進(jìn)行整理,以產(chǎn)生形式良好的語法樹;查詢分解模塊,用于遍歷該語法樹,產(chǎn)生針對底層數(shù)據(jù)源的子查詢,調(diào)用相應(yīng)的包裝器;結(jié)果處理模塊接收包裝器返回的查詢結(jié)果,將中間結(jié)果以resultsequence類型的格式緩存在MAP中,以XML形式構(gòu)建最終的查詢結(jié)果返回給用戶;包裝器包括XML數(shù)據(jù)源包裝器、關(guān)系型數(shù)據(jù)源包裝器;包裝器接收中介器傳來的針對每個(gè)數(shù)據(jù)源的XQuery子查詢,將其轉(zhuǎn)變?yōu)閿?shù)據(jù)源能夠支持的查詢語句進(jìn)行底層數(shù)據(jù)源查詢,將查詢結(jié)果構(gòu)造成XML形式返還給結(jié)果處理模塊。
2. 如權(quán)利要求1所述的基于XQuery的査詢引擎系統(tǒng),其特征在于,所述詞法分析模塊,包括以下操作在XQStaticContext中加入記錄變量信息的MAP,每出現(xiàn)一個(gè)變量,通過XQStaticContext中的MAP査找該變量類型是否出現(xiàn)過,若出現(xiàn)過,用已存在的變量名替代新出現(xiàn)的變量名,若該變量名未出現(xiàn)過,則將該變量名及變量類型信息存入變量MAP。
3. 如權(quán)利要求1所述的基于XQuery的查詢引擎系統(tǒng),其特征在于,所述語法分析模塊,包括以下操作-借助語法樹構(gòu)造工具JJTree,完成將詞法分析后的令牌tokens依照規(guī)定的XQuery語法規(guī)范組織成一棵抽象語法樹。
4. 如權(quán)利要求1所述的基于XQuery的查詢引擎系統(tǒng),其特征在于,所述正規(guī)化模塊,包括以下操作-在XQuery語句中每遇到For或Let子句,就重新構(gòu)造一個(gè)FLWOR語句嵌套在當(dāng)前FLWOR語句的return子句內(nèi),將遇到的For或Let子句提取出來作為新構(gòu)造的FLWOR語句的For或Let子句。
5. 如權(quán)利要求1所述的基于XQuery的査詢引擎系統(tǒng),其特征在于,所述查詢分解模塊,包括以下操作將當(dāng)前節(jié)點(diǎn)指針指向根節(jié)點(diǎn),由根向下深度優(yōu)先遍歷語法樹,判斷當(dāng)前節(jié)點(diǎn)是否為葉子節(jié)點(diǎn),若為葉子節(jié)點(diǎn),直接取出屬性值,返回父節(jié)點(diǎn)即可,否則,判斷當(dāng)前節(jié)點(diǎn)是否有未遍歷的子節(jié)點(diǎn),若有,當(dāng)前節(jié)點(diǎn)指針指向第一個(gè)未遍歷的子節(jié)點(diǎn),根據(jù)當(dāng)前節(jié)點(diǎn)類型執(zhí)行dump算法,遍歷以該子節(jié)點(diǎn)為根的子樹,否則根據(jù)當(dāng)前節(jié)點(diǎn)類型構(gòu)造FLWOR語句片段,返回父節(jié)點(diǎn),若父節(jié)點(diǎn)為空,表明整棵語法樹處理完成,操作結(jié)束。
6. 如權(quán)利要求1所述的基于XQuery的查詢引擎系統(tǒng),其特征在于,所述XML數(shù)據(jù)源包裝器,包括以下操作接收中介器傳遞過來的針對XML數(shù)據(jù)源的XQuery子?xùn)嗽儯瑢ML數(shù)據(jù)源進(jìn)行査詢,將査詢結(jié)果直接傳遞給結(jié)果處理模塊。
7.如權(quán)利要求1所述的基于XQuery的査詢引擎系統(tǒng),其特征在于,所述關(guān)系型數(shù)據(jù)源包裝器,包括以下操作接收包裝器傳遞過來的針對關(guān)系型數(shù)據(jù)源的XQuery子查詢,將其轉(zhuǎn)換為等價(jià)的SQL語句查詢關(guān)系型數(shù)據(jù)源,將查詢結(jié)果構(gòu)建成XML格式傳給結(jié)果處理模塊。
全文摘要
本發(fā)明公開了一種基于XQuery的查詢引擎系統(tǒng),包括中介器和包裝器,中介器包括詞法分析模塊,將XQuery語句分割為攜帶屬性的令牌;語法分析模塊,依據(jù)XQuery語法規(guī)范將令牌組織為抽象語法樹;正規(guī)化模塊,對語法樹進(jìn)行整理,產(chǎn)生形式良好的語法樹;查詢分解模塊,遍歷語法樹,產(chǎn)生針對底層數(shù)據(jù)源的子查詢,調(diào)用相應(yīng)包裝器;結(jié)果處理模塊接收包裝器傳來的查詢結(jié)果,并以XML形式將查詢結(jié)果返回用戶。包裝器包括關(guān)系型數(shù)據(jù)源包裝器和XML數(shù)據(jù)源包裝器,接收中介器傳來的XQuery子查詢,轉(zhuǎn)換為數(shù)據(jù)源支持的查詢語言進(jìn)行底層數(shù)據(jù)源查詢,最終結(jié)果重構(gòu)為XML格式傳給結(jié)果處理模塊。本發(fā)明提高了查詢效率,對抽象語法樹的正規(guī)化使得構(gòu)造出的查詢子句結(jié)構(gòu)良好,可讀性增強(qiáng)。
文檔編號G06F17/30GK101667190SQ200910070718
公開日2010年3月10日 申請日期2009年9月29日 優(yōu)先權(quán)日2009年9月29日
發(fā)明者馮志勇, 超 劉, 李柳青, 陳世展 申請人:天津大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會(huì)獲得點(diǎn)贊!
1