摘要:針對(duì)目前XML數(shù)據(jù)流處理中通常采用的查詢(xún)語(yǔ)言XPath和XQuery均不支持空間運(yùn)算,無(wú)法應(yīng)用到空間數(shù)據(jù)流處理技術(shù)中的問(wèn)題,設(shè)計(jì)了一種通過(guò)擴(kuò)展現(xiàn)有商業(yè)化XQuery引擎功能基礎(chǔ)上的空間數(shù)據(jù)流檢索方法。
關(guān)鍵詞:可擴(kuò)展標(biāo)記語(yǔ)言數(shù)據(jù)流; XQuery;空間數(shù)據(jù)
中圖分類(lèi)號(hào):TP311文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1001-3695(2007)12-0072-02
隨著Web應(yīng)用中數(shù)據(jù)交換越來(lái)越頻繁,產(chǎn)生了大量不間斷的數(shù)據(jù)流。由于XML已經(jīng)成為Internet環(huán)境中數(shù)據(jù)表示和交換的標(biāo)準(zhǔn),數(shù)據(jù)流大量以XML格式表現(xiàn)。如何從不間斷的XML數(shù)據(jù)流中匹配、抽取和轉(zhuǎn)換部分?jǐn)?shù)據(jù)流以滿(mǎn)足商務(wù)應(yīng)用的需求成為當(dāng)前國(guó)際數(shù)據(jù)庫(kù)領(lǐng)域的一個(gè)研究熱點(diǎn)。目前針對(duì)XML數(shù)據(jù)流的處理研究有很多,但研究的對(duì)象均是普遍意義上的XML數(shù)據(jù)流,對(duì)于以XML格式表現(xiàn)的空間信息及查詢(xún)中需要空間關(guān)系運(yùn)算的數(shù)據(jù)流處理研究較少。研究如何在目前的XML數(shù)據(jù)流處理中支持空間運(yùn)算有著重要意義。
1存在的問(wèn)題
在目前針對(duì)XML數(shù)據(jù)流的研究中,其基本思想都是將用XPath表示的查詢(xún)表達(dá)式轉(zhuǎn)換為狀態(tài)樹(shù)型自動(dòng)機(jī),處理程序以流的方式接收并處理XML 文檔,看其滿(mǎn)足哪一個(gè)狀態(tài)節(jié)點(diǎn)的要求以觸發(fā)查詢(xún)匹配操作。如果滿(mǎn)足所有狀態(tài)節(jié)點(diǎn)的要求,則向用戶(hù)返回相關(guān)的文檔或結(jié)果[1]。由于XPath表達(dá)復(fù)雜查詢(xún)的局限性,W3C制定了專(zhuān)門(mén)針對(duì)XML的查詢(xún)語(yǔ)言規(guī)范XQuery。XQuery 語(yǔ)言的核心是XPath 和FLWOR(for、let、where、order by和return) 表達(dá)式,復(fù)雜的XQuery查詢(xún)語(yǔ)句很難用合適的狀態(tài)機(jī)來(lái)表達(dá)。將XQuery直接改造成XML數(shù)據(jù)流的查詢(xún)語(yǔ)言也引出了大量研究[2~5]。目前標(biāo)準(zhǔn)的XPath和XQuery規(guī)范均不支持空間數(shù)據(jù)類(lèi)型及空間運(yùn)算,且空間分析功能算法復(fù)雜。通過(guò)這些規(guī)范自身的數(shù)據(jù)類(lèi)型定義和基本函數(shù)庫(kù)來(lái)實(shí)現(xiàn)復(fù)雜空間數(shù)據(jù)類(lèi)型以及空間分析功能的擴(kuò)展很困難,使得這些研究很難應(yīng)用到包含空間運(yùn)算的數(shù)據(jù)流查詢(xún)中。要在XML數(shù)據(jù)流查詢(xún)中支持空間運(yùn)算,需要先擴(kuò)展XQuery規(guī)范以支持空間數(shù)據(jù)操作函數(shù)。自定義實(shí)現(xiàn)支持空間運(yùn)算的XQuery引擎是理想的方法。文獻(xiàn)[6,7]中已提出了直接擴(kuò)展XQuery以支持空間功能的方法。但自定義實(shí)現(xiàn)XQuery引擎需要完整的詞法分析、語(yǔ)法分析、查詢(xún)規(guī)范化以及翻譯執(zhí)行等,使得這些方法均停留在理論階段,很難實(shí)際應(yīng)用。
針對(duì)這些問(wèn)題,本文設(shè)計(jì)了一種在商業(yè)化引擎基礎(chǔ)上擴(kuò)展XQuery空間功能的方法,然后以事件流處理方式接收XML文檔以實(shí)現(xiàn)空間數(shù)據(jù)流查詢(xún)的方法。
2XQuery引擎空間功能的擴(kuò)展
擴(kuò)展XQuery引擎以支持空間運(yùn)算,除了自定義實(shí)現(xiàn)支持空間運(yùn)算的XQuery引擎方法外,還可以利用現(xiàn)有的XQuery引擎進(jìn)行擴(kuò)展。目前的商業(yè)化XQuery引擎均提供使用外部函數(shù)的功能擴(kuò)展方法,如目前知名的商業(yè)化XQuery引擎Saxon提供的功能擴(kuò)展機(jī)制可以允許在XQuery查詢(xún)語(yǔ)句中調(diào)用Java或.NET方法作為外部函數(shù)。其使用方法簡(jiǎn)單,只需要在XQuery查詢(xún)語(yǔ)句中聲明外部函數(shù)所在的名稱(chēng)空間就可以調(diào)用外部方法。這為XQuery引擎實(shí)現(xiàn)包括空間分析的查詢(xún)提供了便捷的途徑。
2.1空間數(shù)據(jù)類(lèi)型的表達(dá)方法
采取調(diào)用外部方法來(lái)擴(kuò)展XQuery引擎的功能,不可避免地會(huì)產(chǎn)生空間數(shù)據(jù)作為參數(shù)傳遞的問(wèn)題。以采用Java語(yǔ)言實(shí)現(xiàn)擴(kuò)展方法為例。雖然容易用Java對(duì)象表達(dá)各種空間數(shù)據(jù)類(lèi)型,但由于XQuery引擎規(guī)范本身不支持直接以Java對(duì)象表達(dá)的空間數(shù)據(jù)類(lèi)型,為了使XQuery語(yǔ)句中支持空間數(shù)據(jù)類(lèi)型并能夠使空間數(shù)據(jù)在Java類(lèi)和XQuery引擎中傳遞,需要找到一種合適的空間數(shù)據(jù)表達(dá)方法。
GML是一個(gè)用XML schema描述的XML語(yǔ)法,用來(lái)進(jìn)行空間和非空間的地理信息建模、傳輸和存儲(chǔ)。GML已成為Web應(yīng)用中所接受并容易理解的一種空間信息的交換格式。由于GML文檔本身也是一個(gè)XML文檔,可以用DOM對(duì)象document來(lái)表達(dá),在Saxon的XQuery實(shí)現(xiàn)中能夠支持DOM對(duì)象的傳遞,采用GML表達(dá)空間數(shù)據(jù)以支持空間數(shù)據(jù)在XQuery引擎與外部Java類(lèi)之間的傳遞成為自然的選擇。將GML在XQuery引擎與外部方法之間進(jìn)行傳遞,需要引入GML的schema描述。在GML規(guī)范中,feature.xsd定義了抽象地理特征模型,geometry.xsd定義了具體的幾何形狀信息,提供了點(diǎn)(point)、線(xiàn)(line)、多邊形(polygon)、點(diǎn)集(multipoint)、線(xiàn)集(multiline)和多邊形集(multipolygon)等基本幾何圖形以及復(fù)合類(lèi)型(complex type)的幾何圖形。在本方法中只用到了空間數(shù)據(jù)類(lèi)型的幾何定義,所以引入geometry.xsd即可。在XQuery語(yǔ)句中定義如下:
import schema namespace GML=\"http://schemas.opengis.net/gml/\"
at\" geometry.xsd\";
引入GML的schema后,可以將GML進(jìn)行描述的空間變量定義為schema限制的element變量作為參數(shù)進(jìn)行傳遞,定義如下:
Let$p=doc(′test.xml′)/schema-element(GML:linestring)
2.2空間功能的擴(kuò)展
定義了空間數(shù)據(jù)的表達(dá)方式后,對(duì)空間運(yùn)算功能的實(shí)現(xiàn)在外部方法中進(jìn)行。參照文獻(xiàn)[6]中定義的空間方法,本文定義了SPATIAL類(lèi)封裝,實(shí)現(xiàn)了部分空間方法。由于Saxon的XQuery 實(shí)現(xiàn)中,支持對(duì)Java類(lèi)的靜態(tài)方法調(diào)用以及實(shí)例化對(duì)象方法調(diào)用,但對(duì)于需要實(shí)例化對(duì)象的方法調(diào)用相對(duì)復(fù)雜。為了方便調(diào)用,所有空間方法均定義為SPATIAL類(lèi)的靜態(tài)成員方法。定義如下:
public class SPATIAL{
public static boolean WithIn(Document a, Document b){…}
public static boolean Toughes(Document a, Document b){…}
public static boolean Crosses(Document a, Document b){…}
……}
實(shí)現(xiàn)了上述定義空間方法后,通過(guò)該類(lèi)就可以擴(kuò)展Saxon的XQuery引擎。擴(kuò)展方法很簡(jiǎn)單,只需在XQuery語(yǔ)句中聲明該空間類(lèi)的名稱(chēng)空間,在查詢(xún)語(yǔ)句中需要空間運(yùn)算的地方調(diào)用該類(lèi)的各種方法即可。比如要使用空間包含的方法,先聲明名稱(chēng)空間:declare namespace SPATIAL=“java:myclass.SPATIAL”;然后只需在調(diào)用方法前加入名稱(chēng)空間即可,如SPATIAL:Disjoin(…)。
另外需要注意的是,如果擴(kuò)展的方法返回值不是簡(jiǎn)單數(shù)據(jù)類(lèi)型則需要進(jìn)一步處理。本文方法只是返回空間的包含相交等關(guān)系是否為真,是簡(jiǎn)單的布爾類(lèi)型,不需要進(jìn)一步處理。
3基于擴(kuò)展引擎的空間數(shù)據(jù)流查詢(xún)方法
擴(kuò)展后的XQuery引擎可以處理帶有空間信息的XML文檔。但由于目前的XQuery引擎通常被設(shè)計(jì)來(lái)處理在內(nèi)存中裝配好的源XML文檔,對(duì)于動(dòng)態(tài)的數(shù)據(jù)流而言無(wú)法直接處理。為了能夠?qū)臻g數(shù)據(jù)流進(jìn)行處理,還需要借助SAX(simple API for XML)之類(lèi)基于事件的XML解析程序輔助處理,以避免在采取操作之前需要存儲(chǔ)文檔的所有內(nèi)容。
SAX是事件驅(qū)動(dòng)的XML處理器,允許正在讀取XML文檔時(shí)處理該文檔。文檔的讀入過(guò)程也就是SAX的解析過(guò)程。其觸發(fā)的事件主要包括:startDocument表示文檔開(kāi)始;endDocument表示文檔結(jié)束; startElement表示元素開(kāi)始;endElement表示元素結(jié)束;characters表示字符數(shù)據(jù)。將SAX與Saxon組合處理以XML格式表達(dá)空間數(shù)據(jù)流時(shí),需要在相應(yīng)的事件處理程序中調(diào)用XQuery查詢(xún)語(yǔ)句。以一簡(jiǎn)單的物流監(jiān)控為例,監(jiān)控中心希望監(jiān)控車(chē)輛在某指定時(shí)段內(nèi)的指定區(qū)域的行駛是否符合預(yù)設(shè)路線(xiàn)。假設(shè)車(chē)輛每隔5 min將該時(shí)段內(nèi)的行駛軌跡及狀態(tài)信息以XML文檔格式形成不間斷的數(shù)據(jù)流發(fā)送給監(jiān)控中心。其數(shù)據(jù)格式DTD定義如下:
〈xsd: complexType name=\"DTStateHistory\"〉
〈xsd:element name=ID type=\"xsd:Integer\"〉
〈xsd:sequence〉
〈xsd:element name=\"StateUnit\" type=\"DTstateUnit\"minOccurs=
\"1\" maxOccurs=\"unbounded\"/〉
〈/ xsd:sequence〉
〈/xsd complexType〉
〈xsd: complexType name=\"DTStateUnit\"〉
〈xsd:elementname=\"Time\" type=\"xsd:Date\" /〉
〈xsd:element name=\"Position\" type=\"GML:Point\" /〉
…(其他必要屬性信息)
〈/xsd complexType〉
用SAX和Saxon組合處理該數(shù)據(jù)流,當(dāng)數(shù)據(jù)流不斷到達(dá)時(shí),SAX處理程序監(jiān)聽(tīng)數(shù)據(jù)流并觸發(fā)相應(yīng)的事件。在元素DTStateHistory的endElement事件到達(dá)時(shí),將該段數(shù)據(jù)流轉(zhuǎn)換為XML文檔存入內(nèi)存,以DOM數(shù)據(jù)類(lèi)型表示作為Saxon引擎的數(shù)據(jù)源,由Saxon引擎執(zhí)行預(yù)先設(shè)定的查詢(xún)語(yǔ)句。查詢(xún)的XQuery語(yǔ)句如下:
declare namespace SPATIAL=\"java:myclass.SPATIAL\"
declare variable $Route as GML: MultiLineString external
for $StateUnit in datasource(\"cachedatastream\")/DTStateHistory//StateUnit
let $p=$StateUnit/schema-element(GML:point)
where fn:timeWithin($StateUnit/Time, Duration) and SPATIAL:Disjoin($p, $Route)
return 〈alerttime〉{$StateUnit/Time}〈/alerttime〉
〈alertPosition〉{$p}〈/alertPosition〉
該查詢(xún)語(yǔ)句檢索存放在緩存中的XML文檔,并將位置信息封裝到一個(gè)element作為參數(shù)與設(shè)定的路徑進(jìn)行匹配。匹配工作由外部的SPATIAL類(lèi)的Disjoin方法完成。如果該點(diǎn)不在預(yù)訂路線(xiàn)上則返回該點(diǎn)的時(shí)間和位置信息到新的XML文檔。隨著事件的不斷觸發(fā),程序不斷緩存數(shù)據(jù)并調(diào)用該語(yǔ)句進(jìn)行處理,實(shí)現(xiàn)對(duì)數(shù)據(jù)流的處理。
4結(jié)束語(yǔ)
本文研究了一種處理XML空間數(shù)據(jù)流的方法。該方法通過(guò)先擴(kuò)展XQuery引擎的空間運(yùn)算功能,然后結(jié)合XML流式處理方法對(duì)空間數(shù)據(jù)流進(jìn)行處理,為空間數(shù)據(jù)流的查詢(xún)和檢索提供了一種簡(jiǎn)便的途徑。在今后的工作中將擴(kuò)展數(shù)據(jù)關(guān)聯(lián)分析及趨勢(shì)分析等數(shù)據(jù)挖掘等功能,結(jié)合XML數(shù)據(jù)流挖掘技術(shù)的研究,研究基于XQuery的空間數(shù)據(jù)流挖掘方法。
參考文獻(xiàn):
[1]高軍,楊冬青,唐世渭,等.基于樹(shù)自動(dòng)機(jī)的XPath在XML數(shù)據(jù)流上的高效執(zhí)行[J].軟件學(xué)報(bào),2005,16(2):223-232.
[2]KOCH C, SCHERZINGER S, SCHWEIKARDT N, et al. Schema-based scheduling of event processors and buffer minimization for queries on structured data stream[C]//Proc of the30th VLDB Conference. Toronto:Eprint arXiv, 2004:228-239.
[3]FEGARAS L. The joy of SAX[C]//Proc of the 1st International Workshop on XQuery Implementation, Experience, and Perspectives. Paris:Maison de al Chimie,2004:61-66.
[4]LI Xiao-gang, AGRAWAL G. Efficient evaluation of XQuery over streaming data[C]//Proc of the 31st VLDB Conference. Trondheim, Norway:[s.n.], 2005:265-276.
[5]BOSE S, FEGARAS L. Data stream management for historical XML data[C]//Proc of SIGMOD. New York:ACM Press,2004:239-250.
[6]GUAN Ji-h(huán)ong. GQL: extending XQuery to query GML documents[J].Geospatial Information Science,2006,9(2):118-126.
[7]楊穎,韓忠明,楊磊. 數(shù)據(jù)流的核心技術(shù)與應(yīng)用發(fā)展研究綜述[J].計(jì)算機(jī)應(yīng)用研究,2005,22(11):4-7.
[8]CHUNG W. An extension of XQuery for moving objects over GML[C]//Proc ofInternational Conference on Information Technology: Coding and Computing. Las Vegas:IEEE Computer Society,2004:142-147.
[9]Writing extension functions in Java, Saxon documentation[EB/OL].[2006].http://www.saxonica.com/documentation/extensibility/functions.html.
[10]RUSSELL G. TypEx:a type based approach to XML stream querying[C]//Proc of International Workshop on the Web and Databases (WebDB).UK:ACM SIGMOD,2003:55-60.
[11]於荔,鮑培明,張書(shū)亮.GML空間數(shù)據(jù)的對(duì)象化存儲(chǔ)研究[J].南京師范大學(xué)學(xué)報(bào):工程技術(shù)版,2006:6(1):67-71.
[12]蘭小機(jī),閭國(guó)年,劉德兒,等.基于XQuery的GML查詢(xún)語(yǔ)言研究[J].測(cè)繪科學(xué),2005,30(6):99-102.
“本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文”