Oracle Spatial 11gオプションを使用したRDFセマンティック・データの管理

このチュートリアルでは、Oracle Database 11gのOracle Spatialオプションのセマンティック・データ管理機能を使用して、NCI(National Cancer Institute)のセマンティック・ネットワーク・オントロジーにデータを格納し、問合せをおこなう方法について説明します。

約1時間

トピック

このチュートリアルでは、以下のトピックについて説明します。

RDFデータを保持するためのインフラストラクチャとモデルの作成

モデルへのRDFデータのロード

PATIENTS_DATA(患者データ)表のロード
セマンティック索引の構築

モデルの問合せ

このアイコンの上にカーソルを置くと、このチュートリアルのすべてのスクリーンショットがロードされて、表示されます。 (警告: すべてのスクリーンショットが同時にロードされるため、ご使用のインターネット接続によってはレスポンス・タイムが遅くなる場合があります。)

注: 各手順に関連したスクリーンショットのみをロードして表示する場合は、それぞれの手順にあるアイコンの上にカーソルを置いてください。 スクリーンショットをクリックすると、非表示になります。

概要

Oracle Database 11gのOracle Spatialオプションを使用したセマンティック・データ管理の概要

Oracle Database 11g Enterprise EditionのオプションであるOracle Spatial 11gは、ほかの商業製品やオープン・ソースのトリプル・ストアにはない高度なセマンティック・データ管理機能を備えています。 このオプションは、Oracle Database 11gのRDF/RDFS/OWLの各標準に対するネイティブ・サポートを提供します。 これにより、アプリケーション開発者は、RDFおよびOWLベースのアプリケーションに対してオープンでスケーラブル、かつセキュアで統合された効率のいいプラットフォームのメリットを得ることができます。

Oracle Spatial 11gオプションを使用すると、以下が可能になります。

このチュートリアルは、ユーザーがRDFおよびOWLに関連する主要な概念(主語トリプル、述語トリプル、目的語トリプル、URI、空白ノード、プレーン・リテラルと型付きリテラル、オントロジーなど)に精通していることを前提としています。 このデモでは、これらの概念の詳細については説明しません。代わりに、Oracle Databaseにデモを設定し、オントロジーの使用を開始する方法について重点的に説明します。 データベースには、セマンティック・データ、オントロジー(RDF/OWLモデル)、および従来のリレーショナル・データが含まれています。 セマンティック・データをロードするには、バルク・ロードを使用するのがもっとも効率的な方法です。トランザクションのINSERT文を使用して増分データをロードすることもできます。 このデモではバルク・ロードを実行します。

NCIセマンティック・ネットワークの概要

この例では、NCI Center for Bioinformatics、NCI Office of Communications、 National Cancer Institute、National Institutes of Health(米国メリーランド州Bethesda、MD 20892)の共同プロジェクトであるEVS(Enterprise Vocabulary System)が作成したNCI Thesaurusを使用します。

NCI ThesaurusのOWLバージョンはEVSで作成しています。これは、米国メリーランド州メリーランド大学カレッジパーク校でおこなわれた、Maryland Information and Network Dynamics Lab, Semantic Web Agents Project(Mindswap)というJim HendlerとJen Golbeckの共同プロジェクトです。

オントロジーURI: http://www.mindswap.org/2003/nciOncology.owl

バージョン: 03.09d

デフォルトの名前空間: http://www.mindswap.org/2003/nciOncology.owl#

名前空間の接頭辞:


最初の17レベルのクラスは次のとおりです。

トピック・リストに戻る

 

次の3つの表をもつnciuserと呼ばれるスキーマ・ユーザーを作成します。

データは、nciと呼ばれるセマンティック・モデルにロードされます。 このモデルがデータを表nci_rdf_dataにロードします。 次に、PATIENTS_DATA表にランダムなデータを移入して、患者情報をシミュレートし、セマンティック演算子を使用してモデルとPATIENTS_DATA(患者データ)表に問合せをおこないます。

トピック・リストに戻る

前提条件

このチュートリアルを始める前に次のことを確認してください。

1.

Oracle Database 11gがインストールされていること。 Oracle Examples Media 11gをインストールしてあること。

2. 11gのセマンティック・テクノロジー・サポートに必要なプロシージャを実行していること。 https://metalink.oracle.com/の次のノートにある手順にしたがいます。

Note 452989.1: 11gのセマンティック・テクノロジー・サポートに必要なプロシージャ

 

3.

11.1.0.6.0のセマンティック・テクノロジー・パッチをインストールしてあること。

注: Oracle Database 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/にある次のノートの手順に従います。

Note 454371.1: セマンティック・ネットワークをサポートするためのデータベースの設定方法

 

5.

ユーザー・アカウント、mdsysのロックが解除されていること。 sysユーザーとしてログインし、次の文を実行してmdsysのロックを解除します。

alter user mdsys identified by mdsys account unlock;

トピック・リストに戻る

RDFデータを保持するためのインフラストラクチャとモデルの作成

前提条件として、セマンティック・ネットワークのサポートを格納する表領域であるrdf_tablespaceを、事前に作成および設定しておく必要があります。 以下の手順で、さらに2つの表領域を作成します。 rdf_users表領域はユーザー・オブジェクトを格納(nciuserスキーマのデフォルトの表領域)し、rdf_tempは、nciuserスキーマ(nciuserの一時表領域)で実行される操作で使用されます。 このトピックでは、nciuserとモデルも作成します。

1.

SQL*Plusを起動します。 Enter usernameプロンプトで、次のように入力して、特権ユーザーとしてログインします。

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;

3.

次のコマンドを実行して、rdf_temp表領域を作成します。

datafileパスの<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.

nciuserを作成し、SQL*Plusプロンプトで次のコマンドを入力して、ユーザーに必要な権限を付与します。

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');          
       

トピック・リストに戻る

モデルへのRDFデータのロード

このトピックでは、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.

nci_rdf_data表にmdsysへのINSERT権限を付与します。 また、stable表にmdsysスキーマに対するSELECT権限とUPDATE権限を付与します。

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.

コマンド・ウィンドウを開きます。 SQL*Loaderを使用して、nci_z.ntファイルをステージング表stableにロードします。

注:nci_z.zipをダウンロードして解凍し、nci_z.ntを準備してから、sqlldrコマンドを実行してください(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(患者データ)表のロード

ここで、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プロシージャにパブリックに対する実行権限を付与します。 次の文を実行します。

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の全'Subject'を表示します。 結果には、オントロジー内のすべての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.

次の問合せは、'Subject'がFinger_Fractureであるトリプルを返します。 変数'p'および'o'は、それぞれ'any predicate'と'any object'を意味しています。

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関数を使用して、'subClassOf' Finger_Fractureであるすべての'Object'を抽出し、'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列を表し、'subClassOf' Upper_Extremity_Fractureの診断を要求します。

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表の条件を満たすすべての診断が返ります。これは、すべての患者のリストが必要な場合には役立ちますが、'subClassOf' Upper_Extremity_Fractureである異なる診断を知りたいだけの場合は、次の問合せのように明確な操作を追加できます。
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; 注: PATIENTS_DATA表はランダムなデータで作成しているので、結果は異なる場合があります。
6. 次の問合せは、診断がsubClassOf 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モデルおよびオントロジーの概要を説明しました。

このレッスンで学習した内容は次のとおりです。

トピック・リストに戻る

このアイコンの上にカーソルを置くと、すべてのスクリーンショットが非表示になります。