申請(qǐng)免費(fèi)試用、咨詢(xún)電話:400-8352-114
AMTeam.org
知識(shí)管理的基本XML和RDF技術(shù)(六):使用Versa的RDF查詢(xún)
Uche Ogbuji(uche.ogbuji@fourthought.com)
首席顧問(wèn),F(xiàn)ourthought, Inc.
2002 年 4 月
Uche Ogbuji 繼續(xù)討論一種 RDF 查詢(xún)語(yǔ)言,該語(yǔ)言比他迄今為止所討論的基本 API
要更為復(fù)雜得多。它是下幾篇問(wèn)題跟蹤器專(zhuān)欄文章中要建立的中間件的基礎(chǔ)。
到現(xiàn)在為止,在對(duì)人們可能怎樣使用和查詢(xún)問(wèn)題跟蹤器 RDF
元數(shù)據(jù)的簡(jiǎn)短討論中,我們使用了簡(jiǎn)單而基本的查詢(xún)
API?,F(xiàn)在我們轉(zhuǎn)向一種更為強(qiáng)大的查詢(xún)語(yǔ)言。這將有助于編寫(xiě)更清晰的中間件代碼,也將提供合并巨型模型(比如好幾篇專(zhuān)欄文章以前所演示的 WordNet
模型)所需的性能。
Versa:RDF 查詢(xún)語(yǔ)言
Versa 是一種開(kāi)放 RDF
查詢(xún)語(yǔ)言,它基于開(kāi)發(fā)人員對(duì)能夠在其它應(yīng)用程序中使用的 RDF 工具這種典型的需要。它是一種不僅僅具有 RDF 世界觀的產(chǎn)品。Versa 著重于 RDF
模型的節(jié)點(diǎn)和圓弧而不是將其看作三元部分的集合。它提供核心數(shù)據(jù)模型以及一組非常豐富的用于靈活查詢(xún)的函數(shù)和原語(yǔ)。因?yàn)?Versa 大量使用函數(shù),它有時(shí)給人一種類(lèi)
LISP 的感覺(jué)。Versa 也提供如完全的布爾邏輯和集合運(yùn)算、傳遞運(yùn)算、聚合、子串匹配以及其它核心數(shù)據(jù)類(lèi)型操作之類(lèi)的功能,許多其它 RDF
查詢(xún)系統(tǒng)都不具有這些功能。我是最初的 Versa 規(guī)范的作者之一。
Versa 的核心是匹配模型圖中模式的遍歷表達(dá)式。下面是遍歷表達(dá)式的一個(gè)示例。
all() - rdf:type -> *
all() 函數(shù)返回模型中所有資源的集合。根據(jù) RDF
模型的約定畫(huà)法,這意味著它返回所有的橢圓和圓弧(但不返回矩形)。- 和 ->
記號(hào)形成遍歷運(yùn)算符,它表示您希望沿著來(lái)自每個(gè)資源的特定圓弧遍歷。在這個(gè)例子中,該圓弧是 rdf:type。*
表示您想要該遍歷的所有端點(diǎn)。實(shí)際上,該遍歷表達(dá)式返回具有 rdf:type 謂詞的所有語(yǔ)句的對(duì)象。
作為一個(gè)示例,讓我們來(lái)看前一篇專(zhuān)欄文章中的樣本 RDF 問(wèn)題跟蹤器實(shí)例,下面的清單 1 重復(fù)了該實(shí)例。
清單 1:
http://www.w3.org/1999/02/22-rdf-syntax-ns#">
http://www.w3.org/2000/01/rdf-schema#">
http://www.daml.org/2001/03/daml+oil#">
http://purl.org/dc/elements/1.1/">
http://xmlns.com/foaf/0.1/">
DESIGNTIMESP="19516">DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="19516">DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="19516">DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="19516">DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="19516">DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="19516">DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="4657">DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
DESIGNTIMESP="18513">http://rdfinference.org/schemata/issue-tracker/">
http://rdfinference.org/ril/issue-tracker/">
]>
xmlns:rdf="&rdf;"
xmlns:rdfs="&rdfs;"
xmlns:daml="&daml;"
xmlns:rit="&rit;"
xmlns:it="⁢"
xmlns:dc="&dc;"
xmlns:foaf="&foaf;"
xmlns="⁢"
>
Unnecessary
abbreviation
Is the abbreviation of
rdf:type predicates needed?
2001-03-04
The abbreviation in listing 8 doesn't seem
needed.
Organize a vote on this topic
Inconsistent
versioning
RIL versioning is
unclear (mix of 0.1, 0/1, 0.2 and 0/2)
2001-04-20
Correct all to use the
"0/1" form in the next draft.
Alexandre
Fayolle
Uche Ogbuji
Nicolas
Chauvat
如果我們對(duì)該模型運(yùn)行這一查詢(xún),我們將得到一列資源(因?yàn)?rdf:type
語(yǔ)句的對(duì)象是資源)。如果我們正在使用一個(gè)可以有文字和資源對(duì)象的謂詞,結(jié)果將是一列文字和資源。要使用 4Suite 測(cè)試它(有關(guān) 4Suite
的詳細(xì)信息,請(qǐng)參閱以前的專(zhuān)欄文章),可以將清單 1 復(fù)制到文件 issues.rdf,然后在命令行中執(zhí)行用紅色突出顯示的命令:
$4versa --rdf-file=issues.rdf "all() - rdf:type -> *"
:::
Using cDomlette
Executing Query:
all() - rdf:type -> *
With
nsMapping of:
vtrav --> http://rdfinference.org/versa/0/2/traverse/
xml --> http://www.w3.org/XML/1998/namespace
vsort
--> http://rdfinference.org/versa/0/2/sort/
rdfs
--> http://www.w3.org/2000/01/rdf-schema#
rit
--> http://rdfinference.org/schemata/issue-tracker/
it --> http://rdfinference.org/schemata/issue-tracker/
rdf --> http://www.w3.org/1999/02/22-rdf-syntax-ns#
foaf --> http://xmlns.com/foaf/0.1/
versa -->
http://rdfinference.org/versa/0/2/
None -->
http://rdfinference.org/schemata/issue-tracker/
daml --> http://www.daml.org/2001/03/daml+oil#
http://rdfinference.org/schemata/issue-tracker/Issue/
http://rdfinference.org/schemata/issue-tracker/Issue
以簡(jiǎn)單 XML 形式表示的產(chǎn)生的資源列表是用粗體顯示的。該命令的其它輸出只是為您提供一些信息。它回顯正在被執(zhí)行的 Versa
查詢(xún),并顯示引擎知道的名稱(chēng)空間聲明。為了方便用戶,4versa 自動(dòng)抓取源文件根元素內(nèi)的所有名稱(chēng)空間聲明。
細(xì)述遍歷
通常,遍歷表達(dá)式的格式如下:
list-expression - list-expression ->
boolean-expression
列表表達(dá)式是返回一列資源或可以被轉(zhuǎn)換成一列資源的結(jié)果的任何表達(dá)式。因此,任何返回單個(gè)資源(rdf:type)的表達(dá)式都會(huì)被轉(zhuǎn)換成具有單個(gè)輸入項(xiàng)的列表類(lèi)型。您已經(jīng)看到過(guò)縮寫(xiě)成如
rdf:type 的形式和稱(chēng)為限定名稱(chēng)(或 QNames)形式的 RDF URI。通過(guò)將第一部分?jǐn)U展成 URI 庫(kù)(例如 rdf 變成 http://www.w3.org/1999/02/22-rdf-syntax-ns#)然后同第二部分連接,將它們轉(zhuǎn)換成完整的 URI。這樣,rdf:type 就變成了 http://www.w3.org/1999/02/22-rdf-syntax-ns#type。Versa 也允許您以完整、冗長(zhǎng)和詳細(xì)地方式拼寫(xiě)出 URI,這意味著您可以直接編寫(xiě) @"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"。例如:
all() - @"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
-> *
遍歷表達(dá)式的第三部分是布爾表達(dá)式。我已經(jīng)向您演示了如何使用 *
選擇所有對(duì)象。您也可以對(duì)結(jié)果做更多的選擇。例如,要獲取模型中資源的所有日期特性,您可以使用:
all() - dc:date -> *
它產(chǎn)生:
2001-03-04
2001-04-20
要選擇特定日期,您可以編寫(xiě):
all() - dc:date -> eq("2001-04-20")
eq 函數(shù)將參數(shù)同上下文比較,如果它們相同,就返回 true。Versa 中上下文的思想類(lèi)似于 XPath
中上下文的思想,但是更簡(jiǎn)單。在 Versa 中,上下文是一個(gè)在對(duì)表達(dá)式求值時(shí)考慮的單一值??梢允褂命c(diǎn)符號(hào)直接訪問(wèn)上下文。也可以使用 eq
函數(shù)比較兩個(gè)顯式參數(shù),因此上面的內(nèi)容可以按如下編寫(xiě):
all() - dc:date -> eq(., "2001-04-20")
在遍歷表達(dá)式的第三部分中,上下文是第一和第二部分的部分結(jié)果之一。例如,在上面,將每個(gè)對(duì)象都同“2001-04-20”比較,最后的結(jié)果是比較值為
true 的對(duì)象列表,在這個(gè)示例中:
2001-04-20
這一看起來(lái)明顯的查詢(xún)?cè)诖_定某個(gè)特定值是否是模型時(shí)十分有用。例如,如果您在上面的示例中用“2001-03-15”替換“2002-04-20”,那么結(jié)果將是一個(gè)空列表。當(dāng)然您可以使用遍歷表達(dá)式做更多的事情。例如,要檢索三月份所有日期的資源,您可以編寫(xiě):
all() - dc:date -> contains("-03-")
它產(chǎn)生:
2001-03-04
向后遍歷
獲得具有特定日期的資源可能更有用。要做到這一點(diǎn),您需要向后操作,從
dc:date 圓弧所對(duì)應(yīng)的日期到主題資源。Versa 以向后遍歷的形式提供這一操作。例如:
"2001-03-04" <- dc:date - *
返回所有日期為“2001-03-04”的資源:
http://rdfinference.org/ril/issue-tracker/i2001030423
向后遍歷的形式是:
list-expression <- list-expression -
boolean-expression
其工作方式與向前遍歷十分類(lèi)似。這兩種遍歷都可以鏈接,這樣就可以獲取日期為“2001-03-04”的所有資源的標(biāo)題:
("2001-03-04" <- dc:date - *) - dc:title -> *
它產(chǎn)生:
Unnecessary abbreviation
分配財(cái)富
到目前為止,所有查詢(xún)都返回單一值。通常,您可能希望一次返回多個(gè)值。Versa
使用列表操作實(shí)現(xiàn)這一點(diǎn),列表操作運(yùn)行在遍歷表達(dá)式的結(jié)果之上。處理列表的一個(gè)常用函數(shù)是
distribute,它對(duì)列表中的每項(xiàng)使用一個(gè)或多個(gè)表達(dá)式。結(jié)果是列表的一個(gè)列表??梢允褂萌?list(rit:i2001030423,
rit:i2001042003) 這樣的表達(dá)式在 Versa
中直接表達(dá)列表,該表達(dá)式是兩個(gè)資源的列表。下面的表達(dá)式獲得這些問(wèn)題中每個(gè)問(wèn)題的標(biāo)題和日期:
distribute(list(rit:i2001030423,rit:i2001042003),".-dc:title->*",".-dc:date->*")
它產(chǎn)生列表的列表:
Unnecessary abbreviation
2001-03-04
Inconsistent
versioning
2001-04-20
distribute
函數(shù)的第一個(gè)參數(shù)是一個(gè)列表。依次獲取列表中的每一項(xiàng)。第二個(gè)和后續(xù)的參數(shù)為字符串,它們被當(dāng)作子查詢(xún)。使用上下文的當(dāng)前列表項(xiàng)對(duì)它們進(jìn)行動(dòng)態(tài)求值(如同前面所討論的一樣,通過(guò)使用點(diǎn)來(lái)引用)。
可以對(duì)遍歷表達(dá)式的結(jié)果(它們是列表)使用該技術(shù)。再舉最后一個(gè)例子,我將解釋如何使用 Versa 中的一個(gè)特殊快捷函數(shù)。type
函數(shù)檢索給定 RDF 類(lèi)型(就象用 rdf:type 謂詞表達(dá)那樣)的所有資源。要獲取所有已經(jīng)提交問(wèn)題的人的標(biāo)識(shí)和姓名,可以編寫(xiě):
distribute(type(it:Issue)-dc:creator->*,".",".-foaf:name->*")
請(qǐng)注意,您可以在子表達(dá)式中直接使用上下文,而無(wú)須使之成為另一個(gè)表達(dá)式的一部分。結(jié)果是:
mailto:Nicolas.Chauvat@logilab.fr
Nicolas Chauvat
mailto:Alexandre.Fayolle@logilab.fr
Alexandre Fayolle
這里有一個(gè)棘手的細(xì)節(jié)。.-foaf:name->* 子表達(dá)式產(chǎn)生的字符串在列表中,但由 .
子表達(dá)式產(chǎn)生的資源卻不在其中。這是因?yàn)楸闅v操作符總返回列表,即使結(jié)果中只有一個(gè)或沒(méi)有項(xiàng)時(shí)也是如此。由于我們知道在我們的模型中,我們僅僅期望每個(gè)人的資源只有一個(gè)單一名稱(chēng),所以我們無(wú)論如何總是忽略列表的最低一級(jí)。Versa
提供數(shù)據(jù)轉(zhuǎn)換函數(shù),其中之一是 string 函數(shù),它將其參數(shù)轉(zhuǎn)換成字符串。通過(guò)獲取列表的第一(或唯一的)項(xiàng)的字符串值來(lái)轉(zhuǎn)換列表。因此,
distribute(type(it:Issue)-dc:creator->*,".","string(.-foaf:name->*)")
消除了遍歷子表達(dá)式周?chē)臒o(wú)關(guān)列表并產(chǎn)生以下結(jié)果:
mailto:Nicolas.Chauvat@logilab.fr
Nicolas Chauvat
mailto:Alexandre.Fayolle@logilab.fr
Alexandre Fayolle
結(jié)束語(yǔ)
在本文中,我解釋了
Versa 的基礎(chǔ)知識(shí)。如果您掌握了它,那么您立即可以使用它來(lái)高效地工作。Versa
有多得多的功能,但是它們大部分是以專(zhuān)門(mén)的函數(shù)的形式出現(xiàn),通過(guò)使用它們,您將迅速獲得經(jīng)驗(yàn)。參考資料一節(jié)列舉了更多關(guān)于 Versa
的參考資料。在下一篇專(zhuān)欄文章里,我將解釋如何使 Versa 滿足到目前為止在本系列中討論的所有查詢(xún)需要。
參考資料
有關(guān) Versa 的更詳盡的教程,請(qǐng)參閱 Versa by example 文檔。
在 Versa 0.2
規(guī)范草案找到所有關(guān)于 Versa 的詳細(xì)信息。
Dave Beckett 的詳盡的 RDF
參考資料指南包含到其它 RDF 查詢(xún)語(yǔ)言的鏈接。
IBM 提供專(zhuān)業(yè)服務(wù)以幫助組織實(shí)現(xiàn)門(mén)戶網(wǎng)站、知識(shí)和內(nèi)容管理解決方案。
IBM 的知識(shí)管理雜志包括該領(lǐng)域內(nèi)的許多技術(shù)主題。
關(guān)于作者
Uche
Ogbuji 是 Fourthought
Inc. 的顧問(wèn)兼共同創(chuàng)始人,該公司是專(zhuān)為企業(yè)知識(shí)管理提供 XML
解決方案的軟件供應(yīng)商和顧問(wèn)。Fourthought 開(kāi)發(fā)了 4Suite,它是 XML、RDF 和知識(shí)管理應(yīng)用程序的開(kāi)放源碼平臺(tái)。Ogbuji
先生是一位出生于尼日利亞的計(jì)算機(jī)工程師和作家,他現(xiàn)在在美國(guó)科羅拉多州博耳德(Boulder)生活和工作。可以通過(guò) uche.ogbuji@fourthought.com 與 Ogbuji
先生聯(lián)系。 |
瀏覽:知識(shí)管理的基本XML和RDF技術(shù)(一)
知識(shí)管理的基本XML和RDF技術(shù)(二)
知識(shí)管理的基本XML和RDF技術(shù)(三)
知識(shí)管理的基本XML和RDF技術(shù)(四)
知識(shí)管理的基本XML和RDF
技術(shù)(五)
|