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_rdf_graph('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_INFERRED_GRAPHプロシージャをコールします。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_inferred_graph('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 inferred graph (rules index).
SQL> desc RDFUSER.NET1#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_INFERRED_GRAPHプロシージャをコールします。

例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_inferred_graph('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_INFERRED_GRAPHプロシージャのコールでPROOF=T_を指定します。

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

PROOF=Tを指定すると、推論された各トリプルの証明を含むビューが作成されます。ビュー名は、先頭にRDFUSER.NET1#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をすべて取得するには、RDFグラフ・ビューおよび推論グラフ・ビューを問い合せます。例3-4では、RDFグラフ・ビュー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_INFERRED_GRAPHを起動することはできません。この場合は、最初に推論グラフを削除し、PROOF=Tを指定して再度作成する必要があります。

3.2.5 OWL RDFグラフおよび推論グラフの検証

OWLオントロジには、充足不可能なクラス、充足不可能なクラスに属するインスタンス、同じでありかつ異なると同時に表明される2つの個体など、様々なエラーが含まれる可能性があります。SEM_APIS.VALIDATE_RDF_GRAPH関数とSEM_APIS.VALIDATE_INFERRED_GRAPH関数を使用して、元のRDFグラフと推論グラフの不整合をそれぞれ検出できます。

例3-5 推論グラフの検証

例3-5では、SEM_APIS.VALIDATE_INFERRED_GRAPH関数を使用します。この関数では、エラーが検出されない場合は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 inferred graph first.
SQL>  exec sem_apis.drop_inferred_graph('owltst_idx', network_owner=>'RDFUSER', network_name=>'NET1');
PL/SQL procedure successfully completed.
 
SQL> -- Perform OWL inferencing.
SQL> exec sem_apis.create_inferred_graph('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_inferred_graph
SQL > 
declare 
  lva sem_longvarchararray; 
  idx int; 
begin 
  lva := sem_apis.validate_inferred_graph(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_INFERRED_GRAPHの使用

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

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

推論グラフにOPT_SAMEAS=Tオプションが使用された後は、その推論グラフに対するSEM_APIS.CREATE_INFERRED_GRAPHの以降の使用でも、すべてOPT_SAMEAS=Tを使用する必要があります。そうしないと、エラーがレポートされます。最適化されたsameAsの処理を無効にするには、推論グラフを最初に削除する必要があります。

クリーク・メンバーシップ情報は、SEMC_inferred-graph-nameという名前のビューに格納されます。ここで、inferred-graph-nameは推論グラフの名前です。表3-3に、各SEMC_inferred-graph-nameビューの列を示します。

表3-3 SEMC_inferred_graph_nameビューの列

列名 データ型 説明

MODEL_ID

NUMBER

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

VALUE_ID

NUMBER

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

CLIQUE_ID

NUMBER

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

領域を節約するために、SEMC_inferred-graph-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"がRDFグラフにあったとしても、冗長なトリプルが除外される推論統合フェーズ中に置き換えられています。ただし、統合されたowl:sameAs情報を含むRDFUSER.NET1#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_inferred_graph ('M_IDX',sem_models('M'),
      sem_rulebases('OWLPRIME'),null,null, 'INC=T', network_owner=>'RDFUSER', network_name=>'NET1');
  • SEM_APIS.ENABLE_INC_INFERENCEプロシージャを使用します。

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

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

推論グラフの増分推論は、推論グラフの作成に関連するRDFグラフのアプリケーション表のトリガーによって異なります。つまり、増分推論は、コールでdelta_inパラメータを使用してトリプルを指定しないかぎり、従来のパス・ロードを使用して推論グラフの基礎となるアプリケーション表にトリプルが挿入される場合にのみ機能します。次の例に示すように、SEM_APIS.CREATE_INFERRED_GRAPHプロシージャでは、RDFグラフM_NEWのトリプルがRDFグラフMに追加され、推論グラフM_IDXが新しい推論で更新されます。

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

複数のRDFグラフが増分推論コールに関与する場合、delta_in RDFグラフまたはRDFグラフを追加する宛先RDFグラフを指定するには、optionsパラメータでDEST_MODEL=<rdf_graph_name>を指定します。たとえば、次の場合、RDFグラフM_NEWのRDFデータがRDFグラフM2に追加されます。

EXECUTE sem_apis.create_inferred_graph('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_INFERRED_GRAPHプロシージャは、通常の(非増分)推論に戻ります。

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

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

  • 最適化されたowl:sameAs処理(OPT_SAMEAS)、ユーザー定義ルール、VPD対応RDFグラフまたはバージョン対応RDFグラフでは機能しません。

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

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

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

3.2.10 パラレル推論の使用

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

EXECUTE sem_apis.create_inferred_graph('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グラフと既存の推論されたグラフに基づくすべてのトリプルを含むソース表が作成されます。この表は、ソースRDFグラフのデータおよび索引を格納するために必要な領域と比較して、10から30%余分に記憶域を使用する可能性があります。

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

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

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

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

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

推論グラフの作成時に、SEM_APIS.CREATE_INFERRED_GRAPHプロシージャの特定のパラメータおよびオプションを使用して、NGGIまたはNGLIを指定します。

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

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

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

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

EXECUTE sem_apis.create_inferred_graph(
  'patients_inf',
  rdf_graphs_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つのRDFグラフが使用されており、patientsには名前付きグラフのセットが含まれ(各名前付きグラフには特定の患者に関連するトリプルが保持されている)、hospital_ontologyには病院に対して定義される概念および関係が記述されたスキーマ情報が含まれています。これら2つのRDFグラフをまとめてソース・グラフとし、推論の全体的な有効範囲を設定します。

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

  • include_named_gパラメータによって、指定の名前付きグラフ(すべてのソースRDFグラフ全体)からすべてのトリプルが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_inferred_graph(
  'patients_inf',
  rdf_graphs_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について説明します。

  • 2つのRDFグラフpatientsとhospital_ontologyは、ともにソース・グラフで、例3-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つの別々のRDFグラフに格納されており、TBoxにはスキーマ定義が含まれ、TBox内のすべてのトリプルはnullグラフ名を持つのに対し、ABoxはインスタンス関連データを記述する名前付きグラフのセットで構成されているものとします。

  1. TBoxでNGGIを単独で起動します。たとえば:
    EXECUTE sem_apis.create_inferred_graph(
        '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_inferred_graph(
        '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_INFERRED_GRAPHプロシージャ・コールがすぐに終了するためです。

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

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

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

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

EXECUTE sem_apis.create_rulebase('my_rulebase', network_owner=>'RDFUSER', network_name=>'NET1');
 
EXECUTE sem_apis.create_inferred_graph('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_inferred_graph('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_INFERRED_GRAPHプロシージャのコールでSAMコンポーネント・コードを指定します。