この章では、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ボキャブラリがサポートされます。サポートされる各ボキャブラリには、対応するルールベースがあります。ただし、これら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機能は、Oracleのサポート対象OWLサブセットでまだサポートされていません。
プロパティ制約: カーディナリティ
クラス式: 集合演算(和集合、積集合)、列挙
表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 |
伴意ルールを使用してネイティブ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/botherOf',
'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/botherOf> ?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を持つトリプルから推論されていることがわかります。
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プロシージャを実行する必要があります。使用方法に関する重要な情報は、第4章にあるこのプロシージャの「使用方法」を参照してください。
推論操作用に十分な一時表領域を割り当てます。OracleのOWL推論サポートは、表結合に大きく依存するため、かなりの量の一時表領域を使用します。
選択的推論は、コンポーネント・ベースの推論です。この操作では、推論を関心のある特定のOWLコンポーネントに限定します。選択的推論を実行するには、SEM_APIS.CREATE_ENTAILMENTプロシージャのinf_components_inパラメータを使用して、コンポーネントのカンマ区切りのリストを指定します。最終的な推論は、指定したルールベースと指定したコンポーネントの和集合によって決定されます。
例2-6では、サブクラス(SCOH)関係に基づくクラス階層と、サブプロパティ(SPOH)関係に基づくプロパティ階層に推論を限定します。この例では、空のルールベースを作成してから、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールで2つのコンポーネント('SCOH,SPOH')を指定します。
例2-6 選択的推論の実行
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、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-7では、(字句の等価性ではなく)SEM_RELATED演算子を使用して、患者のデータ表から関連するすべての行を取得します。(この例の場合、Immune_System_Disorderという用語には名前空間の接頭辞が付けられており、デフォルトの仮定として表の列の値にも名前空間の接頭辞が含まれます。ただし、2.3.5項の説明にあるとおり、この前提は常に成り立つとはかぎりません。)
例2-7 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-8を参照)。問合せでは、主演算子と補助演算子を複数起動できるため、この数を使用して補助演算子SEM_DISTANCEの起動と特定のSEM_RELATED(主演算子)の起動を一致させます。
例2-8は、例2-7を拡張したもので、SEM_DISTANCE補助演算子を含む複数の文が使用されています。SEM_DISTANCE補助演算子は、2つの用語間の距離を測定することで、それらの用語(ここでは、患者の診断と用語Immune_System_Disorder)の関連がどの程度近似しているかを計算します。2.1.1項のがんのオントロジを使用すると、AIDSとImmune_System_Disorder間の距離は3です。
例2-8 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-9では、距離情報を使用して、主演算子により戻される行の数を制限します。SEM_RELATEDの起動で指定された目的語属性に関連する用語を含む行のうち、距離が2以上4以下のすべての行が取得されます。
例2-9 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-9では、SEM_DISTANCE演算子を使用するかわりにSEM_RELATED演算子のlower_boundおよびupper_boundパラメータを使用して下限値および上限値を指定しています。SEM_DISTANCE演算子は、例2-8の最後のSELECT文のように、戻される行を制限する場合にも使用できます。
距離は、推論(伴意)の実行中に、推移的プロパティとして定義された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演算子とユーザー定義のルールベースの併用は、現時点ではサポートされないため、エラーが発生します。
SEM_RELATED演算子を使用する場合、オントロジ用語を含む列に対してMDSYS.SEM_INDEXTYPEタイプのセマンティク索引を作成できます。この索引を作成することで、問合せをより効率的に実行できます。作成する索引のタイプを指定するため、CREATE INDEX文にINDEXTYPE IS MDSYS.SEM_INDEXTYPE句を含める必要があります。
例2-10では、Cancer_Ontologyオントロジを使用するPATIENTS表のDIAGNOSIS列に対してDIAGNOSIS_SEM_IDXというセマンティク索引を作成します。
例2-10 セマンティク索引の作成
CREATE INDEX diagnosis_sem_idx ON patients (diagnosis) INDEXTYPE IS MDSYS.SEM_INDEXTYPE;
索引を使用するには、索引の作成される列(例2-10ではDIAGNOSIS)がSEM_RELATED演算子の最初のパラメータである必要があります。最初のパラメータではない場合、その索引は問合せの実行時に使用されません。
特定のセマンティク問合せのパフォーマンスを向上するため、索引の作成時に1つ以上のモデルおよびルールベースを指定して、セマンティク索引用の統計情報を生成できます。例2-11では、指定したモデルおよびルールベースの統計情報も同時に生成する索引を作成します。この索引は、問合せ時に他のモデルやルールベースと組み合せて使用できますが、統計情報は、索引の作成時に指定したモデルおよびルールベースが問合せで指定したモデルおよびルールベースと同じ場合にのみ使用されます。
例2-11 モデルおよびルールベースを指定するセマンティク索引の作成
CREATE INDEX diagnosis_sem_idx ON patients (diagnosis) INDEXTYPE IS MDSYS.SEM_INDEXTYPE('ONTOLOGY_MODEL(medical_ontology), RULEBASE(OWLPrime)');
統計情報は、セマンティク関係の距離でソートされた上位k個の結果を戻す問合せを実行する場合に便利です。例2-12に、このような問合せを示します。
例2-12 統計情報の生成が効果的な問合せ
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-13では、URI接頭辞を使用するセマンティク索引を作成します。
例2-13 セマンティク索引作成時のURI接頭辞の指定
CREATE INDEX diagnosis_sem_idx
ON patients (diagnosis)
INDEXTYPE IS MDSYS.SEM_INDEXTYPE
PARAMETERS('URIPREFIX(<http://www.example.org/medical/>)');
URI接頭辞は解析なしで(索引構造の)表の値に追加されるため、URIの最後のスラッシュ(/)文字は重要です。