如何利用 D2R 发布 Linked data

来源:互联网 发布:哈希算法 编辑:程序博客网 时间:2024/06/06 01:08

转载: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:baojie@cs.rpi.edu, paper:file:///D:/Academic2.n3#ZJ.PAPER/1  name:Li Ding, email:dingl@cs.rpi.edu, paper:file:///D:/Academic2.n3#ZJ.PAPER/1  name:Deborah McGuinness, email:dlm@cs.rpi.edu, paper:file:///D:/Academic2.n3#ZJ.PAPER/1  name:James Hendler, email:hendler@cs.rpi.edu, paper:file:///D:/Academic2.n3#ZJ.PAPER/1  name:James Hendler, email:hendler@cs.rpi.edu, paper:file:///D:/Academic2.n3#ZJ.PAPER/3  name:James Hendler, email:hendler@cs.rpi.edu, paper:file:///D:/Academic2.n3#ZJ.PAPER/2  name:Jennifer Golbeck, email:jgolbeck@umd.edu, paper:file:///D:/Academic2.n3#ZJ.PAPER/2  name:Jennifer Golbeck, email:jgolbeck@umd.edu, 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#> "+...

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我儿子十岁老是偷钱怎么办 13孩子偷同学钱怎么办 孩子偷同学的钱怎么办 儿子十四岁了老偷钱怎么办 发现初中生的儿子偷钱怎么办 被亲戚怀疑儿子偷钱怎么办 房门选的太白了怎么办 大厅地砖颜色比墙砖浅怎么办 房屋外墙渗水物业不管怎么办 走丢了怎么办教学反思 托班教案迷路了怎么办 大班安全教案遇到小偷怎么办 小班孩子舞台表演找不到位置怎么办 懂你英语学完了怎么办 小班社会走丢了怎么办 帮小老鼠搬鸡蛋怎么办 小老鼠还能怎么办鸡蛋 中班教案走丢了怎么办 走丢了怎么办可后反思 社会走丢了怎么办教案 孩子一直不吃幼儿园的饭怎么办 大班安全游泳抽筋怎么办反思 汤洒了怎么办教学反思 迷路了怎么办小班详案 大班牙又痛又摇怎么办 大班安全教案着火了怎么办 小班社会生病了怎么办反思 脚扭伤了怎么办的反思 中班安全迷了眼怎么办 15个月的小孩长泡疹怎么办 墨盒加错颜色墨水怎么办 墨盒颜色加错了怎么办 uV打印有色差是怎么办 cmyk和rgb有色差怎么办 染头发新长出来怎么办 白色衣服弄上口红怎么办 口红弄到牛仔裤上怎么办 口红弄到沙发上怎么办 做了拔罐后背疼怎么办 拔罐拔出血水后怎么办 拨了罐浑身疼怎么办