将关系数据转换为 RDF 格式

本教程将介绍两种不同的将关系数据转换或具体化为 RDF 图形数据格式的方法。

大约 1 个小时

主题

本教程包括下列主题:

使用基于 D2RQ 的方法

使用基于 SQL 的方法

将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。

概述

本教程将介绍两种不同的将关系型数据转换或具体化为 RDF 图形数据格式的方法。生成的 RDF 数据遵守 W3C 标准。它可由任何遵守 W3C 标准的工具或 RDF 数据存储(如 Oracle 数据库 11g)处理。

我们建议使用基于 D2RQ 的方法,因为 D2RQ 提供可定制的映射文件,这些文件允许用户指定 URI 的生成,从而实现跨不同的列、表、模式、甚至数据库的 URI 重用。

这里,URI 重用的意思是使用同一 URI 来表示同一资源。注意,在本教程中介绍的基于 SQL 的方法不处理转义、字符编码、换行、制表符和其他特殊字符。

返回主题列表

前提条件

开始本教程之前,您应该:

1.

安装 Oracle 数据库 11g 企业版。确保安装了 Oracle Spatial 11g 选件、Oracle Partitioning 选件和 Oracle Advanced Compression 选件。

2.

运行 11g 中语义技术支持所要求的步骤。按照 https://metalink.oracle.com 上以下注释中的步骤进行操作:

注释 452989.1:11g 中语义技术支持所要求的步骤

3. 安装 11.1.0.6.0 语义技术补丁。

注:如果安装了 Oracle 数据库 11.1.0.7.0 或更高版本的补丁集,则不必执行此操作。

登录到 Metalink(位于 https://metalink.oracle.com),并单击 Patches & Updates 选项卡。选择“Simple Search”,并在 Search by 下拉列表中选择 Patch Number(s)。输入补丁号 7032734。选择平台或语言。单击 GO

要安装补丁,请阅读 jenadrv_patch_ig.txt 文件中的说明。

4. 设置数据库以支持语义网。如果没有进行设置,按照 https://metalink.oracle.com 上以下注释中的步骤进行操作:

注释 454371.1:如何设置数据库以实现语义网支持?

5. 安装 D2RQ。可以从以下站点 http://www4.wiwiss.fu-berlin.de/bizer/d2rq/ 下载它。

单击主页左侧的 Download 的链接。单击 D2RQ and D2R Server。然后单击 D2RQ API for Jena and Sesame(版本 v0.5.1)。下载 .gz 或 .zip 格式(两者都独立于平台)。

下载完成后,解压缩到您的计算机上的一个目录中。

要了解更多关于 D2RQ 和 D2R 服务器的信息,参见 http://www4.wiwiss.fu-berlin.de/bizer/d2rq/spec/

注:对于本教程,不必查看 D2RQ 站点的文档。

返回主题列表

使用基于 D2RQ 的方法

本主题通过一个小示例演示 D2RQ 的使用。

在本主题中,执行以下步骤:

设置用户和表
生成 N3 格式的映射文件
使用映射文件生成 N-Triple 数据文件
可以选择更改 N3 文件以满足您的需要

设置用户和表

以下 SQL 语句创建了一个简单的员工表,该表对员工等级结构进行建模。表中插入了几个示例行。在下列主题中,您首先要使用 D2RQ v0.5.1 生成 N3 [4] 格式的映射文件。

1.

创建一个新用户 test。将 connectresource 权限授予该用户。

sys 用户身份登录,然后运行以下 SQL 语句:

grant connect, resource to test; 

2.

test 用户身份连接。创建一个简单的表 emp 对员工等级结构进行建模。

要创建 emp 表,运行以下语句:

conn test/test
create table emp (ID integer primary key,
name varchar2(30),
sex varchar2(1),
birth_year int,
report_to integer
);

3.

emp 表中插入几个示例行。运行以下 INSERT 语句:

insert into emp values(1, 'John', 'M', 1980, 2); 
insert into emp values(2, 'Mary', 'F', 1981, 3);
insert into emp values(3, 'Jack', 'M', 1982, 3);

使用以下命令提交插入的行:

commit;

返回主题

生成 N3 格式的映射文件

在以下步骤中,您将使用 D2RQ v0.5.1 生成 N3 格式的映射文件。

1.

此处下载 batch_files.zip。将两个批处理文件(gen_map.bat、dump_rdf.bat)解压缩至您本地计算机上的文件夹中。

打开 gen_map.bat 文件,编辑该文件以根据您的设置对其进行自定义。

通用语法(d2rq.generate_mapping 类):

<jdk_path>\bin\java –classpath <classpath> d2rq.generate_mapping
-u <username>
-p <password>
-d oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@HOSTNAME:PORT:SID > output_file.n3


检查 gen_map.bat 文件中的以下组件:

%ORACLE_HOME%\jdk\bin\java 这是 jave 可执行文件。很可能不需要修改它。确保已设置 ORACLE_HOME
<ORACLE_HOME>\jdbc\lib\ojdbc5.jar 这是 Oracle 的 jdbc 的 jar 文件。使用您的 ORACLE_HOME 字符串值替换
<PATH_TO_D2RQ>\d2rq-0.5.1 这是 D2RQ 的安装目录。使用您在其中解压缩 D2RQ 的目录替换。在所有出现的地方完成替换。
d2rq.generate_mapping 这是您使用的 D2RQ 主类。不要更改它。
-u test -p test 假定用户名和口令为 test,不要更改它。
-d oracle.jdbc.driver.OracleDriver 这是 jdbc 连接至数据库所使用的类。不要更改它。
jdbc:oracle:thin:@hostname:port:SID > employee.n3

这是 jdbc 数据库连接。

hostname 更改为您的计算机名称。将 port 更改为您的监听器端口。将 SID 更改为您的实例 SID。

employee.n3 为输出文件的名称,保持不变。

注:应根据您的设置编辑以红色三角形标记的占位符。文件中多次出现 <PATH_TO_D2RQ>。确保正确替换它们。

2.

打开一个命令窗口。转至您在其中保存了 gen_map.bat 文件的文件夹。运行该批处理文件。它输出一个使用 N3 语法编码的映入文件 employee.n3。

Note: Before you run this batch file, ensure ORACLE_HOME is set. 

注:在 Windows 环境中执行批处理文件时,默认在 >employee.n3 前添加“1”。编辑 gen_map.bat 文件时,不要在 >employee.n3 前添加“1”。

这将在您从中运行批处理文件的文件夹中生成 employee.n3 文件。

返回主题

使用映射文件生成 N-Triple 数据文件

您可以更改 N3 格式文件,但在本教程中,您将直接使用它,通过以下步骤生成 RDF 文件(n-triple 格式)。注意 N-TRIPLE 为指定输出格式。而且提供了基 URI,用于解析相关 URI 模式。

1.

打开 dump_rdf.bat。根据您的设置,编辑文件以进行自定义。

通用语法(d2rq.dump_rdf 类):

<jdk_path>\bin\java -classpath <classpath> d2rq.dump_rdf
-u <username>
-p <password>
-d oracle.jdbc.driver.OracleDriver
-j jdbc:oracle:thin:@HOSTNAME:PORT:SID
-m employee.n3
-f N-TRIPLE
-b http://test.com/
> emp_table.ntriple

除前一主题第 1 步显示的组件外,其他组件为:

d2rq.dump_rdf 这是用于转换的主要 Java 类。
-f N-TRIPLE 这是输出格式。不要更改它。
-b http://test.com/ 这是基 URI。对于本教程,不要更改它。

注意,在这种情况下,在 jdbc:oracle:thin:@hostname:port:SID 行的前面,您需要添加一个在以前的 java 命令中不要求的 -j 参数。

注:应根据您的设置编辑以红色框标记的占位符。文件中多次出现 <PATH_TO_D2RQ>。确保正确替换它们。

2.

在命令窗口中,转至您在其中保存了 dump_rdf.bat 文件的文件夹。运行该批处理文件。

注:确保 ORACLE_HOME 设为相应的路径后再运行批处理文件。

注:在 Windows 环境中执行批处理文件时,默认在 >emp_table.ntriple 前添加“1”。编辑 emp_table.ntriple 文件时,不要在 >emp_table.ntriple 前添加“1”。

3.

在记事本中打开生成的 emp_table.ntriple 文件。屏幕截图显示了输出

返回主题

可以选择修改 N3 文件以满足您的需要

根据您的应用程序的要求,可以接受这些生成的三元组。但是,情况并不总是这样。例如,可以对首个三元组作出一个明显的改进。它使用类型文字作为“report_to”属性(关系)的对象值,该属性对应于关系表中的原“report_to”列。对于“report_to”属性的对象值(在上面屏幕截图中用红框高亮显示),不要使用普通的十进制数值,而是使用 URI 更为合适,这样生成的三元组集将组成更为有效的链接图。

1.

在记事本中打开 employee.n3 文件。在映射文件 employee.n3 中查找以下描述:

map:EMP_REPORT_TO a d2rq:PropertyBridge;

替换以下整个描述:

从:

map:EMP_REPORT_TO a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:TEST_EMP;
d2rq:property vocab:EMP_REPORT_TO;
d2rq:column "TEST.EMP.REPORT_TO";
d2rq:datatype xsd:decimal;


替换为:

map:EMP_REPORT_TO a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:TEST_EMP;
d2rq:property vocab:report_to;
d2rq:uriPattern "TEST.EMP/@@TEST.EMP.REPORT_TO@@";

屏幕截图高亮显示的文本将类型文字更改为 URI,作为对象值。

保存此文件。

2.

重新运行 dump_rdf.bat 批处理文件,生成包含以下代码片段的新 N-Triple 文件。

较之使用默认的映射文件生成的文件,三元组无疑能更好地对原关系数据进行建模。

检查屏幕截图。

如果您不满意 URI 中包含模式名称(如上面代码片段中所示的“TEST”)的情况,可以更改映射文件以跳过模式名称。参见 D2RQ 文档了解详细信息:http://www4.wiwiss.fu-berlin.de/bizer/d2rq/spec/

返回主题

返回主题列表

使用基于 SQL 的方法

SQL 语句可用于从关系型表中直接生成 RDF 数据。您可以编写简单的查询以生成用于捕获“report_to”关系的三元组。

在本主题中,执行以下步骤:

使用 SELECT 语句
在 SELECT 语句中使用 UNPIVOT

使用 SELECT 语句

1.

使用 test/test 用户名/口令连接。

运行以下简单的查询以生成用于捕获“report_to”关系的三元组。

注:以下 SQL 非常简单。然而,它对于确保生成的数据遵守 N-Triple 语法是很重要的。参见 http://www.w3.org/TR/2004/REC-rdf-testcases-20040210/ 上的 RDF 测试用例文档的第三部分,了解清楚说明的语法。

select  '<http://test.com/TEST.EMP/' || ID || '> ' 
|| '<http://test.com/vocab/report_to> '
|| '<http://test.com/TEST.EMP/' || REPORT_TO || '> '
|| ' .'
from emp;

返回主题

在 SELECT 语句中使用 UNPIVOT

1.

按照同一方法,您可以编写单独的 SELECT 语句为每个相关列生成三元组。

如果关系型表中有多个列,这一过程会变得单调乏味。一个更为简洁的方法是使用 UNPIVOT 从多个列中将值移到多个输出行中。

例如,下面的 SQL 将四个列(ID、REPORT_TO、BIRTH_YEAR、NAME) unpivot 为四个单独的行,每行表示一个三元组。

运行以下语句:

col subject format a33
col object format a33

select * from (
   select '<http://test.com/TEST.EMP/' || id || '>' as subject,
           to_char(id) as id,
           to_char(report_to) as report_to,
           to_char(birth_year) as birth_year,
           name as name
   from emp
  )
 UNPIVOT (object for predicate 
    in (id as 'ID',
        report_to as 'REPORT_TO',
        birth_year as 'BIRTH_YEAR',
        name as 'NAME'
       ));

前一屏幕截图中的每行映射至三个列值中每个列值的单个三元组。

可能需要进行其他的数据处理,包括相应的 URI/文字生成、实际的字符转义和 N-Triple 格式遵守。

返回主题

返回主题列表

在本课程中,您学习了如何执行下列任务

返回主题列表

注解 3 (N3):http://www.w3.org/DesignIssues/Notation3.html

返回主题列表

将鼠标置于该图标上可以隐藏所有的屏幕截图。