欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
用 SPARQL 搜索 RDF 數據2

2005 年 6 月 13 日

隨著(zhù)越來(lái)越多的數據使用類(lèi)似 RSS 的 RDF 格式保存,一種新的需求產(chǎn)生了,即要求用一種簡(jiǎn)單方法查找特定信息。SPARQL 這個(gè)功能強大的新查詢(xún)語(yǔ)言填補了這個(gè)空白,使用戶(hù)可以很容易地在 RDF 的雜草從中找到所需的數據。本文將和您一起查看 SPARQL 的特性,學(xué)習如何利用 Jena 語(yǔ)義 Web 工具包,在自己的 Java 應用程序中使用 SPARQL 查詢(xún)。

資源描述框架(Resource Description Framework),或 RDF,能夠將數據打散并分布開(kāi)來(lái)。RDF 模型可以容易地合并在一起,而且序列化的 RDF 也可以簡(jiǎn)單地通過(guò) HTTP 交換。應用程序可以通過(guò) Web 松散地耦合到多個(gè) RDF 數據源上。例如,在 PlanetRDF.com 上,我們把多個(gè)作者的 weblog 集中起來(lái),作者們在 RSS 1.0 feed 中用 RDF 提供內容。作者 feed 的 URL 本身就放在 RDF 圖中,叫作 bloggers.rdf。

但是怎樣才能在 RDF 圖中發(fā)現并操縱需要的數據呢?SPARQL 協(xié)議和 RDF 查詢(xún)語(yǔ)言(SPARQL)目前是 W3C 的工作草案,還在討論當中。SPARQL 構建在以前的 RDF 查詢(xún)語(yǔ)言(例如 rdfDB、RDQL 和 SeRQL)之上,擁有一些有價(jià)值的新特性。在本文中,我們將用三種驅動(dòng) PlanetRDF 的 RDF 圖 —— 描述作者的 FOAF 圖、他們的 RSS 1.0 feed 以及 bloggers 圖 —— 來(lái)演示 SPARQL 能對數據做的一些有意思的事情。SPARQL 擁有針對各種平臺和語(yǔ)言的實(shí)現;本文將重點(diǎn)介紹面向 Java 平臺的 Jena 語(yǔ)義 Web 工具包。

本文假設您有 RDF 的工作知識,熟悉 RDF 的詞匯(例如 Dublin Core、FOAF 和 RSS 1.0)。此外,本文還假設您有一些使用 Jena 語(yǔ)義 Web 工具包的經(jīng)驗。要想跟上所有這些技術(shù)的發(fā)展速度,請參閱后面 參考資料 部分中的鏈接。

一個(gè)簡(jiǎn)單 SPARQL 查詢(xún)的剖析

我們首先從查看 PlanetRDF 的 bloggers.rdf 模型開(kāi)始。該模型非常簡(jiǎn)單,通過(guò) FOAF 和 Dublin Core 詞匯為每個(gè) blog 投稿者提供名稱(chēng)、blog 標題和 URL。圖 1 顯示了一個(gè)投稿者的基本圖結構。完整的模型只是為我們匯集的每一篇 blog 日志重復這個(gè)結構而已。


圖 1. bloggers.rdf 中的一個(gè)投稿者的基本圖結構

現在,我們來(lái)看一個(gè)針對博客模型的非常簡(jiǎn)單的 SPARQL 查詢(xún)。比方說(shuō)以下這個(gè)查詢(xún)“根據名為 Jon Foobar 的人查找 blog 的 URL”,如清單 1 所示:


清單 1. 查找某一投稿者的 blog 的 URL 的 SPARQL 查詢(xún)
                        PREFIX foaf: <http://xmlns.com/foaf/0.1/>                        SELECT ?url                        FROM 	<bloggers.rdf>                        WHERE  {                        ?contributor foaf:name "Jon Foobar" .                        ?contributor foaf:weblog ?url .                        }                        

查詢(xún)的第一行只是為 FOAF 定義 PREFIX,這樣就不必每次都用完整名稱(chēng)引用它。SELECT 子句指定查詢(xún)應當返回的內容,在這個(gè)例子中,返回的是名為 url 的變量。SPARQL 變量用 ?$作為前綴,這兩個(gè)前綴是可以互換的,但在本文中,我堅持使用 ? 作為前綴。FROM 是一個(gè)可選的子句,它提供了將要使用的數據集的 URI。在這里,它只是指向一個(gè)本地文件,但是它也可以指向 Web 其他地方的某一個(gè)圖的 URL。最后,WHERE 子句由一組三元模式組成,用基于 Turtle 的語(yǔ)法表示。這些三元模式共同構成了所謂的圖形模式。

這個(gè)查詢(xún)試圖把圖形模式的三元模式和模型進(jìn)行匹配。將每個(gè)圖形模式變量的綁定與模型節點(diǎn)進(jìn)行匹配就成為一種查詢(xún)解決方案,而 SELECT 子句中指定的變量值則成為查詢(xún)結果的一部分。

在這個(gè)示例中,WHERE 子句的圖形模式中的第一個(gè)三元組與 foaf:name 屬性為“Jon Foobar”的節點(diǎn)匹配,并把它綁定到名為 contributor 的變量。在 bloggers.rdf 模型中,contributor 會(huì )和 圖 1 頂部的空節點(diǎn) foaf:Agent 匹配。圖形模式的第二個(gè)三元組與 contributorfoaf:weblog 屬性對應的對象匹配。這被綁定到 url 變量,形成查詢(xún)結果。





回頁(yè)首


在 Jena 中使用 SPARQL

支持在 Jena 中使用 SPARQL 目前可以通過(guò)叫作 ARQ 的模塊得以實(shí)現。除了實(shí)現 SPARQL 之外,ARQ 的查詢(xún)引擎還可以解析使用 RDQL 或者它自己內部的查詢(xún)語(yǔ)言表示的查詢(xún)。ARQ 的開(kāi)發(fā)很活躍,但它還不是標準 Jena 發(fā)行版本中的一部分。但是,可以從 Jena 的 CVS 倉庫或者自包含的下載文件中獲得它。

讓 ARQ 運行起來(lái)很簡(jiǎn)單。只需要得到最新的 ARQ 發(fā)行包(要獲得有關(guān)鏈接,請參閱后面 參考資料 部分),然后對其進(jìn)行解壓,把環(huán)境變量 ARQROOT 設置成指向 ARQ 目錄即可??赡苓€需要恢復 ARQ bin 目錄的讀取和執行權限。如果把 bin 目錄添加到執行路徑中非常方便,那是因為它包含從命令行調用 ARQ 的包裝器腳本。為了確定所有設置都已到位,請從命令行調用 sparql,確定看到了它的用法信息。清單 2 演示了所有步驟,清單 2 假設正在 UNIX 類(lèi)的平臺上工作,或者是在 Windows 下用 Cygwin 工作。(ARQ 還附帶了在 Windows 下使用的.bat 腳本,但是它們用法和下面示例中的用法稍有差別。)


清單 2. 設置使用 Jena ARQ 的環(huán)境
                        $ export ARQROOT=~/ARQ-0.9.5                        $ chmod +rx $ARQROOT/bin/*                        $ export PATH=$PATH:$ARQROOT/bin                        $ sparql                        Usage: [--data URL] [exprString | --query file]                        

從命令行執行 SPARQL 查詢(xún)

現在就可以運行 SPARQL 查詢(xún)了(參見(jiàn)清單 3)。我們將使用來(lái)自 清單 1的數據集和查詢(xún)。因為查詢(xún)使用 FROM 關(guān)鍵字指定要使用的圖,所以只需把查詢(xún)文件的位置提供給 sparql 命令行即可。但是,查詢(xún)需要在包含圖的目錄中運行,因為該圖是在查詢(xún)的 FROM 子句中用相對 URL 指定的。


清單 3. 用 sparql 命令執行簡(jiǎn)單查詢(xún)
                        $ sparql --query jon-url.rq                        ----------------------------                        | url                      |                        ============================                        | <http://foobar.xx/blog>  |                        ----------------------------                        

有時(shí),從查詢(xún)中忽略 FROM 子句很有意義。這樣就可以允許在執行查詢(xún)的時(shí)候才把圖傳遞給它。當從應用程序代碼中使用 SPARQL 時(shí),避免把數據集綁定到查詢(xún)是一個(gè)好習慣 —— 例如,它允許把同一查詢(xún)重用在不同的圖上??梢栽诿钚杏?sparql --data URL 選項在運行時(shí)指定圖,其中 URL 是圖的位置。這個(gè) URL 既可以是本地文件的位置,也可以是遠程圖的 Web 地址。

用 Jena API 執行 SPARQL 查詢(xún)

命令行 sparql 工具對于運行獨立查詢(xún)有用,同時(shí) Java 應用程序也可以直接調用 Jena 的 SPARQL 功能。通過(guò) com.hp.hpl.jena.query 包中的類(lèi),使用 Jena 來(lái)創(chuàng )建和執行 SPARQL 查詢(xún)。使用 QueryFactory 是最簡(jiǎn)單的方法。QueryFactory 有各種 create() 方法,用來(lái)從文件或者 String 讀取文本查詢(xún)。這些 create() 方法返回 Query 對象,這個(gè)對象封裝了解析后的查詢(xún)。

下一步是創(chuàng )建 QueryExecution 的實(shí)例,這個(gè)類(lèi)表示查詢(xún)的一個(gè)執行。要獲得 QueryExecution,請調用 QueryExecutionFactory.create(query, model),并傳入要執行的 Query 以及查詢(xún)要處理的 Model。因為查詢(xún)的數據是編程方式提供的,所以查詢(xún)不需要 FROM 子句。

QueryExecution 上有幾種不同的執行方法,每個(gè)方法執行一種不同類(lèi)型的查詢(xún)(請參閱標題為“其他類(lèi)型的 SPARQL 查詢(xún)”的側欄,以獲得更多信息)。對于簡(jiǎn)單的 SELECT 查詢(xún),可以調用 execSelect(),該方法將返回 ResultSet。ResultSet 支持在查詢(xún)返回的每個(gè) QuerySolution 上進(jìn)行迭代,這提供了對每個(gè)綁定變量值的訪(fǎng)問(wèn)。另外,還可以使用 ResultSetFormatter,以不同的格式輸出查詢(xún)結果。

清單 4 顯示了一個(gè)把這些步驟放在一起的簡(jiǎn)單方法。它執行一個(gè)針對 bloggers.rdf 的查詢(xún),并把結果輸出到控制臺。


清間 4.用 Jena API 執行一個(gè)簡(jiǎn)單查詢(xún)
                        // Open the bloggers RDF graph from the filesystem                        InputStream in = new FileInputStream(new File("bloggers.rdf"));                        // Create an empty in-memory model and populate it from the graph                        Model model = ModelFactory.createMemModelMaker().createModel();                        model.read(in,null); // null base URI, since model URIs are absolute                        in.close();                        // Create a new query                        String queryString =                        "PREFIX foaf: <http://xmlns.com/foaf/0.1/> " +                        "SELECT ?url " +                        "WHERE {" +                        "      ?contributor foaf:name \"Jon Foobar\" . " +                        "      ?contributor foaf:weblog ?url . " +                        "      }";                        Query query = QueryFactory.create(queryString);                        // Execute the query and obtain results                        QueryExecution qe = QueryExecutionFactory.create(query, model);                        ResultSet results = qe.execSelect();                        // Output query results                        ResultSetFormatter.out(System.out, results, query);                        // Important - free up resources used running the query                        qe.close();                        





回頁(yè)首


編寫(xiě)更復雜的查詢(xún)

迄今為止,您已經(jīng)看到了兩種運行簡(jiǎn)單 SPARQL 查詢(xún)的方法:用命令行 sparql 工具,用 Java 代碼調用 Jena API。在這一節中,我將介紹更多 SPARQL 的特性,以及它們支持的更復雜的查詢(xún)。

RDF 經(jīng)常被用來(lái)表示半結構化的 數據。這意味著(zhù)在一個(gè)模型中,兩個(gè)相同類(lèi)型的節點(diǎn)可能有兩個(gè)不同的屬性集。例如,在 FOAF 模型中,對人的描述可能只包含電子郵件地址;而作為另一個(gè)選擇,它也可以包含真實(shí)名稱(chēng)、IRC 昵稱(chēng)、描繪個(gè)人照片的 URL,等等。

提煉查詢(xún)結果

為了進(jìn)一步提煉查詢(xún)的結果,SPARQL 擁有 DISTINCT、LIMIT、OFFSETORDER BY 關(guān)鍵字,它們操作或多或少與它們在 SQL 中的對應物有些類(lèi)似。DISTINCT 可能只用在 SELECT 查詢(xún)上,格式為 SELECT DISTINCT。它會(huì )從結果集中清除重復的查詢(xún)結果,讓留下的每個(gè)結果都是惟一的。其他關(guān)鍵字都放在查詢(xún)的 WHERE 子句之后。LIMIT n 把查詢(xún)返回的結果數量限制在 n 個(gè),OFFSET n 則忽略前面 n 個(gè)結果。ORDER BY ?var 會(huì )根據 ?var 的自然順序對結果進(jìn)行排序,例如,如果 var 是字符串值,則按字母順序排序??梢杂?ASC[?var]DESC[?var] 指定排序的方向。

當然,可以把 DISTINCT、LIMIT、OFFSETORDER BY 組合在查詢(xún)中。例如,可以用 ORDER BY DESC[?date] LIMIT 10 找到 RSS feed 中最新的十個(gè)條目。

清單 5 顯示了一個(gè)非常小的 FOAF 圖,用 Turtle 語(yǔ)法表示。它包含對 4 個(gè)虛構人物的描述,但是每個(gè)描述都有不同的屬性集。


清單 5. 一個(gè)描述 4 個(gè)虛構人物的小 FOAF 圖
                        @prefix foaf: <http://xmlns.com/foaf/0.1/> .                        _:a foaf:name         "Jon Foobar" ;                        foaf:mbox         <mailto:jon@foobar.xx> ;                        foaf:depiction    <http://foobar.xx/2005/04/jon.jpg> .                        _:b foaf:name         "A. N. O'Ther" ;                        foaf:mbox         <mailto:a.n.other@example.net> ;                        foaf:depiction    <http://example.net/photos/an-2005.jpg> .                        _:c foaf:name         "Liz Somebody" ;                        foaf:mbox_sha1sum "3f01fa9929df769aff173f57dec2fe0c2290aeea"                        _:d foaf:name         "M Benn" ;                        foaf:depiction    <http://mbe.nn/pics/me.jpeg> .                        

可選匹配

假設您想編寫(xiě)一個(gè)查詢(xún),返回清單 5 的圖中所描述的每個(gè)人的名字,以及每個(gè)人的照片的鏈接(如果有照片的話(huà))。在 foaf:depiction 中包含的圖形模式的 SELECT 查詢(xún)可能只會(huì )發(fā)現三個(gè)結果。Liz Somebody 不會(huì )形成結果,因為雖然它有 foaf:name 屬性,但它沒(méi)有 foaf:depiction 屬性,而如果要與查詢(xún)匹配的話(huà),那么這兩個(gè)屬性都需要。

幫助就在眼前,就是 SPARQL 的 OPTIONAL 關(guān)鍵字。可選塊 定義了附加圖形模式,即使模式不匹配,不會(huì )造成結果被拒絕,但在匹配的時(shí)候,圖形模式會(huì )被綁定到圖形上。清單 6 演示了一個(gè)查詢(xún),在清單 5 的 FOAF 數據中查找每個(gè)人的 foaf:name,而且可以選擇性地查找伴隨的 foaf:depiction。


清單 6. 用可選塊查詢(xún) FOAF 數據
                        PREFIX foaf: <http://xmlns.com/foaf/0.1/>                        SELECT ?name ?depiction                        WHERE {                        ?person foaf:name ?name .                        OPTIONAL {                        ?person foaf:depiction ?depiction .                        } .                        }                        

清單 7 顯示了運行清單 6 的查詢(xún)的結果。所有查詢(xún)結果都包含人名,可選的圖形模式則只在 foaf:depiction 屬性存在的時(shí)候才綁定;如果沒(méi)有,就從結果中忽略。從這種意義上說(shuō),查詢(xún)與 SQL 中的左外連接相似。


清單 7. 清單 6 的查詢(xún)結果
                        ------------------------------------------------------------                        | name           | depiction                               |                        ============================================================                        | "A. N. O'Ther" | <http://example.net/photos/an-2005.jpg> |                        | "Jon Foobar"   | <http://foobar.xx/2005/04/jon.jpg>      |                        | "Liz Somebody" |                                         |                        | "M Benn"       | <http://mbe.nn/pics/me.jpeg>            |                        ------------------------------------------------------------                        

可選塊可以包含任何圖形模式,不僅僅是像清單 6 所示的那種單一的三元模式??蛇x塊中的所有查詢(xún)模式都匹配,才能讓可選模式成為查詢(xún)結果的一部分。如果查詢(xún)有多個(gè)可選塊,那么它們會(huì )分別發(fā)揮作用 —— 可能在結果中被忽略,也可能存在于結果中??蛇x塊也可以嵌套,在這種情況下,只有外部可選塊的模式與圖形匹配時(shí),才考慮內部可選塊。

替換匹配

FOAF 圖形用人們的電子郵件地址來(lái)惟一地標識他們。出于隱私的考慮,有些人喜歡用電子郵件地址的哈希碼。純文本的電子郵件地址用 foaf:mbox 屬性表示,而電子郵件地址的哈希碼則用 foaf:mbox_sha1sum 屬性表示;這兩個(gè)屬性在人們的 FOAF 描述中通常是互斥的。在這種情況下,可以用 SPARQL 的 替代匹配 特性來(lái)編寫(xiě)查詢(xún),該查詢(xún)返回任何可用的屬性。

替換匹配的定義方式是寫(xiě)出多個(gè)替換圖形模式,中間用 UNION 關(guān)鍵字連接。清單 8 顯示的查詢(xún)在 清單 5 中的 FOAF 中查找每個(gè)人的名字,以及他們的 foaf:mboxfoaf:mbox_sha1sum。M Benn 不是查詢(xún)結果,因為它既沒(méi)有 foaf:mbox 屬性也沒(méi)有 foaf:mbox_sha1sum 屬性。與 OPTIONAL 圖形模式相比,至少 要有一個(gè)替換模式和某個(gè)查詢(xún)結果匹配;如果UNION 匹配中的分支都匹配,那么會(huì )生成兩個(gè)結果。


清單 8. 有替代匹配的查詢(xún)和查詢(xún)結果
                        PREFIX foaf: <http://xmlns.com/foaf/0.1/>                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>                        SELECT ?name ?mbox                        WHERE {                        ?person foaf:name ?name .                        {                        { ?person foaf:mbox ?mbox } UNION { ?person foaf:mbox_sha1sum ?mbox }                        }                        }                        ---------------------------------------------------------------------                        | name                 | mbox                                       |                        =====================================================================                        | "Jon Foobar"         | <mailto:jon@foobar.xx>                     |                        | "A. N. O'Ther"       | <mailto:a.n.other@example.net>             |                        | "Liz Somebody"       | "3f01fa9929df769aff173f57dec2fe0c2290aeea" |                        ---------------------------------------------------------------------                        

值約束條件

SPARQL 中的 FILTER 關(guān)鍵字對綁定變量的值進(jìn)行約束,從而限制查詢(xún)的結果。這些值約束條件是對布爾值進(jìn)行計算的邏輯表達式,并且可以與邏輯操作符 &&|| 組合使用。例如,可以用過(guò)濾器把返回名稱(chēng)列表的查詢(xún)修改成只返回和指定正則表達式匹配的名稱(chēng)?;蛘?,如清單 9 所示,過(guò)濾器在項目的出版日期上設置限制,從而找到 RSS feed 中在兩個(gè)特定日期之間發(fā)布的項目。清單 9 還顯示了如何使用 SPARQL 的 XPath 樣式的類(lèi)型轉換特性(在這里,是將 date 變量轉換成 XML Schema 的 dateTime 值),以及如何用 ^^xsd:dateTime 在文字日期字符串上指定相同的數據類(lèi)型。這可以確保在查詢(xún)中使用日期比較,而不是標準的字符串比較。


清單 9. 用過(guò)濾器檢索在 2005 年 4 月發(fā)布的 RSS feed 項目
                        PREFIX rss:   <http://purl.org/rss/1.0/>                        PREFIX xsd:   <http://www.w3.org/2001/XMLSchema#>                        PREFIX  dc:   <http://purl.org/dc/elements/1.1/>                        SELECT ?item_title ?pub_date                        WHERE {                        ?item rss:title ?item_title .                        ?item dc:date ?pub_date .                        FILTER xsd:dateTime(?pub_date) >= "2005-04-01T00:00:00Z"^^xsd:dateTime &&                        xsd:dateTime(?pub_date) < "2005-05-01T00:00:00Z"^^xsd:dateTime                        }                        





回頁(yè)首


處理多個(gè)圖形

迄今為止,我所演示的所有查詢(xún)只包含一個(gè) RDF 圖的數據集。在 SPARQL 的術(shù)語(yǔ)中,這些查詢(xún)針對的是 后臺圖(background graph)。后臺圖是指:在使用 Jena 的 API 時(shí),通過(guò)某個(gè)查詢(xún)的 FROM 子句、sparql 命令的 --data 開(kāi)關(guān)或者通過(guò)向 QueryExecutionFactory.create() 傳遞一個(gè)模型來(lái)指定的圖。

其他類(lèi)型的 SPARQL 查詢(xún)

除了本文使用的 SELECT 查詢(xún)之外,SPARQL 還支持另外三種查詢(xún)。如果查詢(xún)的圖形模式在數據集中有匹配物,那么 ASK 將返回 “yes”,如果沒(méi)有匹配物,則返回 “no”。DESCRIBE 返回一個(gè)圖形,其中包含和圖形模式匹配的節點(diǎn)的相關(guān)信息。例如,DESCRIBE ?person WHERE { ?person foaf:name "Jon Foobar" } 會(huì )返回一個(gè)圖,其中包括來(lái)自 Jon Foobar 的模型的三元模式。最后,CONSTRUCT 用來(lái)為每個(gè)查詢(xún)結果輸出一個(gè)圖形模式。這樣就可以直接從查詢(xún)結果創(chuàng )建新的 RDF 圖??梢园?RDF 圖上的 CONSTRUCT 查詢(xún)想像成與 XML 數據的 XSL 轉換類(lèi)似的東西。

除了后臺圖,SPARQL 還能查詢(xún)任意數量的 命名圖。這些附加的圖是根據它們的 URI 來(lái)識別的,而這些 URI 在一個(gè)查詢(xún)內是互不相同的。在研究使用命名圖的方法之前,我要解釋一下如何向查詢(xún)提供這些 URI。與后臺圖一樣,命名圖可以在查詢(xún)內部用 FROM NAMED <URI> 指定,在這里,是通過(guò) URI 來(lái)指定圖。另外,也可以用 --named URL 把命名圖提供給 sparql 命令,URL 用于指定圖的位置。最后,可以用 Jena 的 DataSetFactory 類(lèi)指定要用編程方式查詢(xún)的命名圖。

在 SPARQL 查詢(xún)內部用 GRAPH 關(guān)鍵字調用命名圖,后面是圖的 URI 或變量名。這個(gè)關(guān)鍵字后面是要與圖匹配的圖形模式。

在特定圖中查找匹配

GRAPH 關(guān)鍵字和圖的 URI(或者已經(jīng)綁定到圖的 URI 的變量)一起使用時(shí),圖形模式就被應用到這個(gè) URI 標識的任何圖。如果在指定的圖中發(fā)現匹配物,那么該匹配物就成為查詢(xún)結果的一部分。在清單 10 中,有兩個(gè) FOAF 圖被傳遞給查詢(xún)。查詢(xún)結果是在兩個(gè)圖中都可以發(fā)現的那些人的名字。注意,表示每個(gè) FOAF 圖的那些人的節點(diǎn)是空節點(diǎn),它們的作用范圍有限,只在包含它們的圖中有效。這意味著(zhù)表示同一個(gè)人的節點(diǎn)不能在查詢(xún)的兩個(gè)命名圖中同時(shí)存在,所以必須用不同的變量 (xy)來(lái)表示它們。


清單 10. 查找在兩個(gè)命名 FOAF 圖中都描述的那些人的查詢(xún)
                        PREFIX foaf: <http://xmlns.com/foaf/0.1/>                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>                        SELECT ?name                        FROM NAMED <jon-foaf.rdf>                        FROM NAMED <liz-foaf.rdf>                        WHERE {                        GRAPH <jon-foaf.rdf> {                        ?x rdf:type foaf:Person .                        ?x foaf:name ?name .                        } .                        GRAPH <liz-foaf.rdf> {                        ?y rdf:type foaf:Person .                        ?y foaf:name ?name .                        } .                        }                        

查找包含某個(gè)模式的圖

使用 GRAPH 的另一種方法是在它后面跟一個(gè)未綁定變量。在這種情況下,圖形模式被應用到查詢(xún)可以使用的每個(gè)命名圖中。如果模式和其中一個(gè)命名圖匹配,那么這個(gè)圖的 URI 就被綁定到 GRAPH 的變量上。清單 11 的 GRAPH 子句和提供給查詢(xún)的命名圖中的每個(gè)人員節點(diǎn)匹配。匹配的人名被綁定到 name 變量,而 graph_uri 變量綁定到與模式匹配的圖的 URI 上。查詢(xún)的結果也顯示出來(lái)。有一個(gè)名稱(chēng) A. N. O'Ther 被匹配了兩次,因為在 jon-foaf.rdf 和 liz-foaf.rdf 中都描述了這個(gè)人。


清單 11. 確定哪個(gè)圖描述了不同的人
                        PREFIX foaf: <http://xmlns.com/foaf/0.1/>                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>                        SELECT ?name ?graph_uri                        FROM NAMED <jon-foaf.rdf>                        FROM NAMED <liz-foaf.rdf>                        WHERE {                        GRAPH ?graph_uri {                        ?x rdf:type foaf:Person .                        ?x foaf:name ?name .                        }                        }                        --------------------------------------------------------                        | name                 | graph_uri                     |                        ========================================================                        | "Liz Somebody"       | <file://.../jon-foaf.rdf>     |                        | "A. N. O'Ther"       | <file://.../jon-foaf.rdf>     |                        | "Jon Foobar"         | <file://.../liz-foaf.rdf>     |                        | "A. N. O'Ther"       | <file://.../liz-foaf.rdf>     |                        --------------------------------------------------------                        

XML 格式的查詢(xún)結果

SPARQL 允許以 XML 格式返回查詢(xún)結果,采用的格式叫作 SPARQL 變量綁定結果 XML 格式。這個(gè)用 schema 定義的格式是 RDF 查詢(xún)和 XML 工具及庫之間的橋梁。

這項功能還有許多潛在用途??梢园?SPARQL 查詢(xún)的結果通過(guò) XSLT 轉換成 Web 面或 RSS feed,通過(guò) XPath 訪(fǎng)問(wèn)結果,或者把結果文件返回給 SOAP 或 AJAX 客戶(hù)。要以 XML 格式返回查詢(xún)結果,請使用 ResultSetFormatter.outputAsXML() 方法,或者在命令行指定 --results rs/xml。

組合后臺數據和命名圖

查詢(xún)也可以把后臺數據和命名圖結合在一起使用。清單 12 用來(lái)自 PlanetRDF.com 的活動(dòng)的聚合 RSS feed 作為后臺數據,結合一個(gè)包含我自己的配置檔案的命名圖對它進(jìn)行查詢(xún)。我的想法是創(chuàng )建一個(gè)個(gè)性化的 feed,找到我認識的一些博客最新發(fā)表的十個(gè)貼子。查詢(xún)的第一部分找到了 FOAF 文件中代表我的那些節點(diǎn),然后找到了圖中描述的、我認識的那些人的名字。第二部分在這些人創(chuàng )建的 RSS feed 中查找項目。最后,按照項目的創(chuàng )建時(shí)間對結果集進(jìn)行排序,而且限制只返回十個(gè)結果。


清單 12. 得到一個(gè)個(gè)性化的活躍的 PlanetRDF feed
                        PREFIX foaf: <http://xmlns.com/foaf/0.1/>                        PREFIX rss:  <http://purl.org/rss/1.0/>                        PREFIX dc:   <http://purl.org/dc/elements/1.1/>                        SELECT ?title ?known_name ?link                        FROM <http://planetrdf.com/index.rdf>                        FROM NAMED <phil-foaf.rdf>                        WHERE {                        GRAPH <phil-foaf.rdf> {                        ?me foaf:name "Phil McCarthy" .                        ?me foaf:knows ?known_person .                        ?known_person foaf:name ?known_name .                        } .                        ?item dc:creator ?known_name .                        ?item rss:title ?title .                        ?item rss:link ?link .                        ?item dc:date ?date.                        }                        ORDER BY DESC[?date] LIMIT 10                        

雖然這個(gè)查詢(xún)只是返回標題、名稱(chēng)和 URL 的列表,但是更復雜的查詢(xún)可以從匹配項目提取出所有數據。采用 SPARQL 的 XML 結果格式(請參閱標題為“XML 格式的查詢(xún)結果”的側欄)與 XSL 樣式表結合,還可以創(chuàng )建博客日志的個(gè)性化的 HTML 視圖,甚至生成另一個(gè) RSS feed。





回頁(yè)首


結束語(yǔ)

本文中的示例應當有助于您理解 SPARQL 的基本特性和語(yǔ)法,以及它帶給 RDF 應用程序的好處。還了解了SPARQL 如何在可選和可替換匹配的幫助下,讓您了解真實(shí)的 RDF 圖的半結構化特性。使用命名圖的示例還顯示了如何使用 SPARQL 組合多個(gè)圖來(lái)啟用查詢(xún)選項。您還看到在 Java 代碼中用 Jena API 運行 SPARQL 是多么簡(jiǎn)單。

對于 SPARQL,還有更多這里可能沒(méi)有介紹的內容,所以請利用下面的 參考資料 查找關(guān)于 SPARQL 特性的更多內容。請參閱 SPARQL 的規范,詳細學(xué)習 SPARQL 的內置函數、操作符、查詢(xún)格式和語(yǔ)法,或者參閱更多 SPARQL 查詢(xún)示例。

當然,學(xué)習 SPARQL 的最好方法是編寫(xiě)一些自己的查詢(xún)。從 Web 上得到一些 RDF 數據,下載 Jena ARQ 模塊,開(kāi)始體驗吧!



參考資料

  • 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文。

  • Jena 簡(jiǎn)介”,這篇文章的作者也是 Philip McCarthy (developerWorks,2004 年 6 月),文中提供了Jena 語(yǔ)義 Web 工具包的概述,包括 RDQL 查詢(xún)語(yǔ)言的一些細節。

  • 最新版的 SPARQL specification 提供了 SPARQL 查詢(xún)語(yǔ)法和功能的確切描述。

  • Dave Beckett 做了一份緊湊的 SPARQL Language Quick Reference,可以打印出來(lái)貼在辦公桌上。

  • SPARQL Query Results XML Format 描述了“Query results in XML format”中討論的結構格式。

  • Jena SourceForge project 上有大量 Jena 語(yǔ)義 Web 工具包的文檔和下載。

  • Andy Seaborne 的 ARQ home page 上有關(guān)于從 CVS 獲得 ARQ 的指導。最新的 ARQ 發(fā)行包可以在 ARQ's downloads 頁(yè)上找到。

  • SPARQLer 是 Jena 的 SPARQL 查詢(xún)語(yǔ)言引擎的一個(gè)在線(xiàn)演示??梢杂盟鼇?lái)體驗 SPARQL 查詢(xún)。

  • Dave Beckett 的 Rasqal RDF 查詢(xún)庫是一個(gè)開(kāi)源的 C 庫,支持 SPARQL,包含各種語(yǔ)言綁定。

  • FOAF Project 是用機器可讀的 RDF 詞匯來(lái)描述一些人及他們之間關(guān)系的一個(gè)實(shí)驗。FOAF Vocabulary Specification 定義了本文使用的 FOAF 術(shù)語(yǔ)。

  • Dublin Core Metadata Element Set 是常用的元數據術(shù)語(yǔ)的一個(gè)標準集合。許多 RDF 詞匯和格式都采用它,例如 FOAF 和 RSS 1.0。

  • SPARQL 的圖形模式是以 Turtle -- Terse RDF Triple Language 的語(yǔ)法為基礎。

  • PlanetRDF.com 匯集了語(yǔ)義 Web 社區中的一些開(kāi)發(fā)人員的網(wǎng)絡(luò )日志,提供了一個(gè)追蹤該領(lǐng)域的發(fā)展的簡(jiǎn)便方法。這篇文章在示例中使用了 PlanetRDF 的 RSS feedRDF blogroll。

  • 通過(guò)參與 developerWorks blogs 加入 developerWorks 社區。

  • 在 developerWorks Java 技術(shù)專(zhuān)區 中可以找到 Java 編程的各個(gè)方面的文章。

  • 請參閱 Developer Bookstore,以獲得技術(shù)書(shū)籍的完整清單,其中包括數百本 Java 相關(guān)主題 的書(shū)籍。


關(guān)于作者

 

Philip McCarthy 是專(zhuān)門(mén)研究 Java 和 Web 技術(shù)的軟件開(kāi)發(fā)顧問(wèn),目前正在位于 Bristol 的 HP 實(shí)驗室為 HP 的數字媒體平臺計劃工作。他還是 PlanetRDF.com 幕后的團隊成員之一,這是一個(gè)語(yǔ)義 Web 開(kāi)發(fā)人員的社區站點(diǎn)。您可以通過(guò) phil@planetrdf.com 與 Phil 聯(lián)系。



本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
語(yǔ)義Web和本體開(kāi)發(fā)相關(guān)技術(shù)
實(shí)踐篇(四):Apache jena SPARQL endpoint及推理
XML 觀(guān)察: 使用 XML 和 RDF 找到朋友
在A(yíng)uto CAD下如何能提高繪圖速度、AutoCAD實(shí)用經(jīng)典技巧80條
厲害了!這個(gè)Python神庫!有了它可以免費進(jìn)行網(wǎng)上問(wèn)診
鄒磊|知識圖譜的數據應用和研究動(dòng)態(tài)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久