如何利用 D2R 發佈 Linked data

轉載:http://www.ibm.com/developerworks/cn/web/1003_zhangjing_d2r/


如何利用 D2R 發佈 Linked data

張 靜, 軟件工程師, IBM

馬 春娥, 軟件工程師, IBM

2010 年 3 月 25 日


Linked data 作爲 semantic Web 的一個子話題,近年來逐漸得到學術界以及工業界的廣泛重視。Linked data 這個詞表示了一系列在 Web 上發佈和關聯結構化數據的最佳實踐。在用 Linked Data 構建的數據 Web 上,我們可以自由地從一片數據跳轉到其它數據,比之現在的文檔 Web(從一個文檔跳轉到其他文檔),數據 Web 提供的關聯不但更加豐富,而且具有語義。本文着重介紹目前比較流行的一種發佈 Linked data 的工具 D2R 的使用方法,並以 Academic 領域的數據爲例,展示怎麼使用 D2R 工具構建 Linked data,並提供簡單的瀏覽功能。本文希望給需要開發基於 Linked data 應用程序的程序員提供有價值的參考。


前言

Linked data 最早是在 2007 年 5 月,由 Chris Bizer and Richard Cyganiak 向 W3C SWEO 提交的一個項目申請 Linked Open Data Project 中提出來的。Linked data 提出的目的是構建一張計算機能理解的語義數據網絡,而不僅僅是人能讀懂的文檔網絡,以便於在此之上構建更智能的應用。Linked Open Data Project 的宗旨在於號召人們將現有數據發佈成 Linked data,並將不同數據源互聯起來。在過去的三年中,越來越多的數據提供者和 Web 應用開發者將他們各自的數據發佈到 Web 上,並且與其它數據源關聯在一起,形成一個巨大的數據 Web。截止 2009 年 7 月,已發佈的 Linked data 規模爲 6.726.000.000 個 RDF 三元組以及 148.948.000 個 RDF 關聯關係,相比 2007 年 5 月的 500 million RDF 三元組以及 120,000 RDF 關聯關係,增漲非常迅速。 其數據領域涉及 Geographic Data,Life Sciences,Publications,User Generate Content,Media 等等。

不僅僅是 Public Web,隨着企業 2.0 的到來,企業內部也迫切需要越來越多的數據與 Web 上的數據關聯,從而構建更好的應用與服務。而現有的數據,尤其是企業內部的數據,大多數存在於關係型數據庫中,因此,本文挑選了一個目前應用較爲廣泛的工具 D2R,介紹如何使用它將關係型數據庫的數據發佈成 Linked Data。



什麼是 Linked data

簡單來講,Linked data 即爲一系列利用 Web 在不同數據源之間創建語義關聯的最佳實踐方法。這裏的不同數據源,可以來自一個組織內部的不同系統,也可以來自不同組織的不同系統,它們的內容,存儲地點以及存儲方式都可以完全不同,但它們很可能存在着關聯,例如:Amazon 上圖書可能與 MySpace 上的人之間可能存在關聯,因爲圖書的作者有可能在 Myspace 上註冊賬號。總之,Linked data 最大的特點便是將不同的數據關聯起來。

Linked data 包含一些基本原則:

  1. 資源。在發佈一個領域的數據之前,我們需要確定要發佈的資源是什麼。任何事物,只要你認爲是有意義的,有被引用必要的,都可以稱之爲資源。
  2. 資源標識。任何一個資源都用一個 HTTP URI(Uniform Resource Identifiers)來標識。之所有要用 HTTP URI 來標識,是希望數據能夠通過 HTTP 協議訪問,真正實現基於 Web 的訪問與互聯。
  3. 資源描述。資源可以有多種描述,例如 HTML,XML,RDF 以及 JPEG。文檔 Web 的文檔主要通過 HTML 格式來表示,數據 Web 的數據主要通過 RDF格式(Resource Description Framework)來表示。RDF 將一個資源描述成一組三元組(主語,謂語,賓語)。

例如:

王老師 教授 英語課

(主語) (謂語) (賓語)

主語用來表示需要描述的資源,謂語用來表示主語的某個屬性(例如:姓名,出生日期)或者某個關係(例如,僱傭,認識,教授等),賓語表示了屬性的值或者關係的值。主語,謂語都需要要用 HTTP URI 來表示。賓語可以用 HTTP URI 標識另一個資源,也可以是字符串表示的文本。我們可以把主語看作是類資源,而將謂語看作是類資源的屬性資源,賓語或者是類資源或者是文字型資源。根據賓語的種類,可以將三元組分爲兩類:文字型三元組以及非文字型三元組,第二種可以看作是類資源之間的關聯。


什麼是 D2R

Linked data 的優點雖然很突出,但要想發揮其作用,其前提是數據必須滿足 Linked data 的基本原則。然而實際上上大量已存在的數據並不滿足這些原則,於是 Linked data 的推動者們便開發了一系列實用的工具,來幫助完成傳統數據向 Linked data 的轉換。

D2R 便是其中一個非常流行的工具。它的作用是一個將關係型數據庫發佈爲 Linked data。D2R 主要包括 D2R Server, D2RQ Engine 以及 D2RQ Mapping 語言。

D2R Server 是一個 HTTP Server,它的主要功能提供對 RDF 數據的查詢訪問接口,以供上層的 RDF 瀏覽器、SPARQL 查詢客戶端以及傳統的 HTML 瀏覽器調用。

D2RQ Engine 的主要功能是使用一個可定製的 D2RQ Mapping 文件將關係型數據庫中的數據換成 RDF 格式。D2RQ engine 並沒有將關係型數據庫發佈成真實的 RDF 數據,而是使用 D2RQ Mapping 文件將其映射成虛擬的 RDF 格式。該文件的作用是在訪問關係型數據時將 RDF 數據的查詢語言 SPARQL 轉換爲 RDB 數據的查詢語言 SQL,並將 SQL 查詢結果轉換爲 RDF 三元組或者 SPARQL 查詢結果。D2RQ Engine 是建立在 Jena(Jena 是一個創建 Semantic Web 應用的 Java 平臺,它提供了基於 RDF,SPARQL 等的編程環境)的接口之上。

D2RQ Mapping 語言的主要功能是定義將關係型數據轉換成 RDF 格式的 Mapping 規則。

圖 1 呈現了 D2R 的主體架構:

圖 1. D2R 的主體構架
圖 1. D2R 的主體構架


如何使用 D2R

環境準備

在使用 D2R 之前,先要進行準備工作,即對 D2R 的環境進行下載和安裝:

  1. 下載 D2R的環境
  2. 下載與你目前使用的數據庫版本相匹配的驅動,將其 jar 文件放在 D2R Server 的 lib 目錄下面。D2R 目前已經詳細測試過 Oracle, MySQL, PostgreSQL, Microsoft SQL Server。其它數據庫沒有測試,但筆者嘗試過 IBM DB2,發現同樣是支持的。

使用 D2R 可以對關係型數據庫的數據進行兩種方案的轉化與訪問。第一種方案是將關係型數據庫的數據轉換爲虛擬的 RDF 數據進行訪問,分爲兩個步驟,第一步是生成 Mapping 文件,第二步是使用 Mapping 文件對關係型數據進行轉換與訪問。我們可以通過 D2R server 訪問關係型數據,或者通過在自己的 Java application 中調用 Jena/Seasame 的 API 去訪問數據。第二種方案是直接將關係型數據庫的數據包裝成真實的 RDF 文件,以供一些可以訪問 RDF Store 的接口訪問。由於一般來講,數據庫的數據規模都比較大,且內容經常發生變化,轉換爲虛擬的 RDF 數據空間複雜度會更低,更新內容更加容易,因此第一種方案的應用更加廣泛。我們在這裏只介紹第一種方案,並分下述兩個步驟進行介紹。

生成 Mappping file

D2R 提供了生成 Mapping 文件的執行腳本。我們需要在命令行中進入您所下載的 D2R 所在的路徑,執行下面的命令:

generate-Mapping [-u username] [-p password] [-d driverclass] [-o outfile.n3] [-b base uri] jdbcURL

參數意義如下:

jdbcURL

JDBC 鏈接數據庫的 URL

 MySQL: jdbc:mysql://servername/databasename 
 PostgreSQL: jdbc:postgresql://servername/databasename 
 Oracle: jdbc:oracle:thin:@servername:1521:databasename 
 Microsoft SQL Server: jdbc:sqlserver://servername;databaseName=databasename 
 (包含分號,使用時需要用引號引起來)
 DB2:jdbc:db2:// servername:50000/ databasename

-u username

數據庫用戶登錄名

-p password

數據庫用戶登錄密碼

-d driverclass

數據庫驅動類名

 MySQL: com.mysql.jdbc.Driver 
 PostgreSQL: org.postgresql.Driver 
 Oracle: oracle.jdbc.OracleDriver 
 Microsoft SQL Server: com.microsoft.sqlserver.jdbc.SQLServerDriver 
 DB2:com.ibm.db2.jcc.DB2Driver

-o outfile.n3

Mapping file 的輸出文件,以 n3 爲後綴

-b base uri

Base uri 作爲詞彙的命名空間,默認爲 http://localhost:2020/詞彙的前綴按照http://baseURI/vocab/resource/模式生成。base uri 需要與 server 的 uri 相一致。

例如 : 現在我準備一個關於 Academic 的數據庫,其中包括 1)從 hompage 上抽取的有關研究者的信息:homepagePeople;2)從 wikipedia 上抽取的有關研究者的信息:wikipediaPeople;3)從 ACM 頁面上抽取的有關論文與作者的信息:Paper, Author, Paper2Author。數據庫相關的 schema 如清單 1 所示:

清單 1. Academic 數據庫 Schema
 CREATE TABLE homepagePeople ( 
      peopleID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY, 
      name varchar(100) NOT NULL, 
      email varchar(100), 
      organization varchar(100), 
      homepage varchar(100), 
      phone varchar(100), 
      position varchar(100), 
      PRIMARY KEY (peopleID) 
 ); 

 CREATE TABLE wikiPeople ( 
      peopleID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY, 
      name varchar(100) NOT NULL, 
      email varchar(100), 
      title varchar(100), 
      employer varchar(100), 
      education varchar(100), 
      occupation varchar(100), 
      PRIMARY KEY (peopleID) 
 ); 

 CREATE TABLE paper ( 
      paperID INTEGER NOT NULL, 
      title varchar(200) NOT NULL, 
      publishYear varchar(200), 
      conference varchar(200), 
      PRIMARY KEY  (paperID) 
 ); 

 CREATE TABLE author ( 
      authorID INTEGER NOT NULL , 
      name varchar(200) NOT NULL, 
      email varchar(200), 
      organization varchar(200), 
      PRIMARY KEY  (authorID)  
 ); 
 CREATE TABLE paper2author ( 
      paperID INTEGER NOT NULL , 
      authorID INTEGER NOT NULL , 
      PRIMARY KEY  (authorID, paperID), 
      FOREIGN KEY (paperID) REFERENCES paper(paperID) ON DELETE CASCADE, 
      FOREIGN KEY (authorID) REFERENCES author(authorID) ON DELETE CASCADE 
 );

執行下面命令便可以根據Academic的Schema生成一個Mapping文件存儲在Academic.n3中: generate-Mapping -o Academic.n3 -d com.ibm.db2.jcc.DB2Driver -u test -p test jdbc:db2://localhost:50000/Academic 默認的 Mapping 文件非常簡單,我們需要的一些數據關聯可能沒有提供。之後會着重介紹一些利用 Mapping 語言自定製 Mapping 文件的實踐方法。

使用 Mapping 文件對數據進行轉化與訪問

生成 Mapping 文件後,我們便希望通過 Mapping 文件對關係型數據庫的數據進行轉換和訪問,這裏有兩種方式,一種是通過 D2R Server 自動調用 D2RQ Engine 對數據進行轉換訪問,另一種在自己的 Java application 中通過 Jena/Seasame 的 API 去使用 D2RQ Engine。

使用 D2R server 默認的數據處理和訪問方式瀏覽 Linked data。

該方法很簡單,不需要自己寫代碼,只需要在命令行下面進入 D2R 所在文件路徑,執行下面的命令啓動 D2R Server:

d2r-server Academic.n3

其中 Academic.n3 即爲上一節中生成 Mapping 文件。

然後在 Web 瀏覽器中訪問 http://localhost:2020, 便可以默認的 HTML 瀏覽器、DF 瀏覽器以及 SPARQL 查詢端對我們的數據進行訪問:

圖 2. D2R Server 運行的入口頁面
圖 2. D2R Server 運行的入口頁面

從圖 2 中可以看出,雖然我們的 schema 一共有五個,但是 D2R Server 在顯示時僅生成了四種類資源:HomepagePeople,wikiPeople, paper,以及 author(圖 2 第一行),而是將 paper2author 看作是類資源 author 與 Paper 之間的關係。其概念模型如下所示:

圖 3. Academic 數據概念模型
圖 3. Academic 數據概念模

點擊圖 2 第一行的 Author,呈現出 5 個作者,如圖 4 所示:

圖 4. 點擊 Author 的 HTML 顯示結果
圖 4. 點擊 Author 的 HTML 顯示結果

點擊 Author#2,得到 Author#2 的詳細屬性與關係。如圖 5 所示:

圖 5. 訪問類資源 Author 中標號爲 2 的作者 HTML 顯示結果
圖 5. 訪問類資源 Author 中標號爲 2 的作者 HTML 顯示結果

注意在這裏,Paper2Atuhor 被映射成了 Author 的一個關係屬性,點擊該關係關聯的資源“<http://localhost:2020/resource/ZJ.PAPER/1>”,得到 Paper#1 的詳細屬性與關係,如圖 6 所示:

圖 6. 訪問類資源 Paper 中標號爲 1 的論文 HTML 顯示結果
圖 6. 訪問類資源 Paper 中標號爲 1 的論文 HTML 顯示結果

注意在瀏覽 Paper 的詳細信息時,也可以通過反屬性 (is vocab:Paper2Author of) 跳轉到相關 Author 的詳細信息。

點擊圖 2 中的類資源 HomepagePeople,再點擊 1 號資源,呈現出 James A. Hendler 的 homepage 詳細信息,如圖 7 所示:

圖 7. 訪問類資源 HomepagePeople 中標號爲 1 的人 HTML 顯示結果
圖 7. 訪問類資源 HomepagePeople 中標號爲 1 的人 HTML 顯示結果

點擊圖 2 中的類資源 WikiPeople,再點擊 1 號資源,呈現出 James Hendler 的 wikipedia 詳細信息,如圖 8 所示:

圖 8. 訪問類資源 WikiPeople 中標號爲 1 的人 HTML 顯示結果
圖 8. 訪問類資源 WikiPeople 中標號爲 1 的人 HTML 顯示結果

使用 Jena API 構建自己的應用

如果需要在 RDF 數據層上構建自己的應用,開發自己的客戶端展示方法,就要用到第二種方式,即直接在自己的 Java 工程中通過 Jena/Seasame 的 API 去使用 D2RQ, 這裏僅介紹 Jena 的使用方式,Seasame 的使用留給讀者自己去實踐。

首先需要在你的工程中引用 D2RQ 與 Jena 相關的 jar 包:

  1. 將你下載的 D2R server 目錄下的 lib/d2rq-0.7.jar 加入你工程的 classpath;
  2. 下載 ARQ2.8.1,將其 lib 目錄下的所有 jar 包加入你工程的 classpath。

使用 Jena API 可以多種方式調用 D2RQ, 其中最簡潔的方式爲直接編寫 SPARQL 查詢語言,其餘方式都需要調用 Jena 的封裝類,如 Resource,Property, RDFNode 等,需要讀者非常熟悉 Jena 的接口,並需要爲自己的數據創建相應的 Jena 類對象,因此比較麻煩。本文在此介紹最容易上手也是最靈活的訪問方式,SPARQL 查詢。

假定我們現在需要構建一個應用,展示所有作者的 name, email 和 paper,因此在 server 端需要提供一個查詢類,如清單 2 所示:

清單 2. 使用 Jena API 的 SPARQL 查詢
 package test; 

 import com.hp.hpl.jena.query.Query; 
 import com.hp.hpl.jena.query.QueryExecutionFactory; 
 import com.hp.hpl.jena.query.QueryFactory; 
 import com.hp.hpl.jena.query.QuerySolution; 
 import com.hp.hpl.jena.query.ResultSet; 

 import de.fuberlin.wiwiss.d2rq.ModelD2RQ; 

 public class AcademicTest { 
  public void queryBySPARQL(){ 

      ModelD2RQ m = new ModelD2RQ("file:/D:/Academic.n3"); 
      
      String SPARQLPrefix = "PREFIX vocab: http://localhost:2020/vocab/resource/"; 
      String SPARQL =  SPARQLPrefix + 
        "SELECT  ?name ?email ?paper WHERE {" + 
        "    ?author vocab:Name ?name . " + 
        "    ?author vocab:Email ?email ." + 
            "    ?author vocab:Paper2Author ?paper . }"  ; 
      Query query = QueryFactory.create(SPARQL); 
      ResultSet rs = QueryExecutionFactory.create(query, m).execSelect(); 
      while (rs.hasNext()) { 
 QuerySolution row = rs.nextSolution(); 
 System.out.println("name:"+row.get("name")+",email:"+row.get("email")+",   
 paper:"+row.get("paper")); 
      } 
   } 
 }

從清單 2 可以看出,用 SPARQL 查詢數據的步驟如下:

  1. 創建 D2RQ model。該步驟需要注意的是,創建 model 時需要指定 Mapping 文件的路徑,路徑可以是絕對路徑,也可以是基於工程根目錄的相對路徑,路徑之前必須加上前綴“file:/”。
  2. 執行 SPARQL 語言。該 SPARQL 語句中 ?author 爲主語,vocab:Name,vocab:Email 以及 vocab:Paper2Author 爲謂語,查詢結果 ?name,?email 以及 ?paper 爲賓語。注意 SPARQL 語句需要有命名空間的前綴說明。如在清單程序的使用了 vocab:Name,則在前綴需要聲明 vocab: http://localhost:2020/vocab/resource/,並且該聲明必須與 Mapping 文件的前綴相一致。有關 SPARQL 的詳細語法,在此不作詳細介紹,讀者可以參閱 W3C 關於 SPARQL的詳細說明。在執行 SPARQL 語句時,需要指明要執行的語句,以及所依附的 D2RQ model。
  3. 處理查詢結果(e.g.,輸出到 console)。關於 ResultSet 的處理,jena 提供了一些類似 SQL 的接口去獲取每個查詢結果項。

程序清單 2 的執行結果如下:

 name:Jie Bao, email:[email protected], paper:file:///D:/Academic2.n3#ZJ.PAPER/1 
 name:Li Ding, email:[email protected], paper:file:///D:/Academic2.n3#ZJ.PAPER/1 
 name:Deborah McGuinness, email:[email protected], paper:file:///D:/Academic2.n3#ZJ.PAPER/1 
 name:James Hendler, email:[email protected], paper:file:///D:/Academic2.n3#ZJ.PAPER/1 
 name:James Hendler, email:[email protected], paper:file:///D:/Academic2.n3#ZJ.PAPER/3 
 name:James Hendler, email:[email protected], paper:file:///D:/Academic2.n3#ZJ.PAPER/2 
 name:Jennifer Golbeck, email:[email protected], paper:file:///D:/Academic2.n3#ZJ.PAPER/2 
 name:Jennifer Golbeck, email:[email protected], paper:file:///D:/Academic2.n3#ZJ.PAPER/3

注意,結果中 name 與 email 的值都是一個文字型資源,而 paper 的值則是一個類資源,用一個路徑表示(注意,筆者目前創建的是 Java 工程,因此可以用一個文件路徑來標識一個資源,在 Web 工程中,可以曝露出 HTTP URI,例如圖 4 中用 http://localhost:2020/resource/ZJ.paper/1 表示一篇 paper)。

如何讀者希望查詢某一具體實例資源的屬性值,在寫 SPARQL 語句的時候注意需要將路徑用“<>”引起來,例如:

"SELECT  ?title WHERE {  <file:///D:/Academic2.n3#ZJ.PAPER/1>  vocab:Title ?title }"

讀者可以基於 server 端提供的接口,構建自己的 client 端對數據進行展示,本文在此不作介紹。

到此爲止,我們便介紹瞭如何使用 D2R 將關係型數據庫中的數據轉換爲虛擬的 RDF 數據,並對其進行訪問查詢的最基本方法。接下來我們將介紹如何豐富自動生成的 Mapping 文件,使得更多的數據能夠關聯在一起。

定製自己的 Mapping 文件

本節首先簡單介紹 Mapping 語言的一些基本語法,然後介紹如何利用 Mapping 語言對 Mapping 文件進行定製。

Mapping 語言的基本語法

Mapping 語言中最重要的是兩個概念,一個是 d2rq:ClassMap,另一個是 d2rq:PropertyBridge。 d2rq:ClassMap 代表 OWL Ontology 或者 RDFS Schema 中的一個或一組相似的 Class,它一般映射到關係數據庫中的一個表。其中包括幾個重要屬性:

  1. d2rq:Class:表示該 ClassMap 所對應 Class,其取值可以來自現有的 OWL Ontology 或者 RDFS Schema,也可以根據自己的數據特徵定義新的 Class;
  2. d2rq:UriPattern: 描述了一個 URI 模板,用來指導生成實例化資源的真實 URI。一般用“ZJ.AUTHOR/@@ZJ.AUTHOR.AUTHORID@@”來表示,“/”前面的部分爲表名,後面“@@”之間的部分爲表的列。

d2rq:PropertyBridge 代表 OWL Ontology 或者 RDFS Schema 中 Class 的屬性,它一般映射到關係數據庫中某個表的一列。其中包括幾個重要屬性:

  1. d2rq:belongsToClassMap: 表示該 propertyBridge 所屬的 ClassMap;
  2. d2rq:property: 表示該 propertyBridge 所對應 property,其取值可以來自現有的 OWL Ontology 或者 RDFS Schema,也可以根據自己的數據特徵定義新的 property;
  3. d2rq:column: 表示該 propertyBridge 關聯的某個具體表中的列。
  4. d2rq:refersToClassMap: 表示該 propertyBridge 引用的其它 ClassMap,它的取值不是該 propertyBridge 所屬 ClassMap 對應表中的取值,而是從引用的 ClassMap 對應表中取值。該屬性一般會跟隨幾個 d2rq:join 來指明關聯的條件,d2rq:join 類似 sql 語句中的 where 條件。

定製 Mapping 文件

Linked data 最重要的特點便是資源和資源之間是互聯的,從一個資源可以跳轉到其它許多資源。如圖 4、5 中,從類資源 Author 可以跳轉到類資源 Paper,同樣從類資源 Paper 也可以跳轉到類資源 Author。這些關聯生成的前提是原始的數據中存在 Paper2Author 表,通過外鍵引用 Paper 表與 Author 表。有了主外鍵關係,D2R 便可以自動爲其創建 RDF 關聯。具體做法爲,如果一個表 A 被表 B 外鍵引用,則爲 A 對應的 ClassMap 創建一個 PropertyBridge,其 d2rq:belongsToClassMap 爲 A 所對應的 ClassMap,d2rq:refersToClassMap 爲 B 所對應的 ClassMap。 這樣,在瀏覽 A 的實例資源時,便可以通過該 PropertyBridge 跳轉到 B 的實例資源。如果一個表的所有列都通過外鍵引用其它數據表,則不會爲該表生成對應的 ClassMap,而是選取一個被引用的表,爲其創建屬性,屬性取值來自其它被引用的表。例如本文所舉例子中的 Paper2Author:

清單 3. 默認的 Mapping 文件生成的 Paper2Author 屬性
 # n:m table ZJ.PAPER2AUTHOR 
 map:Paper2author a d2rq:PropertyBridge; 
 d2rq:belongsToClassMap map:Author; 
 d2rq:property vocab:Paper2Author; 
 d2rq:refersToClassMap map:Paper; 
 d2rq:join "ZJ.PAPER2AUTHOR.AUTHORID => ZJ.AUTHOR.AUTHORID"; 
 d2rq:join "ZJ.PAPER2AUTHOR.PAPERID => ZJ.PAPER.PAPERID";

實際情況中,很多數據之間雖然有聯繫,但數據庫的創建者們並沒有爲之建立主外鍵的關係。在這種情況下,我們就需要根據一定的領域常識或經驗,手動地修改 Mapping 文件,爲之建立一些必要的關聯。

例如,文中的 Academic 數據集,數據表 HomepagePeople 中的數據是 從 hompage 上抽取的有關研究者的信息, 數據表 WikiPeople 中的數據時從 wikipedia 上抽取的有關研究者的信息,這兩張表並沒有主外鍵的關聯。但實際上,根據我們的常識,這兩張表中的數據很有可能指代同一個人。因此,我們希望定義一定的規則,將 Homepage 這個類資源與 WikiPeople 這個類資源關聯起來。清單 4 給出了我們自定義的屬性 wikiInfor,該屬性屬於類資源 HomepagePeople,引用類資源 WikiPeople:

清單 4. 自定義的屬性 wikiInfor
 map:wikiInfor a d2rq:PropertyBridge; 
 d2rq:belongsToClassMap map:HomepagePeople; 
 d2rq:property vocab:WikiInformation; 
 d2rq:refersToClassMap map:WikiPeople; 
 d2rq:join "ZJ.HOMEPAGEPEOPLE.EMAIL => ZJ.WIKIPEOPLE.EMAIL"; 
 d2rq:join "ZJ.HOMEPAGEPEOPLE.ORGANIZATION => ZJ.WIKIPEOPLE.EMPLOYER";

清單 4 定義了 PropertyBridge:wikiInfor,其中 d2rq:belongsToClassMap 描述了 wikiInfor 所屬的 ClassMap 爲 HomepagePeople;d2rq:property 描述了 wikiInfor 所對應的 property 爲 vocab:WikiInformation,這個值可以修改,或者引用現有的 Ontology/RDFS 中的詞彙,或者根據自己的數據靈活定義;d2rq:refersToClassMap 描述了 wikiInfor 所引用的 ClassMap 爲 WikiPeople,表示 wikiInfor 的取值來源於 WikiPeople 對應的表,而不是 HomepagePeople 對應的表;d2rq:join 描述了 wikiInfor 引用 WikiPeople 的條件,這裏給出了兩個條件,即 HomepagePeople 與 WikiPeople 的 email 相同並且 HomepagePeople 的 organization 與 WikiPeople 的 employer 相同。在這兩個條件同時滿足的情況下,wikiInfor 纔會生成具體的值,使得從一個 HomepagePeople 的實例資源可以跳轉到他相應的 WikiPeople,如圖 9 所示:

圖 9. 用 D2R Server 展示 wikiInfor 屬性
圖 9. 用 D2R Server 展示 wikiInfor 屬性

相比圖 7 可以看出,類資源 HomepagePeople 多了一條定製的關係屬性 wikiInfor。

清單 5 列舉了一個更復雜的屬性 coauthor。該屬性連接了 HomepagePeople 與 Author。當瀏覽 HomepagePeople 的實例資源時,可以跳轉到與其共同發表過論文的作者。這個關係需要關聯三張表,HomepagePeople,Author 以及 Paper2Author。從 HompagePeople 到 Author 通過 Email 以及 Organization 關聯,從 Author 到 Paper2Author 通過 AuthorID 關聯。注意在這些 join 條件中,Author 與 Paper2Author 分別出現了兩次,因此需要使用 d2rq:alias 聲明別名。此外,我們不希望 coauthor 列表中包括自己,因此需要使用 d2rq:condition 聲明一條不相等關係。

清單 5. 自定義的屬性 coauthor
 map:coauthor a d2rq:PropertyBridge; 
 d2rq:belongsToClassMap map:HomepagePeople; 
 d2rq:property vocab:Coauthor; 
 d2rq:refersToClassMap map:Author; 

 d2rq:join "ZJ.HOMEPAGEPEOPLE.EMAIL => ZJ.AUTHOR.EMAIL"; 
 d2rq:join "ZJ.HOMEPAGEPEOPLE.ORGANIZATION => ZJ.AUTHOR.ORGANIZATION"; 
 d2rq:join "ZJ.AUTHOR.AUTHORID => ZJ.PAPER2AUTHOR.AUTHORID"; 
 d2rq:join "ZJ.PAPER2AUTHOR.PAPERID => P2A2.PAPERID"; 
 d2rq:join "P2A2.AUTHORID = A2.AUTHORID"; 

 d2rq:alias "ZJ.HOMEPAGEPEOPLE AS P2"; 
 d2rq:alias "ZJ.AUTHOR AS A2"; 
 d2rq:alias "ZJ.PAPER2AUTHOR AS P2A2"; 

 d2rq:condition "ZJ.AUTHOR.AUTHORID <> A2.AUTHORID";

從圖 10 可以看出,相比圖 9,類資源 HomepagePeople 多了一條定製的關係屬性 coauthor。

圖 10. 用 D2R Server 展示 coauthor 屬性
圖 10. 用 D2R Server 展示 coauthor 屬性

經過上述兩條關係屬性的定製,圖 3 中默認的概念模型擴展爲圖 11 中新的概念模型:

圖 11. 擴展的概念模型
圖 11. 擴展的概念模型

此外,讀者如果希望從自己的數據源鏈接到 Web 上其它數據源,必須創建它們的關係並將其額外存儲在一個真實的 RDF 數據庫中。訪問的時候,一方面去查詢 D2R 轉換的虛擬 RDF 數據庫,同時要查詢這個真實的 RDF 數據庫,使得所有的內部與外部關係都被查詢出來。本文將不介紹如何創建這些關係,有興趣的讀者可以參看 Silk,它是一個在不同 Linked data 數據源之間發現關係的工具。

結束語

本文介紹瞭如何使用 D2R 工具將關係型數據庫的數據發佈爲 Linked data,重點介紹了 D2R 的基本概念,使用步驟(包括直接訪問 D2R Server 以及通過 Jena API 調用兩種使用方式)以及定製 Mapping 文件創建關聯屬性的方法。有關 Linked data 發佈及關係創建的工具有很多種,感興趣的讀者可以參考 ESW Wiki


參考資料

  • Christian Bizer, Tom Heath, Tim Berners-Lee. Linked data So Far. IJSWIS ’ 09. Linked data 發展現狀。
  • 如何發佈 Linked Data:本教程講述瞭如何在 Web 上發佈 Linked Data。再簡單介紹了一些 Linked Data 的概念以後,本文爲您介紹了一些將信息發佈成爲 Linked Data 的最佳實踐。
  • D2R Server: 如何將關係型數據發佈爲 Linked Data。
  • Resource Description Framework (RDF) : RDF 介紹。
  • SPARQL Query Language for RDF : SPARQL 查詢語言介紹。
  • Jena API Java:Jena 的 API 文檔。
  • SILK: 在不同 Linked data 的數據源之間發現關係的工具。
  • ESW Wiki: 介紹將其它格式的數據轉化爲 RDF 的工具。
  • 對於怎麼比較有相等語義的 XML 的建議”(developerWorks,2001 年 7 月):對於怎麼比較有相等語義的 XML 的建議。
  • XML+RDF ——實現 Web 數據基於語義的描述”(developerWorks,2003 年 10 月):本文介紹了 XML 結合 RDF 實現 Web 數據基於語義的描述。
  • 標準 Web 服務的語義請求和響應”(developerWorks,2004 年 11 月):本文說明了如何用語義請求和響應概念來明確規範化地理空間 Web 服務的開發和利用。
  • Thinking XML:利用模式標準化實現自上而下的語義透明”(developerWorks,2005 年 5 月):本期文章將繼續探討語義透明的許多不同方法,介紹這些方法對使用 XML 的開發人員的影響。長途旅行中節省體力的一種辦法是搭便車。在 XML 中,可以利用數不清的開放的模式計劃,其結果就是通過模式標準化實現自上而下的語義透明。但這並非完全免費的搭便車。在文中,Uche Ogbuji 將考察第三方模式重用的優缺點。他還提到了 The Semantic Technology Conference 2005,對最近關於姓名建模困難的討論作了答覆。
  • Web 的未來是語義的”(developerWorks,2005 年 12 月):作者在向您介紹組織如何利用基於存在論開發的同時,還探索了語義 Web 技術的基礎。語義 Web 有助於有效的知識管理和有成本效益的產品生命週期自動化,實現更快的開發和集成過程。
  • 終極 Mashup —— Web 服務和語義 Web,第 1 部分 : 使用與組合 Web 服務”(developerWorks,2006 年 11 月):本系列按順序記錄了一個終極 mashup 應用程序的創建過程,它不僅存儲來自不同 mashup 的數據,而且使用語義技術讓能夠用戶通過交換服務或選擇數據來創建自己的 mashup。該程序採用 Java 編寫,結合了開放源碼 Jena 項目的 servlet、JSP、軟件以及 DB2 新增的原生 XML 能力。在這一期中,Nicholas Chase 介紹了 mashup 的概念,說明了 mashup 的工作原理,以及構建簡單 mashup 的方法。
  • developerWorks 技術活動網絡廣播:隨時關注 developerWorks 技術活動和網絡廣播。
  • developerWorks Web development 專區:通過專門關於 Web 技術的文章和教程,擴展您在網站開發方面的技能。

還有一個網友的補充:

很不錯的技術文檔!
補充兩點:
(一).原文提到:使用 Jena API 構建自己的應用....《《首先需要在你的工程中引用 D2RQ 與 Jena 相關的 jar 包:
1.將你下載的 D2R server 目錄下的 lib/d2rq-0.7.jar 加入你工程的 classpath;》》,但用MySql時會跑出ClassNotFound異常,解決辦法是將D2R server 目錄/lib/下的所有jar文件都添加到你工程的classpath.
(二).原文: 《《清單 2. 使用 Jena API 的 SPARQL 查詢 ..... String SPARQLPrefix = "PREFIX vocab: http://localhost:2020/vocab/resource/"; ..》》,關於前綴Prefix的設定最好粘貼mapping文件中的prefix部分,以避免出現前綴錯誤、找不到前綴相關詞彙無法解釋的異常。 如:\t\t String SPARQLPrefix =" PREFIX dc: <http://purl.org/dc/elements/1.1/> "+
" PREFIX foaf: <http://xmlns.com/foaf/0.1/> "+
" PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> "+
" PREFIX dcterms: <http://purl.org/dc/terms/> "+
" PREFIX iswc: <http://annotation.semanticweb.org/iswc/iswc.daml#> " +
" PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> "+
" PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> "+
" PREFIX owl: <http://www.w3.org/2002/07/owl#> "+
" PREFIX map: <file:/Users/richard/D2RQ/workspace/D2RQ/doc/example/mapping-iswc.n3#> "+...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章