この章では、Web Ontology Language(OWL)のサブセットのサポートに関連する概念について説明します。この章の内容は、第1章の情報に基づいており、読者がオントロジ、プロパティ、関係などのOWLに関する主要な概念についてよく理解していることを前提とします。OWLの詳細は、http://www.w3.org/TR/owl-ref/
にある「OWL Web Ontology Language Reference」を参照してください。
この章には次の項が含まれます。
オントロジは、特定の領域で共有される知識の概念化です。オントロジは、クラス、プロパティおよび(オプションの)インスタンスの集合で構成されます。クラスは、通常、クラス階層(サブクラスとスーパークラスの関係)によって関連付けられます。同様に、プロパティは、プロパティ階層(サブプロパティとスーパープロパティの関係)によって関連付けられます。プロパティは、対称的または推移的(あるいはその両方)です。プロパティには、それぞれ指定されたドメイン、レンジおよびカーディナリティの制約があります。
RDFSベースのオントロジでは、クラス階層、プロパティ階層、instanceOf
関係、およびプロパティのドメインとレンジの指定のみが可能です。
OWLオントロジは、RDFSベースのオントロジを基盤としますが、追加でプロパティ特性を指定できます。OWLオントロジは、さらにOWL-Lite、OWL-DLおよびOWL Fullに分類されます。OWL-Liteでは、カーディナリティの最大値と最小値が0または1に制限されています。OWL-DLでは、この制限が緩和されており、最大値と最小値を指定できます。OWL Fullでは、OWL-DLやOWL-Liteオントロジとは異なり、インスタンスをクラスとしても定義できます。
セマンティク・データでサポートされる、またはサポートされないOWL機能の詳細は、2.1.2項を参照してください。
図2-1に、がんのオントロジ(がんに関連するクラスとプロパティの記述)の一部を示します。この場合の要件は、DIAGNOSIS列を持つPATIENTSデータ表が存在することです(DIAGNOSIS列には、Diseases_and_Disorders
(疾患と障害)クラス階層の値が含まれる必要があります)。
図2-1のがんのオントロジでは、診断Immune_System_Disorder
(免疫系障害)にAutoimmune_Disease
(自己免疫疾患)およびImmunodeficiency_Syndrome
(免疫不全症候群)という2つのサブクラスが含まれます。診断Autoimmune_Disease
には、サブクラスRheumatoid_Arthritis
(関節リウマチ)が含まれます。また、診断Immunodeficiency_Syndrome
には、サブクラスT_Cell_Immunodeficiency
(T細胞免疫不全)が含まれ、このサブクラスにはさらにサブクラスAIDS
が含まれます。
PATIENTS表のデータには、表2-1に示すようなPATIENT_ID列およびDIAGNOSIS列の値が含まれます。
表2-1 PATIENTS表のデータの例
PATIENT_ID | DIAGNOSIS |
---|---|
1234 |
Rheumatoid_Arthritis |
2345 |
Immunodeficiency_Syndrome |
3456 |
AIDS |
オントロジを問い合せるには、SEM_MATCHテーブル・ファンクション(1.6項を参照)を使用するか、SEM_RELATED演算子とその補助演算子(2.3項を参照)を使用します。
この項では、サポートされるOWLボキャブラリのサブセットについて説明します。
Oracle Databaseでは、表現度の向上に従ってRDFS++、OWLSIFおよびOWLPrimeボキャブラリに加え、OWL 2 RLがサポートされます。サポートされる各ボキャブラリには、対応するルールベースがあります(ただし、これら3つのボキャブラリの基礎となる伴意ルールが内部的に実装されるため、ルールベースの内容を指定する必要はありません)。サポートされるボキャブラリは、次のとおりです。
RDFS++: RDFSの最小限の拡張です。RDFSにowl:sameAs
とowl: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機能が含まれます。
基本: クラス、サブクラス、プロパティ、サブプロパティ、ドメイン、レンジ、タイプ
プロパティ特性: 推移的、対称的、関数的、逆関数的、逆関係
クラス比較: 等価、排他
プロパティ比較: 等価
個体比較: 同一、別個
クラス式: 補集合
プロパティ制約: hasValue
、someValuesFrom
、allValuesFrom
pD*と同様に、これらの値制約でサポートされるセマンティクは、常に内包的です(IFセマンティク)。
OWL 2 RL: W3C勧告の「OWL 2 Web Ontology Language Profiles」のOWL 2 RLに関する項(http://www.w3.org/TR/owl-profiles/#OWL_2_RL
)では、「OWL 2 RLプロファイルの対象は、表現力をそれほど犠牲にせずにスケーラブルな推論を必要とするアプリケーションです。これは、言語の完全な表現能力と引換えに効率性を獲得できるOWL 2アプリケーションと、OWL 2による追加の表現能力を必要とするRDF(S)アプリケーションの両方に対応するように設計されています」と説明されています。
システム定義のルールベース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');
-- 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'));
OWL2RL
ルールベースを使用すると、推論関連の最適化(パラレル推論やRAW8など)がすべて適用可能になります。
表2-2に、サポートされる各ルールベースに含まれるRDFSおよびOWLのボキャブラリ構成要素を示します。
表2-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 |
伴意ルールを使用してネイティブOWL推論を実行できます。この項では、単純なオントロジの作成、ネイティブ推論の実行、および追加の拡張機能について説明します。
例2-1では、単純なOWLオントロジを作成して、2つのURIが同じエンティティを示しているという内容の1つの文を挿入し、SEM_MATCHテーブル・ファンクションを使用した問合せを実行します。
例2-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'); 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')); 1 row created. SQL> commit; SQL> -- Use SEM_MATCH to perform a simple query. SQL> select s,p,o from table(SEM_MATCH('(?s ?p ?o)', SEM_Models('OWLTST'), null, null, null ));
例2-2では、SEM_APIS.CREATE_ENTAILMENTプロシージャをコールします。OWLルールはOracleセマンティク・テクノロジ推論エンジンにすでに組み込まれているため、ルールベースを作成してそれにルールを追加する必要はありません。
例2-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')); 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,p,o FROM table(SEM_MATCH('(?s ?p ?o)', SEM_MODELS('OWLTST'), SEM_RULEBASES('OWLPRIME'), null, null ));
例2-3では、ユーザー定義のルールベースを作成して、簡略化したuncleOf
ルール(ある人物の父親の兄弟はその人物のおじであるという言明)を挿入し、SEM_APIS.CREATE_ENTAILMENTプロシージャをコールします。
例2-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')); 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')); SQL> -- Create a user-defined rulebase. SQL> EXECUTE sem_apis.create_rulebase('user_rulebase'); SQL> -- Insert a simple "uncle" rule. SQL> INSERT INTO mdsys.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'); SQL> -- In the result of the following query, :Jack :uncleOf :Mary is inferred. SQL> SELECT s,p,o FROM table(SEM_MATCH('(?s ?p ?o)', SEM_MODELS('OWLTST'), SEM_RULEBASES('OWLPRIME','USER_RULEBASE'), null, null ));
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');
PROOF=T
を指定すると、推論された各トリプルの証明を含むビューが作成されます。ビュー名は、MDSYS.SEMI_
という接頭辞付きの伴意名です。このビューには、LINK_IDおよびEXPLAIN(証明)という2つの関連列があります。次の例では、生成された各トリプルのLINK_ID値と証明を表示します(LINK_ID値は説明のために短縮しています)。
SELECT link_id || ' generated by ' || explain as triple_and_its_proof FROM mdsys.semi_owltst_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
証明用の主語、述語、目的語の完全なURIを取得するには、モデル・ビューおよび伴意(ルール索引)ビューを問い合せます。例2-4では、モデル・ビューMDSYS.SEMM_OWLTSTと伴意ビューMDSYS.SEMI_OWLTST_IDXを使用して、LINK_ID値および関連するトリプルの内容を表示します。
例2-4 証明情報の表示
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 mdsys.semm_owltst union all select * from mdsys.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>')
例2-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
を指定して再度作成する必要があります。
OWLオントロジには、充足不可能なクラス、充足不可能なクラスに属するインスタンス、同じでありかつ異なると同時に表明される2つの個体など、様々なエラーが含まれる可能性があります。SEM_APIS.VALIDATE_MODELおよびSEM_APIS.VALIDATE_ENTAILMENTファンクションを使用すると、それぞれ元のデータ・モデルと伴意における非一貫性を検出できます。
例2-5では、SEM_APIS.VALIDATE_ENTAILMENTファンクションを使用します。このファンクションでは、エラーが検出されない場合はNULL値が戻され、エラーが検出された場合は文字列のVARRAYが戻されます。
例2-5 伴意の検証
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'));
SQL> -- Drop entailment first.
SQL> exec sem_apis.drop_entailment('owltst_idx');
PL/SQL procedure successfully completed.
SQL> -- Perform OWL inferencing.
SQL> exec sem_apis.create_entailment('owltst_idx', sem_models('OWLTST'), sem_rulebases('OWLPRIME'));
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')) ;
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.
検証レポートの配列の各項目には、次の情報が含まれます。
このエラーの原因となったトリプルの数(例2-5では1
)
エラー・コード(例2-5では10001
)
1つ以上のトリプル(出力中のカッコ内。例2-5では(4_2_4_8 2 4 8)
)
これらの数字は、LINK_ID値と、主語、述語、目的語のID値です。
説明的なエラー・メッセージ(例2-5ではUnsatisfiable class.
)
例2-5の出力から、クラスが空のクラスowl:Nothing
のサブクラスであると表明している1つのトリプルを原因としてエラーが発生したことがわかります。
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'));
ルール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-');
この項では、推論操作のパフォーマンスを向上するための推奨事項について説明します。
推論の前に統計を収集します。大規模なRDF/OWLデータ・モデルをロードした後には、SEM_PERF.GATHER_STATSプロシージャを実行する必要があります。使用方法に関する重要な情報は、第11章にあるこのプロシージャの「使用方法」を参照してください。
推論操作用に十分な一時表領域を割り当てます。OracleのOWL推論サポートは、表結合に大きく依存するため、かなりの量の一時表領域を使用します。
SVFHおよびAVFH推論コンポーネントの適切な実装を使用します。
SVFHおよびAVFH推論コンポーネントのデフォルト実装が最適に動作するのは、owl:someValuesFrom
またはowl:allValuesFrom
(あるいはその両方)で定義された制限クラスの数が少ない場合です(LUBMデータセットと同様)。ただし、Gene Ontology (http://www.geneontology.org/
)のようにこれらのクラスの数が多い場合、SVFHおよびAVFHの非手続き型の実装を使用するとパフォーマンスが大幅に向上する可能性があります。
手続き型の実装を無効にしてSVFHおよびAVFHの非手続き型の実装を選択するには、SEM_APIS.CREATE_ENTAILMENTのオプションに'PROCSVFH=F'
または'PROCAVFH=F'
(あるいはその両方)を含めます。オントロジに適切な実装を使用すると、パフォーマンスが大幅に向上します。たとえば、NCI Thesaurusオントロジ(https://cabig.nci.nih.gov/community/concepts/EVS/
)にSVFHの非手続き型の実装を選択したところ、SVFH推論コンポーネントのパフォーマンスが960%向上しました(Oracle ASMと連携する3つのSATAディスクが搭載されたデュアルコアの8GB RAMデスクトップ・システムでテスト)。
2.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" .
SAM
コンポーネントを指定してOWLPrime推論をこのセットに適用すると、次の新しいトリプルが生成されます。
: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
および:John2
はowl: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');
このオプションを指定すると、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
の処理を無効化するには、最初に伴意を削除する必要があります。
クリークのメンバーシップ情報は、MDSYS.SEMCL_entailment-nameというビューに格納されます(entailment-nameは伴意(ルール索引)の名前です)。表2-3に、各MDSYS.SEMCL_entailment-nameビューの列を示します。
表2-3 MDSYS.SEMCL_entailment_nameビューの列
列名 | データ型 | 説明 |
---|---|---|
MODEL_ID |
NUMBER |
推論されたモデルのID番号 |
VALUE_ID |
NUMBER |
CLIQUE_IDによって識別される |
CLIQUE_ID |
NUMBER |
VALUE_IDリソースのクリーク代表のID番号 |
領域を節約するため、MDSYS.SEMCL_entailment-nameビューには、(CLIQUE_ID, CLIQUE_ID)などの再帰行は含まれません。
問合せ時に、問合せ対象の伴意がOPT_SAMEAS=T
オプションを使用して作成された場合、その結果は、owl:sameAs
で統合された推論パーティションから戻されます。すべてのowl:sameAs
閉包を含めるように問合せ結果が拡張されることはありません。
次の例の問合せでは、戻される唯一の結果は、正規形クリークの代表である:John1
です。
SELECT A FROM TABLE ( SEM_MATCH ('(?A :hasAge "32")',SEM_MODELS('M'), SEM_RULEBASES('OWLPRIME'),NULL, NULL));
前述の例で、モデルに:John2 :hasAge "32"
が出現したとしても、冗長トリプルが除外される推論統合フェーズ中に置換されます。ただし、統合されたowl:sameAs
情報を含むMDSYS.SEMCL_rules-index-nameビューとの結合を実行して、問合せ結果を拡張できます。たとえば、前述のSEM_MATCH問合せの拡張結果セットを取得するには、次の拡張問合せを使用します。
SELECT V.VALUE_NAME A_VAL FROM TABLE ( SEM_MATCH ('(?A :hasAge "32")',SEM_MODELS('M'), SEM_RULEBASES('OWLPRIME'), NULL, NULL)) Q, MDSYS.RDF_VALUE$ V, MDSYS.SEMCL_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 ('(?A :hasAge "32")',SEM_MODELS('M'), SEM_RULEBASES('OWLPRIME'),NULL, NULL));
または、次のように左側外部結合を使用して、前述の拡張問合せをリライトできます。
SELECT V.VALUE_NAME A_VAL FROM TABLE ( SEM_MATCH ('(?A <http://hasAge> "33")',SEM_MODELS('M'), SEM_RULEBASES('OWLPRIME'), NULL, NULL)) Q, MDSYS.RDF_VALUE$ V, (SELECT value_id, clique_id FROM MDSYS.SEMCL_M_IDX UNION ALL SELECT DISTINCT clique_id, clique_id FROM MDSYS.SEMCL_M_IDX) C WHERE Q.A$RDFVID = c.clique_id (+) AND V.VALUE_ID = nvl(C.VALUE_ID, Q.A$RDFVID);
増分推論を使用すると、トリプルの追加後に効率的に伴意(ルール索引)を更新できます。伴意に対する増分推論を有効にするには、次の2つの方法があります。
伴意の作成時にoptions
パラメータ値としてINC=T
を指定します。次に例を示します。
EXECUTE sem_apis.create_entailment ('M_IDX',sem_models('M'),
sem_rulebases('OWLPRIME'),null,null, 'INC=T');
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'));
複数のモデルが増分推論コールに含まれる場合、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'));
増分推論の使用時に従来型パスによるロードの要件を省略するもう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に変更するには、伴意を削除して再構築する必要があります。
パラレル推論では、マルチコアまたはマルチ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');
DOPキーワードの指定によって、オラクル社が選択した推論コンポーネントのセットに対してパラレル実行が有効になります。
パラレル推論が成功するかどうかは、データベースが実行されているシステムのハードウェア構成が適切かどうかによって大きく異なります。重要なのは、データベース・パフォーマンス・チューニングとOracle SQLパラレル実行のベスト・プラクティスが実現されるバランスの取れたシステムを確保することです。たとえば、単一の物理ディスクでSQL文をパラレルに実行すると、SQL文をシリアル・モードで実行するより低速になる可能性があるため、800GBのデータベースに対して単一の1TBのディスクを使用しないでください。パラレル推論には十分なメモリーが必要なため、CPUコアごとに4GB以上のメモリーが必要です。
パラレル推論は大規模なオントロジに最適ですが、小規模なオントロジでも推論パフォーマンスは向上する可能性があります。
パラレル推論の使用に関連して、一時的な記憶域のオーバーヘッドが発生します。パラレル推論によって、すべてのソースRDF/OWLモデルと既存の推論されたグラフに基づくすべてのトリプルを含むソース表が作成されます。この表は、ソース・モデルのデータおよび索引を格納するために必要な領域と比較して、10から30%余分に記憶域を使用する可能性があります。
Oracle Databaseのデフォルトの推論では、提供された1つ以上のソース・モデルすべてから、すべての表明されたトリプルを取得し、推論の閉包に到達するまですべての表明されたトリプルにセマンティク・ルールを適用します。指定されたソース・モデルに1つ以上の名前付きグラフが含まれる場合でも、すべての表明は、それが名前付きグラフの一部であるかどうかにかかわらず、単一のグラフから取得された場合と同様に扱われるため、違いはありません。(Oracle Databaseセマンティク・テクノロジでの名前付きグラフのサポートの概要は、1.3.9項を参照してください。)
このデフォルトの推論は、名前付きグラフがまったく考慮されないという点で、完全にグローバルなものと考えることができます。
ただし、名前付きグラフを使用する場合は、次のいずれかの機能を使用することで、デフォルトの推論をオーバーライドし、名前付きグラフを考慮に入れることができます。
名前付きグラフ・ベースのグローバル推論(NGGI): すべての指定された名前付きグラフを統合グラフとして処理します。NGGIでは、考慮されるトリプルの有効範囲を絞り込みながら、高い柔軟性を実現できます(2.2.11.1項を参照)。
名前付きグラフ・ベースのローカル推論(NGLI): 指定された名前付きグラフをそれぞれ個別エンティティとして処理します。NGLIの詳細は、2.2.11.2項を参照してください。
NGGIとNGLIを一緒に使用する場合、2.2.11.3項の推奨される使用フローを参照してください。
伴意(ルール索引)の作成時に、SEM_APIS.CREATE_ENTAILMENTプロシージャの特定のパラメータおよびオプションを使用して、NGGIまたはNGLIを指定します。
名前付きグラフ・ベースのグローバル推論(NGGI)によって、(モデル・レベルではなく)名前付きグラフ・レベルで推論に使用されるトリプルの範囲を絞り込むことができます。また、有効範囲の選択で高い柔軟性が実現します(たとえば、0個以上の名前付きグラフまたはデフォルト・グラフ(あるいはその両方)からトリプルを含めることや、指定したモデルからNULLのグラフ名を持つすべてのトリプルを含めることができます)。
たとえば、病院向けアプリケーションで、特定の病院の患者を説明する名前付きグラフのセットに含まれるすべての情報にのみ推論ルールを適用できます。患者に関連する名前付きグラフにインスタンス関連の表明(ABox)のみが含まれる場合、例2-6のように、1つ以上の追加のスキーマ関連モデル(TBox)を指定できます。
例2-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>' );
例2-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によって推論される新しいすべてのトリプルに割り当てられます。
名前付きグラフ・ベースのローカル推論(NGLI)は、各グラフを単一の統合グラフとして参照せず、名前付きグラフをそれぞれ個別エンティティとして処理します。推論ロジックは、各エンティティの境界内で実行されます。デフォルト・グラフでスキーマ関連の表明(TBox)を指定することが可能で、そのデフォルト・グラフは各名前付きグラフの推論に参加します。たとえば、G1
という名前を持つグラフに基づいて推論されたトリプルには、推論されたデータ・パーティションで同じグラフ名のG1
が割り当てられます。
2つの個別の名前付きグラフの表明が結合されて新しい表明が生成されることはありません。
たとえば、次の条件があると仮定します。
グラフG1
は、次の表明を含みます。
:John :hasBirthMother :Mary .
グラフG2
は、次の表明を含みます。
:John :hasBirthMother :Bella .
デフォルト・グラフは、:hasBirthMother
がowl:FunctionalProperty
であるという表明を含みます。(この表明にはNULLのグラフ名が含まれます。)
この例では、2つの表明が2つの異なるグラフG1
とG2
から取得されるため、名前付きグラフ・ベースのローカル推論(NGLI)では、:Mary
がowl:sameAs :Bella
であるとは推論されません。一方、G1
、G2
、および関数的プロパティ定義を含む名前付きグラフ・ベースのグローバル推論(NGGI)では、:Mary
がowl:sameAs :Bella
であると推論できます。
例2-7に、NGLIを示します。
例2-7 名前付きグラフ・ベースのローカル推論
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' );
例2-7の内容:
2つのモデル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
)は、名前付きグラフのいずれかに格納される必要があります。
NGLIを使用してセマンティクに索引付けされたドキュメントでドキュメント中心の推論を実行する方法の詳細とその例は、4.15項「ドキュメント中心の推論の実行」を参照してください。
現在のところ、NGLIは、証明の生成、ユーザー定義ルール、最適化されたowl:sameAs
の処理または増分推論とは連携しません。
次に、NGGIとNGLIを併用する場合に推奨される使用フローを示します。前提として、TBoxとABoxが2つの別個のモデルに格納され、TBoxにスキーマ定義が含まれ、TBoxのすべてのトリプルがNULLのグラフ名を持つが、インスタンス関連データを記述する名前付きグラフのセットでABoxが構成されているとします。
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')
);
すべての名前付きグラフに対して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'
);
手順1のNGGIコールで推論されたグラフのステータスがVALID
に設定され、手順2のSEM_APIS.CREATE_ENTAILMENTプロシージャ・コールはENTAIL_ANYWAY=T
が指定されていないと即座に終了するため、ENTAIL_ANYWAY=T
が指定されています。
選択的推論は、コンポーネント・ベースの推論です。この操作では、推論を関心のある特定のOWLコンポーネントに限定します。選択的推論を実行するには、SEM_APIS.CREATE_ENTAILMENTプロシージャのinf_components_in
パラメータを使用して、コンポーネントのカンマ区切りのリストを指定します。最終的な推論は、指定したルールベースと指定したコンポーネントの和集合によって決定されます。
例2-8では、サブクラス(SCOH)関係に基づくクラス階層と、サブプロパティ(SPOH)関係に基づくプロパティ階層に推論を限定します。この例では、空のルールベースを作成してから、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールで2つのコンポーネント('SCOH,SPOH'
)を指定します。
例2-8 選択的推論の実行
EXECUTE sem_apis.create_rulebase('my_rulebase');
EXECUTE sem_apis.create_entailment('owltst_idx', sem_models('owltst'), sem_rulebases('my_rulebase'), SEM_APIS.REACH_CLOSURE, 'SCOH,SPOH');
使用できるコンポーネント・コードは、SCOH
、COMPH
、DISJH
、SYMMH
、INVH
、SPIH
、MBRH
、SPOH
、DOMH
、RANH
、EQCH
、EQPH
、FPH
、IFPH
、DOM
、RAN
、SCO
、DISJ
、COMP
、INV
、SPO
、FP
、IFP
、SYMM
、TRANS
、DIF
、SAM
、CHAIN
、HASKEY
、ONEOF
、INTERSECT
、INTERSECTSCOH
、MBRLST
、PROPDISJH
、SKOSAXIOMS
、SNOMED
、SVFH
、THINGH
、THINGSAM
、UNION
、RDFP1
、RDFP2
、RDFP3
、RDFP4
、RDFP6
、RDFP7
、RDFP8AX
、RDFP8BX
、RDFP9
、RDFP10
、RDFP11
、RDFP12A
、RDFP12B
、RDFP12C
、RDFP13A
、RDFP13B
、RDFP13C
、RDFP14A
、RDFP14BX
、RDFP15
、RDFP16
、RDFS2
、RDFS3
、RDFS4a
、RDFS4b
、RDFS5
、RDFS6
、RDFS7
、RDFS8
、RDFS9
、RDFS10
、RDFS11
、RDFS12
、RDFS13
です。
接頭辞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-');
デフォルトでは、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
コンポーネント・コードを指定します。
セマンティク演算子を使用すると、表の列のデータとオントロジの用語間のセマンティク関係に基づいてオントロジ支援形式でリレーショナル・データを問い合せることができます。SEM_RELATEDセマンティク演算子では、セマンティク関係に基づいて行を取得できます。SEM_DISTANCEセマンティク演算子では、セマンティク関係の距離量が戻されるため、その距離量を使用してSEM_RELATED演算子で戻された行を順序付けることや、制限することが可能です。索引タイプMDSYS.SEM_INDEXTYPEでは、このような問合せを効率的に実行することで、大規模なデータセットに対してスケーラブルなパフォーマンスを発揮できます。
2.1.1項のがんのオントロジの例を題材として、セマンティクな一致を必要とする「診断がImmune_System_Disorderタイプの患者をすべて検出する」という問合せについて検討します。構文的な一致に基づくPATIENTS表(2.1.1項を参照)の一般的なデータベース問合せでは、Immune_System_Disorder
とまったく同じ値を含むDIAGNOSIS列のある行は存在しないため、どの行も戻されません。たとえば、次の問合せではどの行も戻されません。
SELECT diagnosis FROM patients WHERE diagnosis = 'Immune_System_Disorder';
ただし、患者のデータ表の多くの行は、診断上このクラスに分類されるため、関連性を保持しています。例2-9では、(字句の等価性ではなく)SEM_RELATED演算子を使用して、患者のデータ表から関連するすべての行を取得します。(この例の場合、Immune_System_Disorder
という用語には名前空間の接頭辞が付けられており、デフォルトの仮定として表の列の値にも名前空間の接頭辞が含まれます。ただし、2.3.5項の説明にあるとおり、この前提は常に成り立つとはかぎりません。)
例2-9 SEM_RELATED演算子
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ではない場合、文字列VALID
、INCOMPLETE
またはINVALID
を使用して、問合せを成功させるための伴意の最低限のステータスを指定する必要があります。OWLでは単調性は保証されないため、OWLルールベースを指定する場合、値INCOMPLETE
を使用しないでください。
lower_bound
およびupper_bound
オプション属性では、関連する用語間の関係の距離量に対して限界値を指定できます。距離量の詳細は、2.3.2項を参照してください。
SEM_RELATED演算子では、オントロジ内の指定したpredExpr
関係について、2つの入力用語が関連している場合、1が戻されます。2つの入力用語が関連していない場合、0が戻されます。下限値および上限値を指定した場合は、lower_bound
以上およびupper_bound
以下の距離量で2つの入力用語が関連している場合に1が戻されます。
SEM_DISTANCE補助演算子は、SEM_RELATED演算子の使用によりフィルタされた行の距離量を計算します。SEM_DISTANCE演算子の書式は、次のとおりです。
SEM_DISTANCE (number) RETURN NUMBER;
number
属性には、SEM_RELATED演算子のコールで指定した最後の属性の数と一致していれば、どのような数でも指定できます(例2-10を参照)。問合せでは、主演算子と補助演算子を複数起動できるため、この数を使用して補助演算子SEM_DISTANCEの起動と特定のSEM_RELATED(主演算子)の起動を一致させます。
例2-10は、例2-9を拡張したもので、SEM_DISTANCE補助演算子を含む複数の文が使用されています(これは、2つの用語間の距離を測定することで、それらの用語(ここでは、患者の診断と用語Immune_System_Disorder
)の関連がどの程度近似しているかを計算します)。2.1.1項のがんのオントロジを使用すると、AIDS
とImmune_System_Disorder
間の距離は3です。
例2-10 SEM_DISTANCE補助演算子
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 WHERE SEM_DISTANCE(123) <= 3;
例2-11では、距離情報を使用して、主演算子により戻される行の数を制限します。SEM_RELATEDの起動で指定された目的語属性に関連する用語を含む行のうち、距離が2以上4以下のすべての行が取得されます。
例2-11 SEM_DISTANCEを使用した返却行数の制限
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;
例2-11では、SEM_DISTANCE演算子を使用するかわりにSEM_RELATED演算子のlower_bound
およびupper_bound
パラメータを使用して下限値および上限値を指定しています。SEM_DISTANCE演算子は、例2-10の最後のSELECT文のように、戻される行を制限する場合にも使用できます。
距離は、推論(伴意)の実行中に、推移的プロパティとして定義されたOWLプロパティ、RDFS subClassOf
プロパティおよびRDFS subPropertyOf
プロパティに対して生成されます。これらのプロパティを通じてリンクされた2つの用語間の距離は、階層クラス構造内の用語間の最短距離として計算されます。他のプロパティを通じてリンクされた2つの用語間の距離は、未定義のためNULLに設定されます。
(階層クラス構造として参照される)元のモデルの推移的プロパティ・リンクの距離はそれぞれ1となり、推論されるトリプルの距離は2つの用語間のリンク数に従って生成されます。ここでは、次の架空の使用例について検討します。
元のグラフにC1 rdfs:subClassOf C2
およびC2 rdfs:subClassOf C3
が含まれる場合、C1 rdfs:subClassof of 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演算子とユーザー定義のルールベースの併用は、現時点ではサポートされないため、エラーが発生します。
SEM_RELATED演算子を使用する場合、オントロジ用語を含む列に対してMDSYS.SEM_INDEXTYPEタイプのセマンティク索引を作成できます。この索引を作成することで、問合せをより効率的に実行できます。作成する索引のタイプを指定するため、CREATE INDEX文にINDEXTYPE IS MDSYS.SEM_INDEXTYPE
句を含める必要があります。
例2-12では、Cancer_Ontology
オントロジを使用するPATIENTS表のDIAGNOSIS列に対してDIAGNOSIS_SEM_IDXというセマンティク索引を作成します。
例2-12 セマンティク索引の作成
CREATE INDEX diagnosis_sem_idx ON patients (diagnosis) INDEXTYPE IS MDSYS.SEM_INDEXTYPE;
索引を使用するには、索引の作成される列(例2-12ではDIAGNOSIS)がSEM_RELATED演算子の最初のパラメータである必要があります。最初のパラメータではない場合、その索引は問合せの実行時に使用されません。
特定のセマンティク問合せのパフォーマンスを向上するため、索引の作成時に1つ以上のモデルおよびルールベースを指定して、セマンティク索引用の統計情報を生成できます。例2-13では、指定したモデルおよびルールベースの統計情報も同時に生成する索引を作成します。この索引は、問合せ時に他のモデルやルールベースと組み合せて使用できますが、統計情報は、索引の作成時に指定したモデルおよびルールベースが問合せで指定したモデルおよびルールベースと同じ場合にのみ使用されます。
例2-13 モデルおよびルールベースを指定するセマンティク索引の作成
CREATE INDEX diagnosis_sem_idx ON patients (diagnosis) INDEXTYPE IS MDSYS.SEM_INDEXTYPE('ONTOLOGY_MODEL(medical_ontology), RULEBASE(OWLPrime)');
統計情報は、セマンティク関係の距離でソートされた上位k個の結果を戻す問合せを実行する場合に便利です。例2-14に、このような問合せを示します。
例2-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);
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列の値を含むすべての行が取得されます。
デフォルトでは、セマンティク演算子のサポートは、表に格納される値がURIであることを前提とします。これらのURIでは、異なる名前空間を使用できます。ただし、表の値にURIが含まれない場合は、セマンティク索引の作成時にURIPREFIXキーワードを使用してURIを指定できます。この場合、指定したURIが表の値に接頭辞として追加され、索引構造に格納されます。(ただし、複数のURIは使用できません。)
例2-15では、URI接頭辞を使用するセマンティク索引を作成します。
例2-15 セマンティク索引作成時のURI接頭辞の指定
CREATE INDEX diagnosis_sem_idx ON patients (diagnosis) INDEXTYPE IS MDSYS.SEM_INDEXTYPE PARAMETERS('URIPREFIX(<http://www.example.org/medical/>)');
URI接頭辞は解析なしで(索引構造の)表の値に追加されるため、URIの最後のスラッシュ(/)文字は重要です。