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データおよびオントロジーへのデータの格納、ロード、DMLアクセス
 OWLセマンティック、RDFSセマンティック、およびユーザー定義ルールを使用した推定
 SPARQLに似たグラフ・パターンを使用した、RDF/OWLデータおよびオントロジーに対するSQL問合せ
 エンタープライズ(リレーショナル)データに対するオントロジーを利用した問合せ

このチュートリアルは、ユーザーが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#

名前空間の接頭辞:

  • 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

トピック・リストに戻る

 

シナリオ

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

  • NCI_RDF_DATA: これは、モデル内のトリプルのコードを保持するモデル表です。
  • STABLE:これは、バルク・ロードを使用して、N-Triple形式でロードされたトリプルを保持するステージング表です。
  • PATIENTS_DATA: これは、患者情報をシミュレートするために使用するアプリケーション表です。

データは、 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モデルおよびオントロジーの概要を説明しました。

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

 RDFデータを保持するためのインフラストラクチャとモデルの作成
 モデルおよびPATIENTS_DATA(患者データ)表へのRDFデータのロード
 セマンティック索引の作成
 情報を抽出するためのモデルおよびPATIENTS_DATA(患者データ)表への問合せ

トピック・リストに戻る

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