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

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

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

ノート:

SEM_RELATEDおよびSEM_DISTANCEは、スキーマプライベートRDFネットワークではサポートされていません。

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 RDFおよびルールベースを指定するセマンティク索引の作成

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

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の最後のスラッシュ(/)文字は重要です。