使用 Oracle Spatial 11g 选件进行 RDF 语义数据管理
使用 Oracle Spatial 11g 选件进行 RDF 语义数据管理
本教程介绍如何使用 Oracle 数据库 11g 中 Oracle Spatial 选件的语义数据管理功能来存储和查询美国国家癌症研究所 (NCI) 语义网本体。
大约 1 个小时
本教程包括下列主题:
将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)
注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。
使用 Oracle 数据库 11g 中 Oracle Spatial 选件的语义数据管理概述
作为 Oracle Spatial 11g(Oracle 数据库 11g 企业版的一个选件)的一部分,Oracle 提供了在任何其他商业或开源的三元组存储中都找不到的高级语义数据管理功能。由于该语义数据存储自身支持 RDF/RDFS/OWL 标准,因此它使应用程序开发人员在构建基于 RDF 和 OWL 的应用程序时可以获益于一个开放、可扩展、安全、集成、有效的平台。
这些语义数据库特性实现了:
 |
对 RDF/OWL 数据和本体的存储、加载和 DML 访问 |
 |
使用 OWL 和 RDFS 语义以及用户定义的规则进行推理 |
 |
使用类似于 SPARQL 的图形模式对 RDF/OWL 数据和本体进行 SQL 查询 |
 |
对企业(关系)数据的本体辅助查询 |
本教程假设您熟悉有关 RDF 和 OWL 的主要概念,例如 {主题、谓词、对象} 三元组、URI、空白节点、文本类型文字以及本体。本演示不详细解释这些概念,而是重点讨论如何在 Oracle 数据库中设置演示以使用本体。数据库包含语义数据和本体(RDF/OWL 模型)以及传统的关系数据。要加载语义数据,虽然可以使用 INSERT 事务处理语句递增地加载数据,但是批量加载是最有效的方法。在本演示中,您将执行批量加载。
NCI 语义网简介
本示例使用的是企业词汇系统 (EVS) 开发的 NCI 词库,企业词汇系统是 NCI 生物信息中心 (NCI Center for Bioinformatics) 和 NCI 通讯办公室 (NCI Office of Communications) 的合作项目。美国国家癌症研究所 (NCI) 隶属于美国马里兰州 20892 贝塞斯达市的国家卫生研究院。
NCI 词库的 OWL 版由 EVS 与马里兰信息和网络动态实验室的 Jim Hendler 和 Jen Golbeck 联合开发。马里兰信息和网络动态实验室隶属于美国马里兰州学院公园市的马里兰大学语义 Web 代理项目 (Mindswap)。
本体 URI:http://www.mindswap.org/2003/nciOncology.owl
版本:03.09d
默认命名空间:http://www.mindswap.org/2003/nciOncology.owl#
命名空间前缀:
- xsd http://www.w3.org/2001/XMLSchema#
- rdfs http://www.w3.org/2000/01/rdf-schema#
- rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#
- owl http://www.w3.org/2002/07/owl#
17 个一级类为:
- Anatomy_Kind
- Biological_Process_Kind
- Chemicals_and_Drugs_Kind
- Chemotherapy_Regimen_Kind
- Clinical_or_Research_Activity_Kind
- Diagnostic_and_Prognostic_Factors_Kind
- EO_Anatomy_Kind
- EO_Findings_and_Disorders_Kind
- Equipment_Kind
- Findings_and_Disorders_Kind
- Gene_Kind
- NCI_Kind
- Organism_Kind
- Properties_or_Attributes_Kind
- Protein_Kind
- Retired_Kind
- Technique_Kind
返回主题列表
您将创建一个名为 nciuser 的模式用户,该用户拥有三个表:
- NCI_RDF_DATA:这是用来存储模型中的三元组代码的模型表。
- STABLE: 这是保存从 N-Triple 格式批量加载的三元组的临时表。
- PATIENTS_DATA:这是用来模拟病人信息的应用程序表。
将数据载入名为 nci 的语义模型中。这会将数据载入表 nci_rdf_data 中。然后,使用随机数据填充 PATIENTS_DATA 表来模拟病人信息,并使用语义操作符来查询模型和病人表。
返回主题列表
开始本教程之前,您应该:
| 1. |
安装 Oracle 数据库 11g。安装 Oracle Examples Media 11g。
|
| 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. |
确保已解除对用户帐户 mdsys 的锁定。以 sys 用户身份登录,然后使用以下语句来解除对 mdsys 的锁定。
alter user mdsys identified by mdsys account unlock;
|
返回主题列表
作为前提条件,您必须已经创建并配置了一个表空间 rdf_tablespace,用以存储语义网支持。以下步骤将另外创建两个表空间:rdf_users 表空间(nciuser 模式的默认表空间)将存储用户对象,rdf_temp(nciuser 的临时表空间)将用于 nciuser 模式执行的操作。在本主题中,您还将创建 nciuser 和模型。
|
1.
|
启动 SQL*Plus。出现输入用户名的提示时,输入以下信息以特权用户身份登录:
sys/oracle as sysdba

|
|
2.
|
运行以下命令创建 rdf_users 表空间:
注:在 datafile 路径中,将 <user_name> 和 <SID> 替换为 ORACLE_HOME 的相应文件夹名称。
create tablespace rdf_users datafile 'c:\app\<user_name>\oradata\<SID>\rdf_users01.dbf' size 128M reuse autoextend on next 64M maxsize unlimited segment space management auto;

5
|
| 3. |
运行以下命令创建 rdf_temp 表空间:
注:在 tempfile 路径中,将 <user_name> 和 <SID> 替换为 ORACLE_HOME 的相应文件夹名称。
create temporary tablespace rdf_temp tempfile 'c:\app\<user_name>\oradata\<SID>\rdf_temp01.dbf' size 128M reuse autoextend on next 32M maxsize unlimited;

|
| 4. |
在 SQL*Plus 提示符下输入以下命令,创建 nciuser 并授予用户必要的权限:
create user nciuser identified by nciuser default tablespace rdf_users temporary tablespace rdf_temp;
grant create session, resource to nciuser;
|
| 5. |
以 nciuser/nciuser 用户名/口令连接。
创建模型表 nci_rdf_data,用以存储 NCI 模型中的三元组代码。在 SQL*Plus 提示符下输入以下命令:
connect nciuser/nciuser;
create table nci_rdf_data
(id number,
triple sdo_rdf_triple_s);
execute sem_apis.create_sem_model('nci', 'nci_rdf_data', 'triple');
|
返回主题列表
在本主题中,您将使用 SQL*Loader 实用程序加载临时表 stable。
| 1. |
假设您仍然以 nciuser 身份连接,创建一个临时表 stable。输入以下命令创建该表:
create table stable (
RDF$STC_sub varchar2(4000) not null,
RDF$STC_pred varchar2(4000) not null,
RDF$STC_obj varchar2(4000) not null,
RDF$STC_sub_ext varchar2(64),
RDF$STC_pred_ext varchar2(64),
RDF$STC_obj_ext varchar2(64),
RDF$STC_canon_ext varchar2(64)
);
|
| 2. |
授予 mdsys 对 nci_rdf_data 表的插入权限。此外,授予 mdsys 模式对 stable 表的选择、更新权限。运行以下命令:
grant insert on nci_rdf_data to mdsys;
grant SELECT, UPDATE(RDF$STC_sub_ext,RDF$STC_pred_ext,RDF$STC_obj_ext,RDF$STC_canon_ext)
on stable to MDSYS;

|
| 3. |
打开一个命令窗口。使用 sqlloader 将 nci_z.nt 文件载入临时表 stable 中。
注: 确保已下载并解压缩了文件 nci_z.zip,以便在执行 sqlldr 命令前将 nci_z.nt 准备就绪(注意 nci_z.nt 文件的大小约为 80MB)。
此处提供了本教程使用的 nci_z.zip 文件。
注: 转至包含 nci_z.nt 文件的文件夹。将 ORACLE_HOME 设置为相应的路径。
sqlldr userid=nciuser/nciuser control=%ORACLE_HOME%\md\demo\network\rdf_demos\bulkload.ctl data=nci_z.nt direct=true skip=0 load=1000000 discardmax=0 bad=d0.bad discard=d0.rej log=d0.log errors=100000000

这需要一些时间。请等待,直至收到以下消息:Load completed - logical record count 464841。
|
| 4. |
将数据从临时表载入模型。bulk_load_from_staging_table 过程的语法为:
exec sem_apis.bulk_load_from_staging_table('<model_name>',
'<owner of the staging table>',
'<staging table name>');
Run the following:
exec sem_apis.bulk_load_from_staging_table('nci','nciuser','stable');

|
| 5. |
运行以下语句创建规则索引:
execute sem_apis.create_entailment('nci_idx',sem_models('nci'), sem_rulebases('owlprime'),0, null);

|
返回主题
现在,您将执行一个过程,在 PATIENTS_DATA 表中插入 100,000 行。请注意,此过程假设 mdsys 用户口令为“mdsys”。
| 1. |
运行创建 build_patients 过程的脚本前,以 mdsys 身份连接,然后将 serveroutput 设置为 on。
connect mdsys/mdsys
set serveroutput on
|
| 2. |
运行 build_patients.sql 脚本。从此处的 build_patients.zip 文件提取 build_patients.sql 脚本。
此脚本创建了一个过程 build_patients。要运行该脚本,在本地计算机上保存该脚本,然后在 sql 提示符下运行该脚本,如下所示:
@c:\<path where you saved the script>\build_patients.sql;
注:将 <path where you saved the script> 替换为在其中保存了 build_patients.sql 文件的文件夹的路径。
|
| 3. |
如果过程编译出现错误,输入 show errors 查看错误。否则,将对 build_patients 过程的执行权限授予 public。运行以下语句。
grant execute on build_patients to public;
|
| 4. |
以 nciuser 身份连接并运行 build_patients 过程。运行以下语句:
connect nciuser/nciuser;
exec mdsys.build_patients(100000, 1, 'patients_data');

|
| 5. |
确认已将数据载入 patients_data 表。运行以下查询:
select count(*) from patients_data;
|
返回主题列表
使用 SEM_RELATED 操作符时,可以在包含本体术语的列上创建一个 MDSYS.SEM_INDEXTYPE 类型的语义索引。创建这样的索引可以提高查询效率。CREATE INDEX 语句必须包含 INDEXTYPE IS MDSYS.SEM_INDEXTYPE 子句,以指定要创建的索引类型。
| 1. |
假设您仍然以 nciuser 身份连接,在 patients_data 表上创建索引 nciIndex。运行以下语句:
create index nciIndex on patients_data(diagnosis)
indextype is mdsys.sem_indextype parameters ('ONTOLOGY_MODEL(NCI), RULEBASE(owlprime)');
|
| 2. |
在表上收集统计信息。运行以下语句:
execute dbms_stats.gather_index_stats('nciuser','nciIndex');

|
返回主题列表
根据表列中的数据和本体中的术语间的语义关系,可以使用语义操作符以本体辅助的方式查询关系数据。SEM_RELATED 语义操作符根据语义相关度对行进行检索。SEM_DISTANCE 语义操作符返回语义相关度的距离测量值,因此可以使用距离测量值对 SEM_RELATED 操作符返回的行进行排序或限定。以下是一些使用 SEM_MATCH 和 SEM_RELATED 操作符进行的各种简单查询:
| 1. |
以 nciuser/nciuser 用户名/口令连接。以下查询使用 SEM_MATCH 函数,以显示所有 Class 类型的“主题”。这些包括了本体中的所有类。
select s
from table(sem_match ('(?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
<http://www.w3.org/2002/07/owl#Class>)',
sem_models('nci'),
null,
null,
null));
Note: The screenshot shows only the partial output.
|
| 2. |
以下查询返回以 Finger_Fracture 为“主题”的三元组。请注意,变量“p”和“o”的含义是“任何谓词”和“任何对象”。
select p, o from table(sem_match ( '(<http://www.mindswap.org/2003/nciOncology.owl#Finger_Fracture> ?p ?o )', sem_models('nci'), null, null, null));
|
| 3. |
以下查询使用了 sem_match 函数,以提取所有为 Finger_Fracture“子类”的“对象”,并使用了通过“owlprime”规则库进行的推理。
select o from table(sem_match ( ' (<http://www.mindswap.org/2003/nciOncology.owl#Finger_Fracture> <http://www.w3.org/2000/01/rdf-schema#subClassOf> ?o)', sem_models('nci'), sem_rulebases('owlprime'), null, null));

|
| 4. |
以下查询使用了 SEM_DISTANCE 和 SEM_RELATED 操作符,将关系表 (PATIENTS_DATA) 关联到 NCI 模型。使用变量“diagnosis”代表 PATIENTS_DATA 表中的 DIAGNOSIS 列,并查询是 Upper_Extremity_Fracture“子类”的 diagnosis。
select diagnosis, SEM_DISTANCE(123) from patients_data where sem_related (diagnosis, '<http://www.w3.org/2000/01/rdf-schema#subClassOf>', '<http://www.mindswap.org/2003/nciOncology.owl#Upper_Extremity_Fracture>', sem_models('nci'), sem_rulebases('owlprime'), 123) = 1 ORDER BY SEM_DISTANCE(123) asc;
注:由于 PATIENTS_DATA 表是使用随机数据构建的,因此您得到的结果可能有所不同。
|
| 5. |
在前面的 SELECT 语句中,从 PATIENTS_DATA 表返回了所有满足条件的 diagnosis,这在需要罗列所有的病人时很有用,但是,如果只想了解另一种是 Upper_Extremity_Fracture“子类”的 diagnosis,则可以添加不同的操作,如以下查询所示:
select distinct diagnosis, SEM_DISTANCE(123) from patients_data where sem_related(diagnosis, '<http://www.w3.org/2000/01/rdf-schema#subClassOf>', '<http://www.mindswap.org/2003/nciOncology.owl#Upper_Extremity_Fracture>', sem_models('nci'), sem_rulebases('owlprime'), 123) = 1 ORDER BY SEM_DISTANCE(123) asc;
Note: You may get different results as the PATIENTS_DATA table is built with random data.
|
| 6. |
以下查询显示了 diagnosis 是 Connective_Tissue_Disorder 子类的病人。
select distinct diagnosis, SEM_DISTANCE(123) from patients_data where sem_related(diagnosis, '<http://www.w3.org/2000/01/rdf-schema#subClassOf>', '<http://www.mindswap.org/2003/nciOncology.owl#Connective_Tissue_Disorder>', sem_models('nci'), sem_rulebases('owlprime'), 123) = 1 ORDER BY SEM_DISTANCE(123) asc;
|
返回主题列表
本教程介绍了 NCI 模型并提供了本体的概述。
在本教程中,您学习了如何:
 |
创建存储 RDF 数据的基础架构和模型 |
 |
将 RDF 数据载入模型和病人表 |
 |
创建语义索引 |
 |
查询模型和病人表以提取信息 |
返回主题列表
将鼠标置于该图标上可以隐藏所有的屏幕截图。
|