1.13 データ型索引の使用

データ型索引は、RDFネットワークに格納される型付きリテラルの値の索引です。

この索引を使用すると、特定のタイプのFILTER式を含むSEM_MATCH問合せのパフォーマンスが大幅に向上する場合があります。たとえば、xsd:dateTimeリテラルのデータ型索引によって、フィルタ(?x < "1929-11-16T13:45:00Z"^^xsd:dateTime)の評価の速度が向上する場合があります。索引を作成できるいくつかのデータ型を、表1-30に示します。

表1-30 データ型索引が可能なデータ型

データ型URI Oracle型 索引タイプ

http://www.w3.org/2001/XMLSchema#decimal

NUMBER

一意でないBツリー(xsd:floatxsd:doublexsd:decimal などのすべてのxsd数値型とそのすべてのサブタイプに対応する単一の索引を作成)

http://www.w3.org/2001/XMLSchema#string

VARCHAR2

一意ではないBツリー(xsd:string型付きリテラルとプレーン・リテラルに対して単一の索引を作成します)

http://www.w3.org/2001/XMLSchema#time

TIMESTAMP WITH TIMEZONE

一意でないBツリー

http://www.w3.org/2001/XMLSchema#date

TIMESTAMP WITH TIMEZONE

一意でないBツリー

http://www.w3.org/2001/XMLSchema#dateTime

TIMESTAMP WITH TIMEZONE

一意でないBツリー

http://xmlns.oracle.com/rdf/text

(該当なし)

CTXSYS.CONTEXT

http://xmlns.oracle.com/rdf/geo/WKTLiteral

SDO_GEOMETRY

SPATIAL_INDEX

http://www.opengis.net/geosparql#wktLiteral

SDO_GEOMETRY

SPATIAL_INDEX

http://www.opengis.net/geosparql#gmlLiteral

SDO_GEOMETRY

SPATIAL_INDEX

http://xmlns.oracle.com/rdf/like

VARCHAR2

一意でないBツリー

データ型索引が適切かどうかは、問合せのワークロードに応じて異なります。xsdデータ型でのデータ型索引は、変数を定数値と比較するフィルタに使用可能であり、特に、非常に選択的なフィルタ条件を持つ選択的でないグラフ・パターンが問合せに含まれる場合に役立ちます。適切なデータ型索引は、空間フィルタまたはテキスト・フィルタを使用する問合せに必要です。

データ型索引によって問合せパフォーマンスは向上しますが、徐々に増加する索引のメンテナンスによって、RDFネットワークに対するDMLおよびバルク・ロード操作のパフォーマンスが低下する可能性があります。バルク・ロード操作では、通常、データ型索引を削除し、バルク・ロードを実行してからデータ型索引を再作成する方が高速です。大量のテキスト・データにテキスト索引を作成するには時間がかかるため、テキスト索引の作成時にnologgingがデフォルトで有効になります。ロギングを有効にするには、テキスト索引のadd_datatype_index APIのオプション・フィールドにLOGGING=Tを指定します。

以下のプロシージャを使ってデータ型索引を追加、変更、削除することができます。これらのプロシージャの説明は、「SEM_APISパッケージのサブプログラム」に記載されています。

既存のデータ型索引に関する情報は、SEM_DTYPE_INDEX_INFOビューに保持されます(表1-31に示す列、およびデータ型索引ごとに1つの行が含まれます)。

表1-31 SEM_DTYPE_INDEX_INFOビューの列

列名 データ型 説明

DATATYPE

VARCHAR2(51)

データ型URI

INDEX_NAME

VARCHAR2(30)

索引の名前

STATUS

VARCHAR2(8)

索引のステータス: USABLEまたはUNUSABLE

TABLESPACE_NAME

VARCHAR2(30)

索引の表領域

FUNCIDX_STATUS

VARCHAR2(8)

関数ベース索引の状態。取り得る値は、NULLENABLEDまたはDISABLEDです。

例1-116で示されているように、HINT0ヒントを使用すると、問合せの評価中にデータ型索引が使用されるようにできます。これにより、1929年11月16日より前に生まれたすべての祖父が検索されます。

例1-116 HINT0を使用してデータ型索引が使用されるようにする方法

SELECT x, y
  FROM TABLE(SEM_MATCH(
    'PREFIX : <http://www.example.org/family/>
     SELECT ?x ?y 
     WHERE {?x :grandParentOf ?y . ?x rdf:type :Male . ?x :birthDate ?bd
       FILTER (?bd <= "1929-11-15T23:59:59Z"^^xsd:dateTime) }',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'), 
    
    null, null, null, 
    'HINT0={ LEADING(?bd) INDEX(?bd rdf_v$dateTime_idx) } 
             FAST_DATE_FILTER=T', 
    null, null,
    'RDFUSER', 'NET1' ));