3 OWLの概要

Web Ontology Language (OWL)のサブセットへのサポートに関連する主要な概念を理解する必要があります。

この章の内容は、「RDFセマンティク・グラフの概要」の情報に基づいており、読者がオントロジ、プロパティ、関係などのOWLに関する主要な概念についてよく理解していることを前提とします。OWLの詳細は、http://www.w3.org/TR/owl-ref/にある「OWL Web Ontology Language Reference」を参照してください。

3.1 オントロジ

オントロジは、特定の領域で共有される知識を概念化したものです。

オントロジは、クラス、プロパティおよび(オプションの)インスタンスの集合で構成されます。クラスは、通常、クラス階層(サブクラスとスーパークラスの関係)によって関連付けられます。同様に、プロパティは、プロパティ階層(サブプロパティとスーパープロパティの関係)によって関連付けられます。プロパティは、対称的または推移的(あるいはその両方)です。プロパティには、それぞれ指定されたドメイン、レンジおよびカーディナリティの制約があります。

RDFSベースのオントロジでは、クラス階層、プロパティ階層、instanceOf関係、およびプロパティのドメインとレンジの指定のみが可能です。

OWLオントロジは、RDFSベースのオントロジを基盤としますが、追加でプロパティ特性を指定できます。OWLオントロジは、さらにOWL-Lite、OWL-DLおよびOWL Fullに分類されます。OWL-Liteでは、カーディナリティの最大値と最小値が0または1に制限されています。OWL-DLでは、この制限が緩和されており、最大値と最小値を指定できます。OWL Fullでは、OWL-DLやOWL-Liteオントロジとは異なり、インスタンスをクラスとしても定義できます。

セマンティク・データでサポートされるOWL機能またはサポートされないOWL機能の詳細は、「サポートされるOWLサブセット」を参照してください。

3.1.1 例: 疾患オントロジ

図3-1に、疾患オントロジ(特定の疾患に関連するクラスとプロパティの記述)の一部を示します。この場合の要件は、DIAGNOSIS列を持つPATIENTSデータ表が存在することです(DIAGNOSIS列には、Diseases_and_Disorders(疾患と障害)クラス階層の値が含まれる必要があります)。

図3-1 疾患オントロジの例

図3-1の説明が続きます
「図3-1 疾患オントロジの例」の説明

図3-1の疾患オントロジでは、診断Immune_System_Disorder (免疫系障害)にAutoimmune_Disease (自己免疫疾患)およびImmunodeficiency_Syndrome (免疫不全症候群)という2つのサブクラスが含まれています。診断Autoimmune_Diseaseには、サブクラスRheumatoid_Arthritis(関節リウマチ)が含まれます。また、診断Immunodeficiency_Syndromeには、サブクラスT_Cell_Immunodeficiency(T細胞免疫不全)が含まれ、このサブクラスにはさらにサブクラスAIDSが含まれます。

PATIENTS表のデータには、表3-1に示すようなPATIENT_ID列およびDIAGNOSIS列の値が含まれます。

表3-1 PATIENTS表のデータの例

PATIENT_ID DIAGNOSIS

1234

Rheumatoid_Arthritis

2345

Immunodeficiency_Syndrome

3456

AIDS

オントロジの問合せには、SEM_MATCH表関数またはSEM_RELATED演算子およびその補助演算子を使用できます。

3.1.2 サポートされるOWLサブセット

この項では、サポートされるOWLボキャブラリのサブセットについて説明します。

Oracle Databaseでは、表現度の向上に従ってRDFS++、OWLSIFおよびOWLPrimeボキャブラリに加え、OWL 2 RLがサポートされます。サポートされる各ボキャブラリには、対応するルールベースがあります(ただし、これら3つのボキャブラリの基礎となる伴意ルールが内部的に実装されるため、ルールベースの内容を指定する必要はありません)。サポートされるボキャブラリは、次のとおりです。

  • RDFS++: RDFSの最小限の拡張です。RDFSにowl:sameAsowl:InverseFunctionalPropertyが追加されています。

  • OWLSIF: IFセマンティクを含むOWLであり、『Completeness, decidability and complexity of entailment for RDF Schema and a semantic extension involving the OWL vocabulary』(H.J. Horst、Journal of Web Semantics 3、2(2005)、79-115)のpD*セマンティクで提案されたボキャブラリおよびセマンティクが含まれます。

  • OWLPrime: 次のOWL機能が含まれます。

    • 基本: クラス、サブクラス、プロパティ、サブプロパティ、ドメイン、レンジ、タイプ

    • プロパティ特性: 推移的、対称的、関数的、逆関数的、逆関係

    • クラス比較: 等価、排他

    • プロパティ比較: 等価

    • 個体比較: 同一、別個

    • クラス式: 補集合

    • プロパティ制限: hasValuesomeValuesFromallValuesFrom

      pD*と同様に、これらの値制約でサポートされるセマンティクは、常に内包的です(IFセマンティク)。

  • OWL 2 RL: W3Cの「OWL 2 Web Ontology Language Profiles」に記載された推奨事項のOWL 2RLの項(http://www.w3.org/TR/owl2-profiles/#OWL_2_RL)では、「OWL 2 RLプロファイルは、あまり表現力を犠牲にせずにスケーラブルな推論を必要とするアプリケーションを対象としています。これは、言語の最大限の表現性と引き換えに効率を提供するアプリケーション、およびOWL 2による表現性の強化を必要とするRDF(S)アプリケーションの両方のOWL 2アプリケーションに対応するように設計されています」と説明されています。

    システム定義のルールベースOWL2RLでは、OWL 2 RL用に定義されたすべての標準の本番ルールがサポートされます。OWLPRIMEと同様に、このOWL2RLルールベースのルールはユーザーに表示されません。ルールベースOWL2RLがまだ存在しない場合は、自動的に作成されます。

    次のコードの抜粋では、OWL2RLルールベースを使用しています。

    CREATE TABLE m1_tpl (triple SDO_RDF_TRIPLE_S) COMPRESS;
    EXECUTE sem_apis.create_sem_model('m1','m1_tpl','triple',network_owner=>'RDFUSER',network_name=>'NET1');
    -- Insert data into model M1. Details omitted
    ...
    -- Now run inference using the OWL2RL rulebase
    EXECUTE sem_apis.create_entailment('m1_inf',sem_models('m1'),sem_rulebases('owl2rl'),network_owner=>'RDFUSER',network_name=>'NET1');
    

    OWL2RLルールベースを使用すると、推論関連の最適化(パラレル推論、RAW8など)がすべて適用可能になります。

  • OWL 2 EL: W3Cの「OWL 2 Web Ontology Language Profiles」に記載された推奨事項のOWL 2 ELの項(http://www.w3.org/TR/owl2-profiles/#OWL_2_EL)では、OWL 2 ELプロファイルはOWL 2のサブセットとして設計されており、次の特色を持つと記述されています。

    • 非常に多数のクラスまたはプロパティ、あるいはその両方を定義するオントロジを採用するアプリケーションに特に適しています。

    • このような多数のオントロジで使用される表現力を獲得しています。

    • オントロジの一貫性、クラス表現の組込みおよびインスタンス・チェックを多項式時間で決定できます。

    OWL 2 ELオントロジの主な例は、生物医学オントロジのSNOMED Clinical Terms (SNOMED CT)です。SNOMED CTの詳細は、http://www.ihtsdo.org/snomed-ct/を参照してください。

    システム定義のルールベースOWL2ELは、EL構文をサポートしています。

    OWLPRIMEおよびOWL2RLと同様に、このOWL2ELルールベースのルールはユーザーに表示されず、OWL2ELルールベースがまだ存在しない場合は自動的に作成されます。

    次のコードの抜粋では、有名なSNOMEDオントロジに対してOWL2ELルールベースを使用しています。

    CREATE TABLE snomed_tpl (triple SDO_RDF_TRIPLE_S) COMPRESS;
    EXECUTE sem_apis.create_sem_model('snomed','snomed_tpl','triple',network_owner=>'RDFUSER',network_name=>'NET1') compress;
    -- Insert data into model SNOMED. Details omitted
    ...
    -- Now run inference using the OWL2EL rulebase
    EXECUTE sem_apis.create_entailment('snomed_inf',sem_models('snomed'),sem_rulebases('owl2el'),network_owner=>'RDFUSER',network_name=>'NET1');
    

    OWL2ELルールベース・サポートには再帰オブジェクト・プロパティ(ReflexiveObjectProperty)は含まれていませんが、これは、再帰オブジェクト・プロパティがそれ自体ですべての個体をリンクし、推論グラフの不必要かつ高コストな拡張が行われる可能性があるためです。

表3-2に、サポートされる各ルールベースに含まれるRDFSおよびOWLのボキャブラリ構成要素を示します。

表3-2 サポートされる各ルールベースに含まれるRDFS/OWLボキャブラリ構成要素

ルールベース名 含まれるRDFS/OWL構成要素

RDFS++

すべてのRDFSボキャブラリ構成要素

owl:InverseFunctionalProperty

owl:sameAs

OWLSIF

すべてのRDFSボキャブラリ構成要素

owl:FunctionalProperty

owl:InverseFunctionalProperty

owl:SymmetricProperty

owl:TransitiveProperty

owl:sameAs

owl:inverseOf

owl:equivalentClass

owl:equivalentProperty

owl:hasValue

owl:someValuesFrom

owl:allValuesFrom

OWLPrime

rdfs:subClassOf

rdfs:subPropertyOf

rdfs:domain

rdfs:range

owl:FunctionalProperty

owl:InverseFunctionalProperty

owl:SymmetricProperty

owl:TransitiveProperty

owl:sameAs

owl:inverseOf

owl:equivalentClass

owl:equivalentProperty

owl:hasValue

owl:someValuesFrom

owl:allValuesFrom

owl:differentFrom

owl:disjointWith

owl:complementOf

OWL2RL

(http://www.w3.org/TR/owl2-profiles/#OWL_2_RLを参照)

OWL2EL

(http://www.w3.org/TR/owl2-profiles/#OWL_2_ELを参照)

3.2 OWL推論の使用方法

伴意ルールを使用してネイティブOWL推論を実行できます。

この項では、単純なオントロジの作成、ネイティブ推論の実行、および追加の拡張機能について説明します。

3.2.1 単純なOWLオントロジの作成

例2-1では、単純なOWLオントロジを作成して、3つのURIが同じエンティティを示しているという内容の1つの文を挿入し、SEM_MATCH表関数を使用した問合せを実行します。

例3-1 単純なOWLオントロジの作成

SQL> CREATE TABLE owltst(id number, triple sdo_rdf_triple_s);
Table created.
 
SQL> EXECUTE sem_apis.create_sem_model('owltst','owltst','triple',network_owner=>'RDFUSER',network_name=>'NET1');
PL/SQL procedure successfully completed.
 
SQL> INSERT INTO owltst VALUES (1, sdo_rdf_triple_s('owltst',
       'http://example.com/name/John', 'http://www.w3.org/2002/07/owl#sameAs', 
       'http://example.com/name/JohnQ','RDFUSER','NET1'));
1 row created.
 
SQL> commit;
 
SQL> -- Use SEM_MATCH to perform a simple query.
SQL> select s$rdfterm,p$rdfterm,o$rdfterm from table(SEM_MATCH('SELECT * WHERE {?s ?p  ?o}', SEM_Models('OWLTST'),
           null,  null, null, null, 'PLUS_RDFT=VC', null, null, 'RDFUSER', 'NET1'));

3.2.2 ネイティブOWL推論の実行

例3-2では、SEM_APIS.CREATE_ENTAILMENTプロシージャをコールします。OWLルールはRDFセマンティク・グラフ推論エンジンにすでに組み込まれているため、ルールベースを作成してそれにルールを追加する必要はありません。

例3-2 ネイティブOWL推論の実行

SQL> -- Invoke the following command to run native OWL inferencing that
SQL> -- understands the vocabulary defined in the preceding section.
SQL>
SQL>  EXECUTE sem_apis.create_entailment('owltst_idx', sem_models('owltst'), sem_rulebases('OWLPRIME'), network_owner=>'RDFUSER', network_name=>'NET1');
PL/SQL procedure successfully completed.
 
SQL> -- The following view is generated to represent the entailed graph (rules index).
SQL> desc mdsys.semi_owltst_idx;
 
SQL> -- Run the preceding query with an additional rulebase parameter to list
SQL> -- the original graph plus the inferred triples.
SQL> SELECT s$rdfterm,p$rdfterm,o$rdfterm FROM table(SEM_MATCH('SELECT * WHERE {?s ?p  ?o}', SEM_MODELS('OWLTST'),
           SEM_RULEBASES('OWLPRIME'),  null, null, null, null, 'PLUS_RDFT=VC', null, null, 'RDFUSER', 'NET1'));

3.2.3 OWLおよびユーザー定義のルールによる推論の実行

例3-3では、ユーザー定義のルールベースを作成して、簡略化したuncleOfルール(ある人物の父親の兄弟はその人物のおじであるという言明)を挿入し、SEM_APIS.CREATE_ENTAILMENTプロシージャをコールします。

例3-3 OWLおよびユーザー定義のルールによる推論の実行

SQL> -- First, insert the following assertions.
 
SQL> INSERT INTO owltst VALUES (1, sdo_rdf_triple_s('owltst',
       'http://example.com/name/John', 'http://example.com/rel/fatherOf',
       'http://example.com/name/Mary', 'RDFUSER', 'NET1'));
 
 
SQL> INSERT INTO owltst VALUES (1, sdo_rdf_triple_s('owltst',
       'http://example.com/name/Jack', 'http://example.com/rel/brotherOf',
       'http://example.com/name/John', 'RDFUSER', 'NET1'));
 
SQL> -- Create a user-defined rulebase.
 
SQL> EXECUTE sem_apis.create_rulebase('user_rulebase', network_owner=>'RDFUSER', network_name=>'NET1');
 
SQL> -- Insert a simple "uncle" rule.
 
SQL> INSERT INTO RDFUSER.NET1#SEMR_USER_RULEBASE VALUES ('uncle_rule', 
'(?x <http://example.com/rel/brotherOf> ?y)(?y <http://example.com/rel/fatherOf> ?z)',
NULL, '(?x <http://example.com/rel/uncleOf> ?z)', null);
 
SQL>  -- In the following statement, 'USER_RULES=T' is required, to
SQL> --  include the original graph plus the inferred triples.
SQL> EXECUTE sem_apis.create_entailment('owltst2_idx', sem_models('owltst'),
          sem_rulebases('OWLPRIME','USER_RULEBASE'), 
          SEM_APIS.REACH_CLOSURE, null, 'USER_RULES=T', network_owner=>'RDFUSER', network_name=>'NET1');
 
SQL> -- In the result of the following query, :Jack :uncleOf :Mary is inferred.
SQL> SELECT s$rdfterm,p$rdfterm,o$rdfterm FROM table(SEM_MATCH('SELECT * WHERE {?s ?p  ?o}',
           SEM_MODELS('OWLTST'),
           SEM_RULEBASES('OWLPRIME','USER_RULEBASE'),  null, null, null, null, 'PLUS_RDFT=VC', null, null, 'RDFUSER', 'NET1'));

パフォーマンス上の理由で、デフォルトでは、推論エンジンは各ユーザー・ルールを、推論されたトリプル(主語としてのリテラル値、述語としての空白ノードなど)の構文の正当性をチェックすることなく、最終ラウンドの伴意の後まで実行します。最終伴意ラウンドの完了後に、推論エンジンは構文違反のすべてのトリプルを除外します(これらのトリプルのエラーはスローされません)。ただし、構文違反のトリプルが複数ラウンドの推論中に存在する場合があるため、ルールはこれらのトリプルをルールの前件の一部として使用できます。たとえば、次のユーザー定義ルールを検討します。

  • ルール1:

    (?s :account ?y)
    (?s :country :Spain) --> (?y rdf:type :SpanishAccount)
    
  • ルール2:

    (?s :account ?y)
    (?y rdf:type :SpanishAccount) --> (?s :language "es_ES")
    

ルール1はスペインのすべてのユーザーを検索し、そのアカウントをスペイン・アカウントとして指定します。ルール2は、スペイン・アカウントを持つすべてのユーザーの言語をes_ES(スペイン語)に設定します。次のデータを検討します(Turtle形式で示します)。

:Juan      :account "123ABC4Z"
           :country :Spain
 
:Alejandro :account "5678DEF9Y"
           :country :Spain

ルール1およびルール2を適用すると、次の推論されたトリプルが生成されます。

(:Juan      :language "es_ES")
(:Alejandro :language "es_ES")

アカウントのタイプが:SpanishAccountであることを指定するトリプルがないことに注意します。ユーザー定義ルールは伴意の作成中にこれらのトリプルを推論しますが、推論エンジンは推論の最終ラウンド後にそのトリプルを除外します(構文違反があるためです)。アカウントはリテラル値であるため、RDFトリプルでは主語として使用できません。

推論されたトリプルの構文の正当性を強制的にチェックするには、ルールのFILTER式の先頭に、/*+ ENABLE_SYNTAX_CHECKING */オプティマイザ・ヒントを追加します。ルールの構文チェックを強制すると、パフォーマンス・ペナルティとなり、構文違反があるトリプルに対して例外がスローされます。次の例では、ルール1と同様に、構文チェックを強制しています。(また、この例では、単にフィルタ式の使用方法を示すために、アカウントを末尾の文字が'Z'ではないものに制限しています。)

INSERT INTO RDFUSER.NET1#SEMR_USER_RULEBASE VALUES (
  'spanish_account_rule',
  '(?s <http://example.com/account> ?y)(?y <http://example.com/account> <http://example.com/Spain>)',
  '/*+ ENABLE_SYNTAX_CHECKING */ y not like ''%Z'' ',
  '(?y <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/SpanishAccount>)',
  NULL
);

3.2.4 OWL推論の証明の生成

OWL推論は複雑であり、オントロジのサイズ、使用される実際のボキャブラリ(言語構成要素のセット)、および言語構成要素間の相互作用に応じて変化します。トリプルの導出方法を検出できるように、推論中に証明の生成を使用できます。(証明の生成には、追加のCPUタイムとディスク・リソースを必要とします。)

証明に必要な情報を生成するには、次の例に示すとおり、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールでPROOF=Tを指定します。

EXECUTE sem_apis.create_entailment('owltst_idx', sem_models('owltst'), -
  sem_rulebases('owlprime'), SEM_APIS.REACH_CLOSURE, 'SAM', 'PROOF=T', network_owner=>'RDFUSER', network_name=>'NET1');

PROOF=Tを指定すると、推論された各トリプルの証明を含むビューが作成されます。ビュー名は、MDSYS.SEMI_という接頭辞付きの伴意名です。このビューには、LINK_IDおよびEXPLAIN (証明)という2つの関連列があります。次の例では、生成された各トリプルのLINK_ID値と証明を表示します(LINK_ID値は説明のために短縮しています)。

SELECT link_id || ' generated by ' || explain as 
          triple_and_its_proof FROM RDFUSER.NET1#SEMI_OWLST_IDX;
 
TRIPLE_AND_ITS_PROOF
--------------------------------------------------------------------
8_5_5_4 generated by 4_D_5_5 : SYMM_SAMH_SYMM
8_4_5_4 generated by 8_5_5_4 4_D_5_5 : SAM_SAMH
. . .

1つの証明は、次のように1つ以上のトリプル(リンク)ID値と、それらのトリプルに適用されるルールの名前で構成されます。

link-id1 [link-id2 ... link-idn] : rule-name

例3-4 証明情報の表示

証明用の主語、述語、目的語の完全なURIを取得するには、モデル・ビューおよび伴意(ルール索引)ビューを問い合せます。例3-4では、モデル・ビューSEMM_OWLTSTと伴意ビューSEMI_OWLTST_IDXを使用して、LINK_ID値および関連するトリプルの内容を表示します。

SELECT to_char(x.triple.rdf_m_id, 'FMXXXXXXXXXXXXXXXX') ||'_'||
       to_char(x.triple.rdf_s_id, 'FMXXXXXXXXXXXXXXXX') ||'_'||
       to_char(x.triple.rdf_p_id, 'FMXXXXXXXXXXXXXXXX') ||'_'||
       to_char(x.triple.rdf_c_id, 'FMXXXXXXXXXXXXXXXX'),
       x.triple.get_triple()
  FROM (
   SELECT sdo_rdf_triple_s(
           t.canon_end_node_id,
           t.model_id, 
           t.start_node_id,
           t.p_value_id,
           t.end_node_id) triple
     FROM (select * from rdfuser.net1#semm_owltst union all
           select * from rdfuser.net1#semi_owltst_idx
          ) t  
    WHERE t.link_id IN ('4_D_5_5','8_5_5_4')
  ) x;
 
   LINK_ID  X.TRIPLE.GET_TRIPLE()(SUBJECT, PROPERTY, OBJECT)
----------  --------------------------------------------------------------
4_D_5_5 SDO_RDF_TRIPLE('<http://example.com/name/John>', '<http://www.w3.org/2002/07/owl#sameAs>', '<http://example.com/name/JohnQ>')
8_5_5_4 SDO_RDF_TRIPLE('<http://example.com/name/JohnQ>', '<http://www.w3.org/2002/07/owl#sameAs>', '<http://example.com/name/John>')

例3-4により、LINK_ID = 8_5_5_4を持つトリプルの証明エントリ「8_5_5_4 generated by 4_D_5_5 : SYMM_SAMH_SYMM」が、owl:sameAsの対称性を使用して4_D_5_5を持つトリプルから推論されていることがわかります。

伴意ステータスがINCOMPLETEの場合、および最後の伴意が証明情報なしで生成されている場合、PROOF=Tを指定してSEM_APIS.CREATE_ENTAILMENTを起動することはできません。この場合は、最初にその伴意を削除してから、PROOF=Tを指定して再度それを作成する必要があります。

3.2.5 OWLモデルおよび伴意の検証

OWLオントロジには、充足不可能なクラス、充足不可能なクラスに属するインスタンス、同じでありかつ異なると同時に表明される2つの個体など、様々なエラーが含まれる可能性があります。SEM_APIS.VALIDATE_MODELおよびSEM_APIS.VALIDATE_ENTAILMENT関数を使用すると、それぞれ元のデータ・モデルと伴意における非一貫性を検出できます。

例3-5 伴意の検証

例3-5では、SEM_APIS.VALIDATE_ENTAILMENT関数を使用します。この関数では、エラーが検出されない場合はNULL値が戻され、エラーが検出された場合は文字列のVARRAYが戻されます。

SQL>  -- Insert an offending triple.
SQL>  insert into owltst values (1, sdo_rdf_triple_s('owltst',
             'urn:C1', 'http://www.w3.org/2000/01/rdf-schema#subClassOf', 'http://www.w3.org/2002/07/owl#Nothing', 'RDFUSER', 'NET1'));
 
SQL> -- Drop entailment first.
SQL>  exec sem_apis.drop_entailment('owltst_idx', network_owner=>'RDFUSER', network_name=>'NET1');
PL/SQL procedure successfully completed.
 
SQL> -- Perform OWL inferencing.
SQL> exec sem_apis.create_entailment('owltst_idx', sem_models('OWLTST'), sem_rulebases('OWLPRIME') , network_owner=>'RDFUSER', network_name=>'NET1');
PL/SQL procedure successfully completed.
 
SQL > set serveroutput on; 
SQL > -- Now invoke validation API: sem_apis.validate_entailment
SQL > 
declare 
  lva mdsys.rdf_longVarcharArray; 
  idx int; 
begin 
  lva := sem_apis.validate_entailment(sem_models('OWLTST'), sem_rulebases('OWLPRIME'), network_owner=>'RDFUSER', network_name=>'NET1') ; 
 
  if (lva is null) then
   dbms_output.put_line('No errors found.');
  else 
    for idx in 1..lva.count loop 
      dbms_output.put_line('Offending entry := ' || lva(idx)) ; 
    end loop ; 
  end if;
end ; 
/ 
 
SQL> -- NOTE: The LINK_ID value and the numbers in the following
SQL> -- line are shortened for simplicity in this example. -- 

          Offending entry  := 1 10001 (4_2_4_8 2 4 8) Unsatisfiable class.

検証レポートの配列の各項目には、次の情報が含まれます。

  • このエラーの原因となったトリプルの数(例3-5では1)

  • エラー・コード(例3-5では10001)

  • 1つ以上のトリプル(出力中のカッコ内。例3-5では(4_2_4_8 2 4 8))

    これらの数字は、LINK_ID値と、主語、述語、目的語のID値です。

  • 説明的なエラー・メッセージ(例3-5ではUnsatisfiable class.)

例3-5の出力から、クラスが空のクラスowl:Nothingのサブクラスであると表明している1つのトリプルを原因としてエラーが発生したことがわかります。

3.2.6 RDFS推論のためのSEM_APIS.CREATE_ENTAILMENTの使用

OWLボキャブラリを使用する以外に、SEM_APIS.CREATE_ENTAILMENTプロシージャによりRDFSルールベースを使用できます。次の例は、RDFS推論を示します(すべての標準RDFSルールは、http://www.w3.org/TR/rdf-mt/に定義されています)。

EXECUTE sem_apis.create_entailment('rdfstst_idx', sem_models('my_model'), sem_rulebases('RDFS'), network_owner=>'RDFUSER', network_name=>'NET1');

ルールRDFS4A、RDFS4B、RDFS6、RDFS8、RDFS10、RDFS13では、アプリケーション用に意味のある推論が生成されないことがあるため、これらのコンポーネントは推論の高速化のために選択解除できます。次の例では、これらのルールを選択解除します。

EXECUTE sem_apis.create_entailment('rdfstst_idx', sem_models('my_model'), sem_rulebases('RDFS'), SEM_APIS.REACH_CLOSURE, -
 'RDFS4A-, RDFS4B-, RDFS6-, RDFS8-, RDFS10-, RDFS13-'), network_owner=>'RDFUSER', network_name=>'NET1');

3.2.7 推論パフォーマンスの向上

この項では、推論操作のパフォーマンスを向上するための推奨事項について説明します。

  • 推論の前に統計を収集します。大規模なRDF/OWLデータ・モデルをロードした後には、SEM_PERF.GATHER_STATSプロシージャを実行する必要があります。使用に関する重要な情報については、当該プロシージャの「使用上のノート」(「SEM_PERFパッケージ・サブプログラム」内)を参照してください。

  • 推論操作用に十分な一時表領域を割り当てます。OracleのOWL推論サポートは、表結合に大きく依存するため、かなりの量の一時表領域を使用します。

  • SVFHおよびAVFH推論コンポーネントの適切な実装を使用します。

    owl:someValuesFromowl:allValuesFromによって定義される制限クラス数が少ない場合は(LUBMデータセットと同様)、SVFHおよびAVFH推論コンポーネントのデフォルトの実装が最適に動作します。ただし、Gene Ontology (http://www.geneontology.org/)のようにこれらのクラスの数が多い場合、SVFHおよびAVFHの非手続き型の実装を使用するとパフォーマンスが大幅に向上する可能性があります。

    手続き実装を無効にする場合、また、SVFHおよびAVFHの非手続き型の実装を選択する場合は、SEM_APIS.CREATE_ENTAILMENTに対するオプションに'PROCSVFH=F'または'PROCAVFH=F'、あるいはその両方を含めます。オントロジに適切な実装を使用すると、大きなパフォーマンス上のメリットが得られます。たとえば、NCI Thesaurusオントロジ(http://www.cancer.gov/research/resources/terminologyを参照)に対してSVFHの非手続き型実装を選択すると、SVFH推論コンポーネントのパフォーマンスが960%向上しました(デュアルコア、8GB RAM、Oracle ASMと連携する3つのSATAディスクが付いたデスクトップ・システムでテストされています)。

「owl:sameAs推論の最適化」も参照してください。

3.2.8 owl:sameAs推論の最適化

大規模なowl:sameAsクリークの推論パフォーマンスは、OWLPrime伴意の実行時にoptionsパラメータに'OPT_SAMEAS=T'を指定することで最適化できます。(クリークとはグラフの一種で、その内部のすべてのノードが同一グラフ内の他のすべてのノードと双方向に結び付けられているものです。)

OWLセマンティクに従って、owl:sameAs構成要素は同等の関係として処理されるため、それは再帰的、対称的および推移的です。その結果、推論中に、owl:sameAs関連の伴意がすべて作成され、推論されたグラフのサイズが大幅に増加する可能性があります。次のトリプル・セットの例を検討します。

:John  owl:sameAs  :John1 .
:John  owl:sameAs  :John2 .
:John2 :hasAge     "32" .

OWLPrime推論を(SAMコンポーネントを指定して)このセットに適用すると、次の新しいトリプルが生成されます。

:John1  owl:sameAs  :John .
:John2  owl:sameAs  :John .
:John1  owl:sameAs  :John2 .
:John2  owl:sameAs  :John1 .
:John   owl:sameAs  :John .
:John1  owl:sameAs  :John1 .
:John2  owl:sameAs  :John2 .
:John   :hasAge     "32" . 
:John1  :hasAge     "32" .

前の例では、:John:John1および:John2owl:sameAs関係によって相互に結び付けられます(つまり、owl:sameAsクリークのメンバーになります)。大規模なowl:sameAsクリークに対して最適化された推論を提供するには、OWLPrime伴意の実行時にoptionsパラメータに'OPT_SAMEAS=T'を指定すると、正確性を犠牲にせずに複数のowl:sameAsトリプルを統合できます。たとえば、次のようにします。

EXECUTE sem_apis.create_entailment('M_IDX',sem_models('M'),
   sem_rulebases('OWLPRIME'),null,null,'OPT_SAMEAS=T', network_owner=>'RDFUSER', network_name=>'NET1');

このオプションを指定すると、owl:sameAsクリークごとに、そのクリークから1つのリソースが正規形の代表として選択され、そのクリークの推論すべてがそのリソース周辺で統合されます。前の例では、:John1がクリークの代表の場合、統合後の推論されたグラフには次のトリプルのみが含まれます。

:John1 owl:sameAs :John1 .
:John1 :hasAge    "32" .

owl:sameAs統合では、いくつかのオーバーヘッドが発生します。推論中に、すべての表明されたモデルが推論パーティションにコピーされ、そこで推論されたトリプルと統合されます。さらに、非常に大きな表明されたグラフについては、重複トリプルの統合および削除によって多大なランタイム・オーバーヘッドが発生するため、owl:sameAs関係が多数あり、クリーク・サイズが大きいオントロジに対してのみ、OPT_SAMEAS=Tオプションを使用することをお薦めします。

OPT_SAMEAS=Tオプションを伴意に使用した後は、その伴意に対してSEM_APIS.CREATE_ENTAILMENTを使用する場合には必ずOPT_SAMEAS=Tを使用しないと、エラーが報告されます。最適化されたsameAsの処理を無効にするには、伴意を最初に削除する必要があります。

クリーク・メンバーシップ情報はSEMC_entailment-nameというビューに格納されます(entailment-nameは伴意(ルール索引)の名前です)。表3-3に、各SEMC_entailment-nameビューの列を示します。

表3-3 SEMC_entailment_nameビューの列

列名 データ型 説明

MODEL_ID

NUMBER

推論されたモデルのID番号

VALUE_ID

NUMBER

CLIQUE_IDで識別されるowl:sameAsクリークのメンバーであるリソースのID番号

CLIQUE_ID

NUMBER

VALUE_IDリソースのクリーク代表のID番号

領域を節約するために、SEMC_entailment-nameビューには、(CLIQUE_ID, CLIQUE_ID)のような再帰行は含まれません。

3.2.8.1 owl:sameAsで統合された推論グラフの問合せ

問合せの際に、問合せ対象の伴意がOPT_SAMEAS=Tオプションを使用して作成されていた場合、その結果はowl:sameAsで統合された推論パーティションから戻されます。すべてのowl:sameAs閉包を含めるために、問合せ結果は拡張されません。

次の問合せ例では、戻される唯一の結果が:John1であり、これは正規形クリークの代表です。

SELECT A FROM TABLE (
  SEM_MATCH ('SELECT ?A WHERE {?A :hasAge "32"}',SEM_MODELS('M'),  
    SEM_RULEBASES('OWLPRIME'),null, null, null, null, 'PLUS_RDFT=VC', null, null, 'RDFUSER', 'NET1'));

前の例で、:John2 :hasAge "32"がモデルにあったとしても、冗長なトリプルが除外される推論統合フェーズ中に置き換えられています。ただし、統合されたowl:sameAs情報を含むMDSYS.SEMC_rules-index-nameビューとの結合を実行すると、問合せ結果を拡張できます。たとえば、前のSEM_MATCH問合せの拡張結果セットを取得するには、次の拡張問合せを使用できます。

SELECT V.VALUE_NAME A_VAL FROM TABLE (
  SEM_MATCH ('SELECT ?A WHERE {?A :hasAge "32"}',SEM_MODELS('M'), 
    SEM_RULEBASES('OWLPRIME'), null, null, null, null, 'PLUS_RDFT=VC', null, null, 'RDFUSER', 'NET1')) Q,
    RDFUSER.NET1#RDF_VALUE$ V, RDFUSER.NET1#SEMC_M_IDX C
  WHERE V.VALUE_ID  = C.VALUE_ID 
     AND C.CLIQUE_ID = Q.A$RDFVID
  UNION ALL
    SELECT A A_VAL FROM TABLE (
      SEM_MATCH ('SELECT ?A WHERE {?A :hasAge "32"}',SEM_MODELS('M'),  
        SEM_RULEBASES('OWLPRIME'), null, null, null, null, 'PLUS_RDFT=VC', null, null, 'RDFUSER', 'NET1'));

または、次のように左側外部結合を使用して、前述の拡張問合せをリライトできます。

SELECT V.VALUE_NAME A_VAL FROM TABLE (
  SEM_MATCH ('(?A <http://hasAge> "33")',SEM_MODELS('M'), 
   SEM_RULEBASES('OWLPRIME'), null, null, null, null, 'PLUS_RDFT=VC', null, null, 'RDFUSER', 'NET1')) Q,
  RDFUSER.NET1#RDF_VALUE$ V, 
   (SELECT value_id, clique_id FROM RDFUSER.NET1#SEMC_M_IDX 
  UNION ALL
    SELECT DISTINCT clique_id, clique_id 
      FROM RDFUSER.NET1#SEMC_M_IDX) C
 WHERE Q.A$RDFVID  = c.clique_id  (+)
   AND V.VALUE_ID  = nvl(C.VALUE_ID, Q.A$RDFVID);

3.2.9 増分推論の実行

増分推論を使用すると、トリプルの追加後に効率的に伴意(ルール索引)を更新できます。伴意に対する増分推論を有効にするには、次の2つの方法があります。

  • 伴意の作成時に、optionsパラメータ値にINC=Tを指定します。たとえば、次のようにします。

    EXECUTE sem_apis.create_entailment ('M_IDX',sem_models('M'),
      sem_rulebases('OWLPRIME'),null,null, 'INC=T', network_owner=>'RDFUSER', network_name=>'NET1');
  • SEM_APIS.ENABLE_INC_INFERENCEプロシージャを使用します。

    このプロシージャを使用する場合、伴意のステータスはVALIDである必要があります。プロシージャをコールする前に、伴意に含まれるモデルを所有していない場合、各モデルの所有者がSEM_APIS.ENABLE_CHANGE_TRACKINGプロシージャを使用してそれらのモデルの変更トラッキングを有効化していることを確認する必要があります。

増分推論が伴意に対して有効な場合、その伴意に対してSEM_APIS.CREATE_ENTAILMENTプロシージャを起動するときにパラメータINC=Tを指定する必要があります。

伴意の増分推論は、その伴意の作成に関係したモデルのアプリケーション表のトリガーに依存します。これは、SEM_APIS.CREATE_ENTAILMENTプロシージャへのコールでdelta_inパラメータを使用してトリプルを指定していない場合で、伴意の基礎となるアプリケーション表に従来のパス・ロードを使用してトリプルが挿入されるときのみ増分推論が機能することを意味します(次の例では、モデルM_NEWからのトリプルがモデルMに追加され、伴意M_IDXは新しい推論で更新されます)。

EXECUTE sem_apis.create_entailment('M_IDX', sem_models('M'),
  sem_rulebases('OWLPRIME''), SEM_APIS.REACH_CLOSURE, null, null,
  sem_models('M_NEW'), network_owner=>'RDFUSER', network_name=>'NET1');

複数のモデルが増分推論コールに関係する場合に、1つ以上のdelta_inモデルが追加される宛先モデルを指定するには、optionsパラメータにDEST_MODEL=<model_name>を指定します。たとえば、次の例では、モデルM_NEWのセマンティク・データがモデルM2に追加されます。

EXECUTE sem_apis.create_entailment('M_IDX', sem_models('M1','M2','M3'),
sem_rulebases('OWLPRIME''), SEM_APIS.REACH_CLOSURE, null, 'DEST_MODEL=M2', sem_models('M_NEW')), network_owner=>'RDFUSER', network_name=>'NET1');

増分推論の使用時に従来型パスによるロードの要件を省略するもう1つの方法は、バルク・ロードの実行時に伴意間の間隔を対象とするようにUNDO_RETENTIONパラメータを設定することです。たとえば、最後の伴意が6時間前に作成された場合、UNDO_RETENTION値に6時間を超える値を設定する必要があり、それより短い場合(ワークロードが過大でUNDO領域が制限されていると)、増分推論を適用するためのすべての関連UNDO情報が保存されない可能性があります。このような場合、SEM_APIS.CREATE_ENTAILMENTプロシージャは、通常の(非増分)推論に戻ります。

変更トラッキングがモデルで有効になっているかどうかを確認するには、SEM_APIS.GET_CHANGE_TRACKING_INFOプロシージャを使用します。伴意に対する増分推論の追加情報を取得するには、SEM_APIS.GET_INC_INF_INFOプロシージャを使用します。

増分推論の制限事項は、次のとおりです。

  • 最適化されたowl:sameAsの処理(OPT_SAMEAS)、ユーザー定義ルール、VPD対応モデルまたはバージョン対応モデルとは連携しません。

  • トリプルの追加のみをサポートします。更新または削除では、伴意が完全に再構築されます。

  • アプリケーション表のトリガーに依存します。

  • 増分推論で使用される列の型(RAW8またはNUMBER)に、一貫性がある必要があります。たとえば、最初に伴意を構築する際にRAW8=Tを使用した場合は、以降のすべてのSEM_APIS.CREATE_ENTAILMENTで同じオプションを使用する必要があります。列の型をNUMBERに変更するには、伴意を削除して再構築する必要があります。

3.2.10 パラレル推論の使用

マルチコアまたはマルチCPUアーキテクチャの機能を利用することによって、パラレル推論で推論パフォーマンスを向上させることができます。パラレル推論を使用するには、SEM_APIS.CREATE_ENTAILMENTプロシージャの使用時にDOP(並列度)キーワードと適切な値を指定します。たとえば、次のようにします。

EXECUTE sem_apis.create_entailment('M_IDX',sem_models('M'), 
      sem_rulebases('OWLPRIME'), sem_apis.REACH_CLOSURE, null, 'DOP=4',
      network_owner=>'RDFUSER', network_name=>'NET1');

DOPキーワードの指定によって、オラクル社が選択した推論コンポーネントのセットに対してパラレル実行が有効になります。

パラレル推論が成功するかどうかは、データベースが実行されているシステムのハードウェア構成が適切かどうかによって大きく異なります。重要なのは、データベース・パフォーマンス・チューニングとOracle SQLパラレル実行のベスト・プラクティスが実現されるバランスの取れたシステムを確保することです。たとえば、単一の物理ディスクでSQL文をパラレルに実行すると、SQL文をシリアル・モードで実行するより低速になる可能性があるため、800GBのデータベースに対して単一の1TBのディスクを使用しないでください。パラレル推論には十分なメモリーが必要なため、CPUコアごとに4GB以上のメモリーが必要です。

パラレル推論は大規模なオントロジに最適ですが、小規模なオントロジでも推論パフォーマンスは向上する可能性があります。

パラレル推論の使用に関連して、一時的な記憶域のオーバーヘッドが発生します。パラレル推論によって、すべてのソースRDF/OWLモデルと既存の推論されたグラフに基づくすべてのトリプルを含むソース表が作成されます。この表は、ソース・モデルのデータおよび索引を格納するために必要な領域と比較して、10から30%余分に記憶域を使用する可能性があります。

3.2.11 名前付きグラフをベースにした推論(グローバルおよびローカル)の使用

Oracle Databaseのデフォルトの推論では、提供された1つ以上のソース・モデルすべてから、すべての表明されたトリプルを取得し、推論の閉包に到達するまですべての表明されたトリプルにセマンティク・ルールを適用します。指定されたソース・モデルに1つ以上の名前付きグラフが含まれる場合でも、すべての表明は、それが名前付きグラフの一部であるかどうかにかかわらず、単一のグラフから取得された場合と同様に扱われるため、違いはありません。(RDFセマンティク・グラフの名前付きグラフのサポートの概要は、「名前付きグラフ」を参照してください)。

このデフォルトの推論は、名前付きグラフがまったく考慮されないという点で、完全にグローバルなものと考えることができます。

ただし、名前付きグラフを使用する場合は、次のいずれかの機能を使用することで、デフォルトの推論をオーバーライドし、名前付きグラフを考慮に入れることができます。

NGGIとNGLIを一緒に使用する場合は、「NGGとNGLIの併用」で推奨される使用フローを参照してください。

伴意(ルール索引)の作成時に、SEM_APIS.CREATE_ENTAILMENTプロシージャの特定のパラメータおよびオプションを使用して、NGGIまたはNGLIを指定します。

3.2.11.1 名前付きグラフをベースにしたグローバル推論(NGGI)

名前付きグラフ・ベースのグローバル推論(NGGI)では、名前付きグラフ・レベル(モデル・レベルではなく)で推論に使用されるトリプルの有効範囲を絞り込むことができます。また、有効範囲を選択する際の柔軟性も高くなり、たとえば、0個以上の名前付きグラフまたはデフォルト・グラフ、あるいはその両方からトリプルを含めることも、指定したモデルからnullグラフ名を持つすべてのトリプルを含めることもできます。

たとえば、病院向けアプリケーションで、特定の病院の患者を説明する名前付きグラフのセットに含まれるすべての情報にのみ推論ルールを適用できます。患者に関連する名前付きグラフにインスタンス関連の表明(ABox)のみが含まれる場合、例3-6のように、1つ以上の追加のスキーマ関連モデル(TBox)を指定できます。

例3-6 名前付きグラフ・ベースのグローバル推論

EXECUTE sem_apis.create_entailment(
  'patients_inf',
  models_in         => sem_models('patients','hospital_ontology'),
  rulebases_in      => sem_rulebases('owl2rl'),
  passes            => SEM_APIS.REACH_CLOSURE,
  inf_components_in => null,
  options           => 'DOP=4,RAW8=T',
  include_default_g => sem_models('hospital_ontology'),
  include_named_g   => sem_graphs('<urn:hospital1_patient1>','<urn:hospital1_patient2>'),
  inf_ng_name       => '<urn:inf_graph_for_hospital1>',
  network_owner     =>'RDFUSER',
  network_name      =>'NET1'
  );

次に、例3-6について説明します。

  • 2つのモデルが使用されており、patientsには名前付きグラフのセットが含まれ(各名前付きグラフには特定の患者に関連するトリプルが保持されている)、hospital_ontologyには病院に対して定義される概念および関係が記述されたスキーマ情報が含まれています。これらの2つのモデルはともにソース・モデルであり、推論の全体的な有効範囲を設定しています。

  • include_default_gパラメータによって、指定モデル内のNULLグラフ名を持つすべてのトリプルがNGGIに参加します。この例では、モデルhospital_ontology内のNULLグラフ名を持つすべてのトリプルが、NGGIに含められます。

  • include_named_gパラメータによって、指定の名前付きグラフ(すべてのソース・モデル全体)からすべてのトリプルがNGGIに参加します。この例では、名前付きグラフ<urn:hospital1_patient1>および<urn:hospital1_patient2>からのトリプルが、NGGIに含められます。

  • inf_ng_nameパラメータは、グラフ名<urn:inf_graph_for_hospital1>を、NGGIによって推論されるすべての新しいトリプルに割り当てます。

3.2.11.2 名前付きグラフをベースにしたローカル推論(NGLI)

名前付きグラフ・ベースのローカル推論(NGLI)は、各名前付きグラフを単一の統一グラフとして表示するのではなく、別のエンティティとして処理します。推論ロジックは、各エンティティの境界内で実行されます。デフォルト・グラフでスキーマ関連の表明(TBox)を指定可能であり、そのデフォルト・グラフは各名前付きグラフの推論に参加します。たとえば、名前G1を持つグラフに基づいて推論されたトリプルには、その推論されたデータ・パーティション内の同じグラフ名G1が割り当てられます。

2つの個別の名前付きグラフの表明が結合されて新しい表明が生成されることはありません。

たとえば、次のような場合を考えてみます。

  • グラフG1は、次の表明を含みます。

    :John  :hasBirthMother  :Mary .
    
  • グラフG2は、次の表明を含みます。

    :John  :hasBirthMother  :Bella .
    
  • デフォルト・グラフは、:hasBirthMother owl:FunctionalPropertyであるという表明を含みます。(この表明はnullグラフ名を持ちます。)

この例では、名前付きグラフをベースにしたローカル推論(NGLI)は、:Maryowl:sameAs :Bellaであるとは推論しません(この2つの表明が2つの異なるグラフG1およびG2から得られているためです)。対照的に、G1G2および機能的属性定義を含む名前付きグラフ・ベースのグローバル推論(NGGI)では、:Maryowl:sameAs :Bellaであると推測できます

現在、NGLIは証明の生成、ユーザー定義ルール、最適化されたowl:sameAsの処理または増分推論とは連携しません。

例3-7 名前付きグラフ・ベースのローカル推論

例3-7に、NGLIを示します。

EXECUTE sem_apis.create_entailment(
  'patients_inf',
  models_in         => sem_models('patients','hospital_ontology'),
  rulebases_in      => sem_rulebases('owl2rl'),
  passes            => SEM_APIS.REACH_CLOSURE,
  inf_components_in => null,
  options           => 'LOCAL_NG_INF=T',
  network_owner=>'RDFUSER', 
  network_name=>'NET1'
);

次に、例3-7について説明します。

  • 3つのモデルpatientsとhospital_ontologyは、ともにソース・モデルで、例2-6のグローバル推論の場合と同様に、推論の全体的な有効範囲を設定します。NULLのグラフ名を持つすべてのトリプルは、共通スキーマ(TBox)の一部として処理されます。推論は、共通スキーマに結合された単一の名前付きグラフすべての境界内で実行されます。

  • optionsパラメータのキーワードと値のペアLOCAL_NG_INF=Tは、名前付きグラフ・ベースのローカル推論(NGLI)が実行されることを示しています。

設計上、NGLIはデフォルト・グラフ自体には適用されません。ただし、デフォルト・グラフで名前付きグラフ・ベースのグローバル推論(NGGI)を簡単に適用して、inf_ng_nameパラメータにnullを設定することができます。このように、TBox推論は事前に計算され、全体的なパフォーマンスと記憶域の消費が改善されます。

NGLIでは、次のことは許可されません。

  • 複数の名前付きグラフからの混合トリプルに基づいた新しい関係の推論

  • デフォルト・グラフからのトリプルのみを使用した新しい関係の推論。

通常期待される推論を取得するには、スキーマ表明とインスタンス表明を別に保持する必要があります。スキーマ表明(たとえば、:A rdfs:subClassOf :B:p1 rdfs:subPropertyOf :p2)は、名前なしのトリプル(nullグラフ名を持つ)としてデフォルト・グラフに格納する必要があります。これに対して、インスタンス表明(たとえば、:X :friendOf :Y)は、名前付きグラフの1つに格納する必要があります。

NGLIを使用して、セマンティクに索引付けされたドキュメントでドキュメント中心の推論を実行する方法の説明および例については、「ドキュメント中心の推論の実行」を参照してください。

3.2.11.3 NGGIとNGLIの併用

次に、NGGIとNGLIを併用する場合に推奨される使用フローを示します。その前提として、TBoxとABoxは2つの別々のモデルに格納されており、TBoxにはスキーマ定義が含まれ、TBox内のすべてのトリプルはnullグラフ名を持つのに対し、ABoxはインスタンス関連データを記述する名前付きグラフのセットで構成されているものとします。

  1. TBoxでNGGIを単独で起動します。たとえば、次のようにします。
    EXECUTE sem_apis.create_entailment(
        'TEST_INF',
        sem_models('abox','tbox'),
        sem_rulebases('owl2rl'),
        SEM_APIS.REACH_CLOSURE,
        include_default_g=>sem_models('tbox'),
        network_owner=>'RDFUSER',
        network_name=>'NET1'
    );
    
  2. すべての名前付きグラフに対してNGLIを起動します。たとえば、次のようにします。
    EXECUTE sem_apis.create_entailment(
        'TEST_INF',
        sem_models('abox','tbox'),
        sem_rulebases('owl2rl'),
        SEM_APIS.REACH_CLOSURE,
        options => 'LOCAL_NG_INF=T,ENTAIL_ANYWAY=T',
               network_owner=>'RDFUSER',
               network_name=>'NET1'
    );
    

    ENTAIL_ANYWAY=Tを指定していますが、これはENTAIL_ANYWAY=Tが指定されていないと、ステップ1のNGGIコールは推論されたグラフのステータスをVALIDに設定し、ステップ2のSEM_APIS.CREATE_ENTAILMENTプロシージャ・コールがすぐに終了するためです。

3.2.12 選択的推論の実行(高度な情報)

選択的推論は、コンポーネント・ベースの推論です。この操作では、推論を関心のある特定のOWLコンポーネントに限定します。選択的推論を実行するには、SEM_APIS.CREATE_ENTAILMENTプロシージャのinf_components_inパラメータを使用して、コンポーネントのカンマ区切りのリストを指定します。最終的な推論は、指定したルールベースと指定したコンポーネントの和集合によって決定されます。

例3-8 選択的推論の実行

例3-8では、サブクラス(SCOH)関係に基づくクラス階層と、サブプロパティ(SPOH)関係に基づくプロパティ階層に推論を限定します。この例では、空のルールベースを作成してから、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールで2つのコンポーネント('SCOH,SPOH')を指定します。

EXECUTE sem_apis.create_rulebase('my_rulebase', network_owner=>'RDFUSER', network_name=>'NET1');
 
EXECUTE sem_apis.create_entailment('owltst_idx', sem_models('owltst'), sem_rulebases('my_rulebase'), SEM_APIS.REACH_CLOSURE, 'SCOH,SPOH', network_owner=>'RDFUSER', network_name=>'NET1');

使用可能なコンポーネント・コードは、SCOHCOMPHDISJHSYMMHINVHSPIHMBRHSPOHDOMHRANHEQCHEQPHFPHIFPHDOMRANSCODISJCOMPINVSPOFPIFPSYMMTRANSDIFSAMCHAINHASKEYONEOFINTERSECTINTERSECTSCOHMBRLSTPROPDISJHSKOSAXIOMSSNOMEDSVFHTHINGHTHINGSAMUNIONRDFP1RDFP2RDFP3RDFP4RDFP6RDFP7RDFP8AXRDFP8BXRDFP9RDFP10RDFP11RDFP12ARDFP12BRDFP12CRDFP13ARDFP13BRDFP13CRDFP14ARDFP14BXRDFP15RDFP16RDFS2RDFS3RDFS4aRDFS4bRDFS5RDFS6RDFS7RDFS8RDFS9RDFS10RDFS11RDFS12RDFS13です。

接頭辞RDFP付きのコンポーネントに対応するルールの詳細は、『Completeness, decidability and complexity of entailment for RDF Schema and a semantic extension involving the OWL vocabulary』(H.J. Horst)を参照してください。

コンポーネントを選択解除する構文は、component_nameの次にマイナス記号(-)を付けます。たとえば、次の文では、subClassOf階層を計算することなくOWLPrime推論を実行します。

EXECUTE sem_apis.create_entailment('owltst_idx', sem_models('owltst'), sem_rulebases('OWLPRIME'), SEM_APIS.REACH_CLOSURE, 'SCOH-', network_owner=>'RDFUSER', network_name=>'NET1');

デフォルトでは、OWLPrimeルールベースは、owl:sameAsの推移的セマンティクを実装しています。OWLPrimeには、次のルール(セマンティク)は含まれません。

U   owl:sameAs   V  .
U     p    X  .        ==>   V  p   X   .
 
U   owl:sameAs   V  .
X     p    U  .        ==>   X   p   V   .

これらのルールが含まれない理由は、通常、そのルールにより数多くの表明が生成されるためです。これらの表明を含める必要がある場合は、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールでSAMコンポーネント・コードを指定します。

3.3 セマンティク演算子を使用したリレーショナル・データの問合せ

セマンティク演算子を使用すると、表の列のデータとオントロジの用語間のセマンティク関係に基づいてオントロジ支援形式でリレーショナル・データを問い合せることができます。

SEM_RELATEDセマンティク演算子では、セマンティク関係に基づいて行を取得できます。SEM_DISTANCEセマンティク演算子では、セマンティク関係の距離量が戻されるため、その距離量を使用してSEM_RELATED演算子で戻された行を順序付けることや、制限することが可能です。索引タイプMDSYS.SEM_INDEXTYPEでは、このような問合せを効率的に実行することで、大規模なデータセットに対してスケーラブルなパフォーマンスを発揮できます。

ノート:

スキーマプライベート・セマンティク・ネットワークでは、SEM_RELATEDおよびSEM_DISTANCEはサポートされません。

3.3.1 SEM_RELATED演算子の使用

疾患オントロジの例を題材として、セマンティクな一致を必要とする「診断がImmune_System_Disorderタイプの患者をすべて検出する」という問合せについて検討します。構文的な一致に基づくPATIENTS表(「例: 疾患オントロジ」を参照)の一般的なデータベース問合せでは、どの行も戻されません。Immune_System_Disorderとまったく同じ値を含むDIAGNOSIS列のある行は存在しないためです。たとえば、次の問合せではどの行も戻されません。

SELECT diagnosis FROM patients WHERE diagnosis = 'Immune_System_Disorder';

例3-9 SEM_RELATED演算子

ただし、患者のデータ表の多くの行は、診断上このクラスに分類されるため、関連性を保持しています。例3-9では、(字句の等価性ではなく) SEM_RELATED演算子を使用して、患者のデータ表から関連するすべての行を取得します。(この例の場合、Immune_System_Disorderという語句には名前空間の接頭辞が付けられており、デフォルトの仮定として表の列の値にも名前空間の接頭辞が含まれます。ただし、「値がURIとして格納されない場合のURIPREFIXの使用」で説明されているように、いつでもそうなるわけではありません。)

SELECT diagnosis FROM patients 
  WHERE SEM_RELATED (diagnosis, 
    '<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
    '<http://www.example.org/medical_terms/Immune_System_Disorder>', 
    sem_models('medical_ontology'), sem_rulebases('owlprime')) = 1;

SEM_RELATED演算子には、次の属性があります。

SEM_RELATED(
  sub  VARCHAR2,
  predExpr  VARCHAR2,
  obj  VARCHAR2,
  ontologyName  SEM_MODELS,
  ruleBases  SEM_RULEBASES,
  index_status  VARCHAR2,
  lower_bound INTEGER,
  upper_bound INTEGER
 ) RETURN INTEGER;

sub属性は、検索される表の列の名前です。表の列の語句は、通常、<主語、述語、目的語>のトリプル・パターンにおける主語です。

predExpr属性は、主語ノードから目的語ノードに向かうパスの一端のラベルとして出現可能な述語を表します。

obj属性は、その関連語句(predExpr属性により関連付けられる語句)をsub属性で指定された表の列内で検出する必要のあるオントロジの語句を表します。この語句は、通常、<主語、述語、目的語>のトリプル・パターンにおける目的語です。(等価演算子を含む問合せでは、これが問合せ語句になります。)

ontologyName属性は、語句間の関係を含むオントロジの名前です。

rulebases属性は、新しい関係を推論するためにオントロジに適用されるルールを含む1つ以上のルールベースを示します。問合せに対する回答は、オントロジから取得される関係と、この属性の指定時に推論される新しい関係の両方に基づきます。

index_statusオプション属性では、関連する伴意(指定したルールベースがオントロジに適用されたときに作成されるルール索引)のステータスが無効の場合でも、データを問い合せることができます。この属性がnullの場合、伴意のステータスが無効だと、問合せによりエラーが戻されます。この属性がnullではない場合、文字列VALIDINCOMPLETEまたはINVALIDを使用して、問合せを成功させるための伴意の最低限のステータスを指定する必要があります。OWLでは単調性は保証されないため、OWLルールベースを指定する場合、値INCOMPLETEを使用しないでください。

lower_boundおよびupper_boundオプション属性では、関連する語句間の関係の距離量に対して限界値を指定できます。距離量の詳細は、「SEM_DISTANCE補助演算子の使用」を参照してください。

SEM_RELATED演算子では、オントロジ内の指定したpredExpr関係について、2つの入力語句が関連している場合、1が戻されます。2つの入力語句が関連していない場合、0が戻されます。下限値および上限値を指定した場合は、lower_bound以上およびupper_bound以下の距離量で2つの入力語句が関連している場合に1が戻されます。

3.3.2 SEM_DISTANCE補助演算子の使用

SEM_DISTANCE補助演算子は、SEM_RELATED演算子の使用によりフィルタされた行の距離量を計算します。SEM_DISTANCE演算子の書式は、次のとおりです。

SEM_DISTANCE (number) RETURN NUMBER;

number属性には、SEM_RELATED演算子のコールで指定した最後の属性の数と一致していれば、どのような数でも指定できます(例3-10を参照)。問合せでは、主演算子と補助演算子を複数起動できるため、この数を使用して補助演算子SEM_DISTANCEの起動と特定のSEM_RELATED (主演算子)の起動を一致させます。

例3-10 SEM_DISTANCE補助演算子

例3-10は、例3-9を拡張したもので、SEM_DISTANCE補助演算子を含む複数の文が使用されています。SEM_DISTANCE補助演算子は、2つの語句間の距離を測定することで、それらの語句(ここでは、患者の診断と語句Immune_System_Disorder)の関連がどの程度近似しているかを計算します。「例: 疾患オントロジ」の疾患オントロジを使用すると、AIDSImmune_System_Disorder間の距離は3です。

SELECT diagnosis, SEM_DISTANCE(123) FROM patients 
  WHERE SEM_RELATED (diagnosis, 
    '<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
    '<http://www.example.org/medical_terms/Immune_System_Disorder>', 
    sem_models('medical_ontology'), sem_rulebases('owlprime'), 123) = 1;
 
SELECT diagnosis FROM patients 
  WHERE SEM_RELATED (diagnosis,
    '<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
    '<http://www.example.org/medical_terms/Immune_System_Disorder>', 
    sem_models('medical_ontology'), sem_rulebases('owlprime'), 123) = 1
  ORDER BY SEM_DISTANCE(123);
 
SELECT diagnosis, SEM_DISTANCE(123) FROM patients 
  WHERE SEM_RELATED (diagnosis,
    '<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
    '<http://www.example.org/medical_terms/Immune_System_Disorder>', 
    sem_models('medical_ontology'), sem_rulebases('owlprime'), 123) = 1 
  AND SEM_DISTANCE(123) <= 3;

例3-11 SEM_DISTANCEを使用した返却行数の制限

例3-11では、距離情報を使用して、主演算子により戻される行の数を制限します。SEM_RELATEDの起動で指定された目的語属性に関連する用語を含む行のうち、距離が2以上4以下のすべての行が取得されます。

SELECT diagnosis FROM patients 
  WHERE SEM_RELATED (diagnosis,
    '<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
    '<http://www.example.org/medical_terms/Immune_System_Disorder>', 
    sem_models('medical_ontology'), sem_rulebases('owlprime'), 2, 4) = 1;

例3-11では、SEM_DISTANCE演算子を使用するかわりにSEM_RELATED演算子のlower_boundおよびupper_boundパラメータを使用して下限値および上限値を指定しています。SEM_DISTANCE演算子は、例3-10の最後のSELECT文のように、戻される行を制限する場合にも使用できます。

3.3.2.1 距離情報の計算

距離は、推論(伴意)の実行中に、推移的プロパティとして定義されたOWLプロパティ、RDFS subClassOfプロパティおよびRDFS subPropertyOfプロパティに対して生成されます。これらのプロパティを通じてリンクされた2つの語句間の距離は、階層クラス構造内の語句間の最短距離として計算されます。他のプロパティを通じてリンクされた2つの語句間の距離は、未定義のためNULLに設定されます。

(階層クラス構造として参照される)元のモデルの推移的プロパティ・リンクの距離はそれぞれ1となり、推論されるトリプルの距離は2つの用語間のリンク数に従って生成されます。ここでは、次の架空の使用例について検討します。

  • 元のグラフにC1 rdfs:subClassOf C2およびC2 rdfs:subClassOf C3が含まれる場合、C1 rdfs:subClassOf C3が導出されます。この場合は、次のようになります。

    • C1 rdfs:subClassOf C2: 距離 = 1 (モデル内に存在するため)。

    • C2 rdfs:subClassOf C3: 距離 = 1 (モデル内に存在するため)。

    • C1 rdfs:subClassOf C3: 距離 = 2 (推論時に生成されるため)。

  • 元のグラフにP1 rdfs:subPropertyOf P2およびP2 rdfs:subPropertyOf P3が含まれる場合、P1 rdfs:subPropertyOf P3が導出されます。この場合は、次のようになります。

    • P1 rdfs:subPropertyOf P2: 距離 = 1 (モデル内に存在するため)。

    • P2 rdfs:subPropertyOf P3: 距離 = 1 (モデル内に存在するため)。

    • P1 rdfs:subPropertyOf P3: 距離 = 2 (推論時に生成されるため)。

  • 元のグラフにC1 owl:equivalentClass C2およびC2 owl:equivalentClass C3が含まれる場合、C1 owl:equivalentClass C3が導出されます。この場合は、次のようになります。

    • C1 owl:equivalentClass C2: 距離 = 1 (モデル内に存在するため)。

    • C2 owl:equivalentClass C3: 距離 = 1 (モデル内に存在するため)。

    • C1 owl:equivalentClass C3: 距離 = 2 (推論時に生成されるため)。

SEM_RELATED演算子は、ユーザー定義のルールベースとともに動作します。ただし、SEM_DISTANCE演算子とユーザー定義のルールベースの併用は、現時点ではサポートされないため、エラーが発生します。

3.3.3 MDSYS.SEM_INDEXTYPEタイプのセマンティク索引の作成

SEM_RELATED演算子を使用する場合、オントロジ語句を含む列に対してMDSYS.SEM_INDEXTYPEタイプのセマンティク索引を作成できます。この索引を作成することで、問合せをより効率的に実行できます。作成する索引のタイプを指定するため、CREATE INDEX文にINDEXTYPE IS MDSYS.SEM_INDEXTYPE句を含める必要があります。

例3-12 セマンティク索引の作成

例3-12では、「例: 疾患オントロジ」のオントロジを使用するPATIENTS表のDIAGNOSIS列に対してDIAGNOSIS_SEM_IDXというセマンティク索引を作成します。

CREATE INDEX diagnosis_sem_idx
  ON patients (diagnosis) 
  INDEXTYPE IS MDSYS.SEM_INDEXTYPE;

索引を使用するには、索引の作成される列(例3-12ではDIAGNOSIS)がSEM_RELATED演算子の最初のパラメータである必要があります。最初のパラメータではない場合、その索引は問合せの実行時に使用されません。

例3-13 モデルおよびルールベースを指定するセマンティク索引の作成

特定のセマンティク問合せのパフォーマンスを向上するため、索引の作成時に1つ以上のモデルおよびルールベースを指定して、セマンティク索引用の統計情報を生成できます。例3-13では、指定したモデルおよびルールベースの統計情報も同時に生成する索引を作成します。この索引は、問合せ時に他のモデルやルールベースと組み合せて使用できますが、統計情報は、索引の作成時に指定したモデルおよびルールベースが問合せで指定したモデルおよびルールベースと同じ場合にのみ使用されます。

CREATE INDEX diagnosis_sem_idx
  ON patients (diagnosis) 
  INDEXTYPE IS MDSYS.SEM_INDEXTYPE('ONTOLOGY_MODEL(medical_ontology), 
    RULEBASE(OWLPrime)');

例3-14 統計情報の生成が効果的な問合せ

統計情報は、セマンティク関係の距離でソートされた上位k個の結果を戻す問合せを実行する場合に便利です。例3-14に、このような問合せを示します。

SELECT /*+ FIRST_ROWS */ diagnosis FROM patients 
  WHERE SEM_RELATED (diagnosis,
    '<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
    '<http://www.example.org/medical_terms/Immune_System_Disorder>', 
    sem_models('medical_ontology'), sem_rulebases('owlprime'), 123) = 1
  ORDER BY SEM_DISTANCE(123);

3.3.4 索引付けされた列が最初のパラメータではない場合のSEM_RELATEDおよびSEM_DISTANCEの使用

MDSYS.SEM_INDEXTYPEタイプの索引が、SEM_RELATED演算子の最初のパラメータに相当する表の列に対して作成されている場合、その索引は使用されます。たとえば、次の問合せでは、Immune_System_Disorderのサブクラス(rdfs:subClassOf)であるDIAGNOSIS列の値を含むすべての行が取得されます。

SELECT diagnosis FROM patients 
  WHERE SEM_RELATED (diagnosis, 
    '<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
    '<http://www.example.org/medical_terms/Immune_System_Disorder>', 
    sem_models('medical_ontology'), sem_rulebases('owlprime')) = 1;

このとき、かわりにImmune_System_DisorderがサブクラスであるDIAGNOSIS列の値を含むすべての行を取得する必要があるとします。問合せを次のように書き換えます。

SELECT diagnosis FROM patients 
  WHERE SEM_RELATED
    ('<http://www.example.org/medical_terms/Immune_System_Disorder>', 
    '<http://www.w3.org/2000/01/rdf-schema#subClassOf>', 
    diagnosis, 
    sem_models('medical_ontology'), sem_rulebases('owlprime')) = 1;

この場合、DIAGNOSIS列はSEM_RELATED演算子の最初のパラメータではないため、DIAGNOSIS列のセマンティク索引は使用されません。索引を使用するには、inverseOfキーワードを使用して前述の問合せを次のように変更します。

SELECT diagnosis FROM patients 
  WHERE SEM_RELATED (diagnosis,
    'inverseOf(http://www.w3.org/2000/01/rdf-schema#subClassOf)',
    '<http://www.example.org/medical_terms/Immune_System_Disorder>', 
    sem_models('medical_ontology'), sem_rulebases('owlprime')) = 1;

この形式により、(索引が作成されている)表の列がSEM_RELATED演算子の最初のパラメータとなり、Immune_System_DisorderがサブクラスであるDIAGNOSIS列の値を含むすべての行が取得されます。

3.3.5 値がURIとして格納されない場合のURIPREFIXの使用

デフォルトでは、セマンティク演算子のサポートは、表に格納される値がURIであることを前提とします。これらのURIでは、異なる名前空間を使用できます。ただし、表の値にURIが含まれない場合は、セマンティク索引の作成時にURIPREFIXキーワードを使用してURIを指定できます。この場合、指定したURIが表の値に接頭辞として追加され、索引構造に格納されます。(ただし、複数のURIは使用できません。)

例3-15では、URI接頭辞を使用するセマンティク索引を作成します。

例3-15 セマンティク索引作成時のURI接頭辞の指定

CREATE INDEX diagnosis_sem_idx
  ON patients (diagnosis) 
  INDEXTYPE IS MDSYS.SEM_INDEXTYPE
  PARAMETERS('URIPREFIX(<http://www.example.org/medical/>)');

URI接頭辞は解析なしで(索引構造の)表の値に追加されるため、URIの最後のスラッシュ(/)文字は重要です。