ヘッダーをスキップ
Oracle Databaseセマンティク・テクノロジ開発者ガイド
11gリリース1(11.1)
E05679-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

1 Oracleセマンティク・テクノロジの概要

この章では、セマンティク・テクノロジのサポート、特にResource Description Framework(RDF)およびWeb Ontology Language(OWL)のサブセットのサポートについて説明します。ここでは、読者がRDFおよびOWLに関する主要な概念({主語、述語、目的語}のトリプル、URI、空白ノード、プレーン・リテラル、型付きリテラル、オントロジなど)についてよく理解していることを前提とします。この章では、これらの概念に関する詳細な説明を省くかわりに、各概念がどのようにOracleに実装されているかについて重点的に解説します。

セマンティク・データを操作するためのPL/SQLサブプログラムは、SEM_APISパッケージに含まれます。詳細は、第3章を参照してください。

RDFおよびOWLのサポートはOracle Spatialの機能です。これらの機能を使用するには、Oracle Spatialをインストールする必要があります。ただし、RDFおよびOWLの使用は、特定のデータに制限されています。

この章には次の項が含まれます。

OWLの概念とOracle DatabaseによるOWL機能のサポートの詳細は、第2章を参照してください。


必須スクリプト:

このガイドに記載されている操作を実行する前に、$ORACLE_HOME/md/admin/catsem10i.sqlまたは$ORACLE_HOME/md/admin/catsem11i.sqlスクリプトを実行する必要があります(1.11項を参照)。


名前の変更:

Oracle Databaseリリース11.1では、多くのソフトウェア・オブジェクト(PL/SQLパッケージ、ファンクションおよびプロシージャ、システム表およびビューなど)の名前が変更されています。ほとんどの場合、この変更で文字列RDFSEMに置換されています。ただし、以前のリリースの有効な名前を使用している既存のアプリケーションは、引き続き動作します。詳細は、1.14項を参照してください。


Spatial、パーティショニングおよび高度な圧縮:

Oracle Spatialは、RDFおよびOWLの機能を使用する前にインストールする必要があります。1.12項の説明にあるとおり、パーティショニングおよび高度な圧縮の機能も有効にする必要があります。

1.1 Oracleセマンティク・テクノロジの概要

Oracle Databaseでは、セマンティク・データとオントロジを格納し、セマンティク・データを問い合せることや、エンタープライズ・リレーショナル・データに対してオントロジ支援問合せを実行することができます。また、付属の推論またはユーザー定義の推論を使用して、セマンティク・データに対する問合せ機能を拡張することも可能です。図1-1に、これらの機能の相互関係を示します。

図1-1 Oracleのセマンティク機能

図1-1の説明が続きます。
「図1-1 Oracleのセマンティク機能」の説明

図1-1に示されているとおり、データベースには、セマンティク・データおよびオントロジ(RDF/OWLモデル)に加え、従来のリレーショナル・データが含まれます。セマンティク・データをロードするには、バルク・ロードが最も効率的な方法ですが、トランザクション型のINSERT文を使用してデータを増分ロードすることも可能です。


注意:

Oracle Databaseリリース11.1より前のリリースに存在するセマンティク・データを使用する場合、1.11項の手順に従ってデータをアップグレードする必要があります。

セマンティク・データおよびオントロジは問合せ可能です。また、セマンティク・データや従来のリレーショナル・データに対してオントロジ支援問合せを実行し、セマンティク関係を検出することもできます。オントロジ支援問合せを実行するには、SEM_RELATED演算子を使用します(2.3項を参照)。

セマンティク・データに対する問合せ機能は、推論を使用して拡張できます。推論では、ルールベースのルールを使用します。推論により、データおよびルールに基づいて論理的な推測を行うことができます。推論でルールおよびルールベースを使用する方法の詳細は、1.3.6項を参照してください。

1.2 セマンティク・データのモデル化

セマンティク・データには、その形式意味論に加え、有向グラフを使用して効率的にモデル化される単純なデータ構造が含まれます。メタデータ文は、トリプルとして表現されます。ノードはトリプルの2つの部分を示すために使用され、3番目の部分はノード間の関係を記述する有向リンクによって示されます。トリプルは、セマンティク・データ・ネットワークに格納されます。また、データベース・ユーザーにより作成された特定のセマンティク・データ・モデルに関する情報も保持されます。ユーザーに作成されたモデルは、モデル名を持ち、指定した表の列に格納されたトリプルを示します。

文は、{主語(リソース)、述語(プロパティ)、目的語(値)}のトリプルで表現されます。このマニュアルでは、{主語、プロパティ、目的語}を使用してトリプルを記述します。文という用語とトリプルという用語は、同義的に使用される場合があります。各トリプルは、特定のドメインに関する完全で一意のファクトであり、有向グラフのリンクで表現されます。

1.3 データベースのセマンティク・データ

データベースに格納されるすべてのセマンティク・データに対して、単一の場所が用意されます。すべてのトリプルは、解析され、MDSYSスキーマの表内のエントリとしてシステムに格納されます。{主語、プロパティ、目的語}のトリプルは、1つのデータベース・オブジェクトとして処理されます。そのため、複数のトリプルを含む単一の文書は、複数のデータベース・オブジェクトになります。

トリプルのすべての主語および目的語は、セマンティク・データ・ネットワークのノードにマップされます。プロパティは、主語を開始ノード、目的語を終了ノードとするネットワーク・リンクにマップされます。使用可能なノード・タイプは、空白ノード、URI、プレーン・リテラルおよび型付きリテラルです。

URIの指定とデータベースへのセマンティク・データの格納には、次の要件が適用されます。

1.3.1 モデルのメタデータ

MDSYS.SEM_MODEL$ビューには、データベースで定義されているすべてのモデルの情報が含まれます。SEM_APIS.CREATE_SEM_MODELプロシージャを使用してモデルを作成する場合、モデルの名前と、セマンティク・データへの参照を保持する表および列を指定します。システムにより、モデルIDが自動的に生成されます。

Oracleでは、モデルの作成および削除に応じてMDSYS.SEM_MODEL$ビューが自動的に管理されます。ユーザーがこのビューを直接変更することはできません。たとえば、このビューでSQLのINSERT、UPDATEまたはDELETE文を使用することはできません。

表1-1に、MDSYS.SEM_MODEL$ビューの列を示します。

表1-1 MDSYS.SEM_MODEL$ビューの列

列名 データ型 説明

OWNER

VARCHAR2(30)

モデルの所有者のスキーマ。

MODEL_ID

NUMBER

一意のモデルID番号(自動生成)。

MODEL_NAME

VARCHAR2(25)

モデルの名前。

TABLE_NAME

VARCHAR2(30)

モデルのセマンティク・データへの参照を保持する表の名前。

COLUMN_NAME

VARCHAR2(30)

モデルのセマンティク・データへの参照を保持する表に含まれるSDO_RDF_TRIPLE_S型の列の名前。

MODEL_TABLESPACE_NAME

VARCHAR2(30)

このモデルのトリプルを格納するための表領域の名前。


モデルを作成すると、そのモデルに関連付けられたトリプルのビューもMDSYSスキーマに作成されます。このビューは、RDFM_model-nameという形式の名前を持ち、モデルの所有者および適切な権限を持つユーザーにのみ表示されます。各MDSYS.SEMM_model-nameビューには、ネットワークにリンクとして格納されたトリプルごとに1つの行が保持されます。表1-2に、このビューの列を示します。

表1-2 MDSYS.SEMM_model-nameビューの列

列名 データ型 説明

P_VALUE_ID

NUMBER

トリプルの述語のテキスト値に対応するVALUE_ID。主キーの一部です。

START_NODE_ID

NUMBER

トリプルの主語のテキスト値に対応するVALUE_ID。主キーの一部です。

CANON_END_NODE_ID

NUMBER

トリプルの目的語の正規形のテキスト値に対応するVALUE_ID。主キーの一部です。

END_NODE_ID

NUMBER

トリプルの目的語のテキスト値に対応するVALUE_ID

MODEL_ID

NUMBER

トリプルが属するRDFグラフに対応するID。これにより、RDFグラフで表が論理的に分割されます。

COST

NUMBER

(将来使用するために予約済)

CTXT1

NUMBER

(将来使用するために予約済)

CTXT2

VARCHAR2(4000)

(将来使用するために予約済)

DISTANCE

NUMBER

(将来使用するために予約済)

EXPLAIN

VARCHAR2(4000)

(将来使用するために予約済)

PATH

VARCHAR2(4000)

(将来使用するために予約済)

LINK_ID

VARCHAR2(71)

一意のトリプル識別子の値。(現在は計算結果列ですが、将来のリリースでは定義が変更される可能性があります。)



注意:

表1-2の列P_VALUE_ID、START_NODE_ID、END_NODE_IDおよびCANON_END_NODE_IDでは、実際のID値は対応する字句の値から計算されます。ただし、ある字句の値が常に同じID値にマップされるとはかぎりません。

1.3.2

MDSYS.RDF_VALUE$表には、RDF文を表すために使用される主語、プロパティおよび目的語に関する情報が含まれます。この表には、これらの情報の3要素に対応するテキスト値(URIまたはリテラル)が、各トリプルの要素ごとに用意された個別の行を使用して一意に格納されます。

Oracleでは、MDSYS.RDF_VALUE$表が自動的に管理されます。ユーザーがこの表を直接変更することはできません。たとえば、この表でSQLのINSERT、UPDATEまたはDELETE文を使用することはできません。

表1-3に、RDF_VALUE$表の列を示します。

表1-3 MDSYS.RDF_VALUE$表の列

列名 データ型 説明

VALUE_ID

NUMBER

一意の値ID番号(自動生成)。

VALUE_TYPE

VARCHAR2(10)

VALUE_NAME列に格納されたテキスト情報のタイプ。使用される値は、UR(URI)、BN(空白ノード)、PL(プレーン・リテラル)、PL@(言語タグ付きのプレーン・リテラル)、PLL(プレーン・ロング・リテラル)、PLL@(言語タグ付きのプレーン・ロング・リテラル)、TL(型付きリテラル)またはTLL(型付きロング・リテラル)です。ロング・リテラルは、4000バイトを超えるリテラルです。

VNAME_PREFIX

VARCHAR2(4000)

字句の値の長さが4000バイト以下の場合、この列に字句の値の一部である接頭辞が格納されます。接頭辞の計算には、SEM_APIS.VALUE_NAME_PREFIXファンクションを使用できます。たとえば、山カッコを除く字句<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>の一部に対応する接頭辞は、http://www.w3.org/1999/02/22-rdf-syntax-ns#です。

VNAME_SUFFIX

VARCHAR2(512)

字句の値の長さが4000バイト以下の場合、この列に字句の値の一部である接尾辞が格納されます。接尾辞の計算には、SEM_APIS.VALUE_NAME_SUFFIXファンクションを使用できます。VNAME_PREFIX列の説明に記載されている字句の値の場合、接尾辞はtypeです。

LITERAL_TYPE

VARCHAR2(4000)

型付きリテラルの場合は型情報、それ以外の場合はNULL。たとえば、1999-08-16という作成日を示す行の場合、VALUE_TYPE列にはTLが格納され、LITERAL_TYPE列にはhttp://www.w3.org/2001/XMLSchema#dateが格納されます。

LANGUAGE_TYPE

VARCHAR2(80)

言語タグ付きのリテラル(つまり、VALUE_TYPEがPL@またはPLL@の場合)の言語タグ(フランス語の場合のfrなど)。それ以外の場合、この列はNULL値です。

CANON_ID

NUMBER

現在の字句の値に対応する正規形の字句の値のID。(この列の使用は将来のリリースで変更される可能性があります。)

COLLISION_EXT

VARCHAR2(64)

字句の値の衝突処理に使用されます。(この列の使用は将来のリリースで変更される可能性があります。)

CANON_COLLISION_EXT

VARCHAR2(64)

正規形の字句の値の衝突処理に使用されます。(この列の使用は将来のリリースで変更される可能性があります。)

LONG_VALUE

CLOB

字句の値の長さが4000バイトを超える場合の文字列。それ以外の場合、この列はNULL値です。

VALUE_NAME

VARCHAR2(4000)

これは計算結果列です。字句の値の長さが4000バイト以下の場合、この列の値はVNAME_PREFIX列とVNAME_SUFFIX列の値を連結したものになります。


1.3.2.1 トリプルの一意性とリテラルのデータ型

重複するトリプルはデータベースに格納されません。あるトリプルが既存のトリプルと重複していないかどうかをチェックするため、新規トリプルの主語、プロパティおよび目的語は、指定したモデルのトリプル値と照合されます。新規の主語、プロパティおよび目的語がすべてURIの場合、それらの値が完全に一致した場合に重複であると判定されます。ただし、新規トリプルの目的語がリテラルの場合、主語とプロパティが完全に一致し、目的語の値が(正規化したときに)一致した場合に重複であると判定されます。たとえば、次の2つのトリプルは重複しています。

<eg:a> <eg:b> "123"^^http://www.w3.org/2001/XMLSchema#int
<eg:a> <eg:b> "123"^^http://www.w3.org/2001/XMLSchema#unsignedByte

2番目のトリプルは、1番目のトリプルの重複と判定されます。"123"^^http://www.w3.org/2001/XMLSchema#intには、(正規化したときに)"123"^^http://www.w3.org/2001/XMLSchema#unsignedByteと等価の値が含まれるためです。2つのエンティティを同じ値に簡略化できる場合、それらのエンティティは正規化後に等価となります。

RDF以外の例をあげると、A*(B-C)A*B-C*A(B-C)*Aおよび-A*C+A*Bは、すべて同じ正規形に変換されます。

字句形式の値ベースの一致は、次のデータ型でサポートされます。

  • STRING: プレーン・リテラル、xsd:stringとその一部のXMLスキーマ・サブタイプ

  • NUMERIC: xsd:decimalとそのXMLスキーマ・サブタイプ、xsd:floatおよびxsd:double。(float/double INF、-INFおよびNaN値はサポートされません。)

  • DATETIME: タイムゾーンのサポート付きのxsd:datetime。(タイムゾーンなしの場合も、単一値に対して"2004-02-18T15:12:54""2004-02-18T15:12:54.0000"などの複数の表現が存在します。)

  • DATE: タイムゾーン付きまたはタイムゾーンなしのxsd:date

  • OTHER: その他すべて。(異なる表現を一致する試みは行われません。)

xsd:time型とxsd:dateTime型のリテラルにタイムゾーンが存在する場合、正規化が実行されます。

名前空間定義にはxmlns:xsd="http://www.w3.org/2001/XMLSchema"が使用されます。

RDF_VALUE$表で最初に出現するリテラルは、正規形として扱われ、それぞれCPLCPL@CTLCPLLCPLL@またはCTLLというVALUE_TYPE値が適切に割り当てられます(つまり、正規形の場合は実際の値タイプにCという接頭辞が付けられます)。以前挿入されたリテラルと同じ正規形を持つ(ただし異なる字句表現の)リテラルがRDF_VALUE$表に挿入されると、その新しい挿入に対してそれぞれPLPL@TLPLLPLL@またはTLLというVALUE_TYPE値が適切に割り当てられます。

したがって、正規化後に等価となる異なる字句表現を持つテキスト値は、RDF_VALUE$表に格納されますが、正規化後に等価となるトリプルはデータベースに格納されません。

1.3.3 主語と目的語

RDFの主語と目的語は、セマンティク・データ・ネットワークのノードにマップされます。主語のノードはリンクの開始ノードで、目的語のノードはリンクの終了ノードです。リテラル以外のノード(URIや空白ノード)は、主語および目的語のノードとして使用できます。リテラルは、目的語のノードとしてのみ使用できます。

1.3.4 空白ノード

空白ノードは、セマンティク・ネットワークの主語および目的語のノードとして使用できます。空白ノード識別子は、1つのセマンティク・モデル内を有効範囲とする点において、URIとは異なります。つまり、単一のセマンティク・モデル内に同じ空白ノード識別子が複数出現した場合、それらは常に同じリソースを示しますが、異なる2つのセマンティク・モデル内に同じ空白ノード識別子が出現した場合、それらは同じリソースを示しません。

Oracleセマンティク・ネットワークにおいて、この動作は、空白ノードは常に1つのセマンティク・モデル内で再利用され、2つの異なるモデル間では再利用されない(つまり、同じ空白ノード識別子が使用される場合は同じリソースを表している)という要件の適用によりモデル化されます。このため、空白ノードを含むトリプルをモデルに挿入する場合、空白ノードの再利用をサポートするSDO_RDF_TRIPLE_Sコンストラクタを使用する必要があります。

1.3.5 プロパティ

プロパティは、開始ノード(主語)と終了ノード(目的語)を備えたリンクにマップされます。したがって、1つのリンクは完全なトリプルを表します。

トリプルがモデルに挿入されると、主語、プロパティおよび目的語のテキスト値について、それらがすでにデータベースに存在するかどうかがチェックされます。他のモデルの以前の文に基づくテキスト値がすでに存在する場合、新規エントリは作成されません。テキスト値が存在しない場合、RDF_VALUE$表(1.3.2項を参照)に新規行が挿入されます。

1.3.6 推論: ルールとルールベース

推論は、ルールに基づいて論理的な推測を行う機能です。推論により、文字列などの値に基づく構文的な一致機能ではなく、データの各要素間の意味的な関係に基づいてセマンティクな一致機能を実行する問合せを作成できます。推論では、ルールベースに格納されたルールを使用します。ルールには、Oracleに付属するものとユーザーが定義するものがあります。

図1-2に、モデル・データと1つ以上のルールベースにおけるルールの適用から推論されたトリプル・セットを示します。この図の場合、データベースには任意の数のセマンティク・モデル、ルールベース、および推論されたトリプル・セットがあり、推論されたトリプル・セットは1つ以上のルールベースのルールを使用して導出されます。

ルールは、セマンティク・データから推論を導く際に適用できるオブジェクトです。ルールは、名前で識別され、次の要素で構成されます。

  • 前件に対応するIF側パターン

  • IF側パターンで一致したサブグラフをさらに絞り込むオプションのフィルタ条件

  • 後件に対応するTHEN側パターン

たとえば、「会議の議長は会議のレビューアでもある」というルールは、次のように表現されます。

('chairpersonRule', -- rule name
 '(?r :ChairPersonOf ?c)', -- IF side pattern
 NULL,  -- filter condition
 '(?r :ReviewerOf ?c)', -- THEN side pattern
 SEM_ALIASES (SEM_ALIAS('', 'http://some.org/test/'))
)

この場合、ルールにフィルタ条件はないため、表現内のその構成要素はNULLです。複数のトリプルを持つTHEN側パターンを使用して、IF側の一致ごとに複数のトリプルを推論できます。

ルールベースは、ルールを含むオブジェクトです。Oracleには、次のルールベースが付属しています。

  • RDFS

  • RDF(RDFSのサブセット)

  • OWLSIF(空)

  • RDFS++(空)

  • OWLPRIME(空)

RDFSおよびRDFルールベースは、SEM_APIS.CREATE_SEM_NETWORKプロシージャをコールしてRDFサポートをデータベースに追加すると作成されます。RDFSルールベースでは、RDFS伴意ルールを実装します。詳細は、http://www.w3.org/TR/rdf-mt/にあるWorld Wide Web Consortium(W3C)のドキュメント「RDF Semantics」を参照してください。RDFルールベースは、RDF伴意ルール(RDFS伴意ルールのサブセット)を表します。これらのルールベースの内容は、MDSYS.SEMR_RDFSおよびMDSYS.SEMR_RDFビューで確認できます。

SEM_APIS.CREATE_RULEBASEプロシージャを使用してユーザー定義のルールベースを作成することも可能です。ユーザー定義のルールベースを使用すると、特殊化された推論機能を追加できます。

ルールベースごとに、ルールベースのルールを保持するためのシステム表と、MDSYS.SEMR_rulebase-nameという形式の名前を持つシステム・ビューが作成されます(たとえば、FAMILY_RBというルールベースの場合、MDSYS.SEMR_FAMILY_RBという名前になります)。ルールベースのルールを挿入、削除および変更するには、このビューを使用する必要があります。表1-4に、各MDSYS.SEMR_rulebase-nameビューの列を示します。

表1-4 MDSYS.SEMR_rulebase-nameビューの列

列名 データ型 説明

RULE_NAME

VARCHAR2(30)

ルールの名前

ANTECEDENTS

VARCHAR2(4000)

前件に対応するIF側パターン

FILTER

VARCHAR2(4000)

IF側パターンで一致したサブグラフをさらに絞り込むフィルタ条件。NULLは、適用されるフィルタ条件がないことを示します。

CONSEQUENTS

VARCHAR2(4000)

後件に対応するTHEN側パターン

ALIASES

SEM_ALIASES

使用される1つ以上の名前空間。(SEM_ALIASESデータ型の詳細は、1.6項を参照。)


すべてのルールベースに関する情報は、MDSYS.SEM_RULEBASE_INFOビューに保持されます。表1-5に、このビューの列を示します(1つの行が1つのルールベースに対応します)。

表1-5 MDSYS.SEM_RULEBASE_INFOビューの列

列名 データ型 説明

OWNER

VARCHAR2(30)

ルールベースの所有者

RULEBASE_NAME

VARCHAR2(25)

ルールベースの名前

RULEBASE_VIEW_NAME

VARCHAR2(30)

ルールベースのルールを挿入、削除または変更する任意のSQL文で使用する必要のあるビューの名前

STATUS

VARCHAR2(30)

VALID(ルールベースが有効の場合)、INPROGRESS(ルールベースが作成中の場合)またはFAILED(ルールベースの作成中にシステム障害が発生した場合)が含まれます。


例1-1では、family_rbというルールベースを作成し、そのfamily_rbルールベースにgrandparent_ruleというルールを挿入します。このルールは、ある人物がある子の親であり、その子がさらに別の子の親である場合、その人物が自分の子供の子供に対する祖父母である(つまり、自分の子供の子供に関してgrandParentOf関係を持つ)ことを示します。また、使用する名前空間も指定します。(この例は、1.10.2項例1-14からの抜粋です。)

例1-1 ルールベースへのルールの挿入

EXECUTE SEM_APIS.CREATE_RULEBASE('family_rb');

INSERT INTO mdsys.semr_family_rb VALUES(
  'grandparent_rule',
  '(?x :parentOf ?y) (?y :parentOf ?z)',
  NULL,
  '(?x :grandParentOf ?z)',
  SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')));

SEM_MATCHテーブル・ファンクション(1.6項を参照)をコールするときに1つ以上のルールベースを指定して、セマンティク・データに対する問合せの動作を制御できます。例1-2では、family_rbルールベースと、例1-1で作成したgrandParentOf関係を参照して、すべての祖父(祖父母の男性の方)とその孫を検索します。(この例は、1.10.2項例1-14からの抜粋です。)

例1-2 推論でのルールベースの使用

-- Select all grandfathers and their grandchildren from the family model.
-- Use inferencing from both the RDFS and family_rb rulebases.
SELECT x, y
  FROM TABLE(SEM_MATCH(
    '(?x :grandParentOf ?y) (?x rdf:type :Male)',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'),
    SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
    null));

ネイティブOWL推論のサポートの詳細は、2.2項を参照してください。

1.3.7 ルール索引

ルール索引は、指定したルールベースのセットを指定したモデルのセットに適用することで推論できる計算済のトリプルを含むオブジェクトです。SEM_MATCH問合せで任意のルールベースを参照する場合、問合せ内のルールベースとモデルの組合せごとにルール索引が存在している必要があります。

ルール索引を作成するには、SEM_APIS.CREATE_RULES_INDEXプロシージャを使用します。ルール索引を削除するには、SEM_APIS.DROP_RULES_INDEXプロシージャを使用します。

ルール索引を作成すると、そのルール索引に関連付けられたトリプルのビューもMDSYSスキーマに作成されます。このビューは、SEMI_rules-index-nameという形式の名前を持ち、ルール索引の所有者および適切な権限を持つユーザーにのみ表示されます。各MDSYS.SEMI_rules-index-nameビューには、ネットワークにリンクとして格納されたトリプルごとに1つの行が保持されます。また、SEMM_model-nameビューと同じ列が含まれます(1.3.1項表1-2を参照)。

すべてのルール索引に関する情報は、MDSYS.SEM_RULES_INDEX_INFOビューに保持されます。表1-6に、このビューの列を示します(1つの行が1つのルール索引に対応します)。

表1-6 MDSYS.SEM_RULES_INDEX_INFOビューの列

列名 データ型 説明

OWNER

VARCHAR2(30)

ルール索引の所有者

INDEX_NAME

VARCHAR2(25)

ルール索引の名前

INDEX_VIEW_NAME

VARCHAR2(30)

ルール索引のルールを挿入、削除または変更する任意のSQL文で使用する必要のあるビューの名前

STATUS

VARCHAR2(30)

VALID(ルール索引が有効の場合)、INVALID(ルール索引が無効の場合)、INCOMPLETE(ルール索引が不完全の場合(INVALIDと似ていますが、再作成にそれほど時間がかかりません))、INPROGRESS(ルール索引が作成中の場合)またはFAILED(ルール索引の作成中にシステム障害が発生した場合)が含まれます。

MODEL_COUNT

NUMBER

ルール索引に含まれるモデルの数

RULEBASE_COUNT

NUMBER

ルール索引に含まれるルールベースの数


モデルやルールベースなど、ルール索引に関連するすべてのデータベース・オブジェクトの情報は、MDSYS.SEM_RULES_INDEX_DATASETSビューに保持されます。表1-7に、このビューの列を示します(1つの行がすべての列の値の一意の組合せに対応します)。

表1-7 MDSYS.SEM_RULES_INDEX_DATASETSビューの列

列名 データ型 説明

INDEX_NAME

VARCHAR2(25)

ルール索引の名前

DATA_TYPE

VARCHAR2(8)

ルール索引に含まれるデータのタイプ。たとえば、MODELおよびRULEBASEです。

DATA_NAME

VARCHAR2(25)

DATA_TYPE列に含まれるタイプのオブジェクトの名前


例1-3では、familyモデルとRDFSおよびfamily_rbルールベースを使用して、family_rb_rix_familyというルール索引を作成します。(この例は、1.10.2項例1-14からの抜粋です。)

例1-3 ルール索引の作成

BEGIN
  SEM_APIS.CREATE_RULES_INDEX(
    'rdfs_rix_family',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'));
END;
/

1.3.8 仮想モデル

仮想モデルとは、SEM_MATCH問合せで使用できる論理グラフのことです。仮想モデルは、1つ以上のモデルおよび対応するルール索引(オプション)に対してUNIONまたはUNION ALL操作を実行した結果です。

仮想モデルを使用すると、セマンティク・データのアクセス権限の管理を簡略化できます。たとえば、3つのモデルおよびOWLPRIMEルールベースに基づいて、3つのセマンティク・モデルおよび1つのルール索引を作成したとします。仮想モデルを使用しない場合は、各モデルおよびルール索引に対してアクセス権限の付与および取消しを個別に行う必要があります。しかし、3つのモデルとルール索引を含む仮想モデルを作成すれば、この1つの仮想モデルに対してのみアクセス権限の付与および取消しを行うだけですみます。

また、仮想モデルを使用すると、セマンティク・モデルの更新も高速化できます。たとえば、仮想モデルVM1にモデルM1とルール索引R1が含まれるとします(VM1 = M1 UNION ALL R1)。また、セマンティク・モデルM1_UPDは追加のトリプルで更新されたM1のコピーであり、R1_UPDはM1_UPDに作成されたルール索引であるとします。この場合、VM1に対するユーザー問合せで更新済のモデルおよびルール索引が使用されるように、仮想モデルVM1を再定義できます(VM1 = M1_UPD UNION ALL R1_UPD)。

仮想モデルを作成するには、SEM_APIS.CREATE_VIRTUAL_MODELプロシージャを使用します。仮想モデルを削除するには、SEM_APIS.DROP_VIRTUAL_MODELプロシージャを使用します。仮想モデルのコンポーネント・モデル、ルールベースまたはルール索引が削除されると、その仮想モデルは自動的に削除されます。

仮想モデルを問い合せるには、例1-4に示すとおり、SEM_MATCHテーブル・ファンクションのmodelsパラメータで仮想モデル名を指定します。

例1-4 仮想モデルの問合せ

SELECT COUNT(protein)
  FROM TABLE (SEM_MATCH (
    '(?protein rdf:type :Protein)
     (?protein :citation ?citation)
     (?citation :author "Bairoch A.")',
    SEM_MODELS('UNIPROT_VM'),
    NULL,
    SEM_ALIASES(SEM_ALIAS('', 'http://purl.uniprot.org/core/')),
    NULL,
    NULL,
    'ALLOW_DUP=T'));

SEM_MATCHテーブル・ファンクションの詳細は、1.6項を参照してください。この項に、仮想モデルを問い合せるときの特定の属性の使用方法が示されています。

仮想モデルを作成すると、MDSYS.SEM_MODEL$ビューに仮想モデルのエントリが作成されます(1.3.1項表1-1を参照)。ただし、表1-8の説明にあるとおり、いくつかの列では、仮想モデルの値はセマンティク・モデルの値と異なります。

表1-8 仮想モデルのMDSYS.SEM_MODEL$ビューの列の説明

列名 データ型 説明

OWNER

VARCHAR2(30)

仮想モデルの所有者のスキーマ。

MODEL_ID

NUMBER

一意のモデルID番号(自動生成)。これが仮想モデルであることを表すため、負の数になります。

MODEL_NAME

VARCHAR2(25)

仮想モデルの名前。

TABLE_NAME

VARCHAR2(30)

仮想モデルの場合はNULL。

COLUMN_NAME

VARCHAR2(30)

仮想モデルの場合はNULL。

MODEL_TABLESPACE_NAME

VARCHAR2(30)

仮想モデルの場合はNULL。


すべての仮想モデルに関する情報は、MDSYS.SEM_VMODEL_INFOビューに保持されます。表1-6に、このビューの列を示します(1つの行が1つの仮想モデルに対応します)。

表1-9 MDSYS.SEM_VMODEL_INFOビューの列

列名 データ型 説明

OWNER

VARCHAR2(30)

仮想モデルの所有者。

VIRTUAL_MODEL_NAME

VARCHAR2(25)

仮想モデルの名前。

UNIQUE_VIEW_NAME

VARCHAR2(30)

仮想モデル内に一意のトリプルを含むビューの名前。ビューが作成されていない場合は、NULL。

DUPLICATE_VIEW_NAME

VARCHAR2(30)

仮想モデル内に重複するトリプル(ある場合)を含むビューの名前。

STATUS

VARCHAR2(30)

VALID(関連付けられたルール索引が有効の場合)、INVALID(ルール索引が無効の場合)、INCOMPLETE(ルール索引が不完全の場合(INVALIDと似ていますが、再作成にそれほど時間がかかりません))、INPROGRESS(ルール索引が作成中の場合)、FAILED(ルール索引の作成中にシステム障害が発生した場合)、またはNORIDX(仮想モデルにルール索引が関連付けられていない場合)が含まれます。

MODEL_COUNT

NUMBER

仮想モデル内のモデルの数。

RULEBASE_COUNT

NUMBER

仮想モデルに使用されるルールベースの数。

RULES_INDEX_COUNT

NUMBER

仮想モデル内のルール索引の数。


すべてのオブジェクト(モデル、ルールベースおよびルール索引)に関する情報は、MDSYS.SEM_VMODEL_DATASETSビューに保持されます。表1-7に、このビューの列を示します(1つの行がすべての列の値の一意の組合せに対応します)。

表1-10 MDSYS.SEM_VMODEL_DATASETSビューの列

列名 データ型 説明

VIRTUAL_MODEL_NAME

VARCHAR2(25)

仮想モデルの名前。

DATA_TYPE

VARCHAR2(8)

仮想モデルに含まれるオブジェクトのタイプ。例: MODEL(セマンティク・モデル)、RULEBASE(ルールベース)、RULEIDX(ルール索引)。

DATA_NAME

VARCHAR2(25)

DATA_TYPE列に含まれるタイプのオブジェクトの名前


1.3.9 セマンティク・データのセキュリティ上の考慮事項

セマンティク・データを使用する場合、次のデータベース・セキュリティの考慮事項が適用されます。

  • モデルまたはルール索引を作成すると、関連ビューに対するGRANTオプション付きのSELECT権限が所有者に付与されます。これらのビューに対してSELECT権限を持つユーザーは、関連モデルまたはルール索引に対してSEM_MATCH問合せを実行できます。

  • ルールベースを作成すると、ルールベースに対するGRANTオプション付きのSELECT、INSERT、UPDATEおよびDELETE権限が所有者に付与されます。ルールベースに対してSELECT権限を持つユーザーは、ルールベースを含むルール索引を作成できます。INSERT、UPDATEおよびDELETE権限により、ルールベースを変更できるユーザーと、その変更方法が制御されます。

  • モデルに対してデータ操作言語(DML)の操作を実行する場合、ユーザーは対応する実表に対するDML権限を持っている必要があります。

  • モデルに対応する実表の作成者は、他のユーザーに権限を付与できます。

  • ルールベースに対してデータ操作言語(DML)の操作を実行する場合、ユーザーは対応するデータベース・ビューに対する適切な権限を持っている必要があります。

  • モデルの作成者は、対応するデータベース・ビューに対するSELECT権限を他のユーザーに付与できます。

  • ユーザーは、対応するデータベース・ビューに対するSELECT権限を持っているモデルのみを問い合せることができます。

  • モデルまたはルールベースを削除できるのは、その作成者のみです。

1.4 セマンティク・メタデータ表およびビュー

Oracle Databaseでは、セマンティク・データに関連するメタデータを保持するために、MDSYSスキーマで複数の表およびビューが管理されます。(これらの表およびビューの一部は、1.9項に記載されているSEM_APIS.CREATE_SEM_NETWORKプロシージャによって作成され、一部は必要な場合にのみ作成されます。)表1-11に、これらの表およびビューをアルファベット順に示します。(また、Oracleで内部的に使用するためにいくつかの表およびビューも作成されますが、それらの表およびビューにはDBA権限を持つユーザーのみがアクセスできます。)

表1-11 セマンティク・メタデータ表およびビュー

名前 含まれる情報 参照先

RDF_VALUE$

文を表すのに使用される主語、プロパティおよび目的語

1.3.2項


SEM_MODEL$

データベースに定義されているすべてのモデル

1.3.1項


SEMM_model-name

指定したモデルのトリプル

1.3.1項


SEM_RULEBASE_INFO

ルールベース

1.3.6項


SEM_RULES_INDEX_DATASETS

ルール索引で使用されるデータベース・オブジェクト

1.3.7項


SEM_RULES_INDEX_INFO

ルール索引

1.3.7項


SEM_VMODEL_INFO

仮想モデル

1.3.8項


SEM_VMODEL_DATASETS

仮想モデルで使用されるデータベース・オブジェクト

1.3.8項


SEMI_rules-index-name

指定したルール索引のトリプル

1.3.7項


SEMR_rulebase-name

指定したルールベースのルール

1.3.6項


SEMU_virtual-model-name

仮想モデル内の一意のトリプル

1.3.8項


SEMV_virtual-model-name

仮想モデル内のトリプル

1.3.8項



1.5 セマンティク・データの型、コンストラクタおよびメソッド

SDO_RDF_TRIPLEオブジェクト型は、トリプル形式のセマンティク・データを表し、SDO_RDF_TRIPLE_Sオブジェクト型(_Sは格納の意味)は、データベースに永続セマンティク・データを格納します。実際のセマンティク・データはRDFスキーマにのみ一元的に格納されるため、SDO_RDF_TRIPLE_S型はデータに対する参照を保持します。この型には、トリプルの一部または全部を取得するためのメソッドがあります。


注意:

空白ノードは、常に1つのRDFモデル内で再利用されます。複数のモデル間で再利用することはできません。

SDO_RDF_TRIPLE型はトリプルの表示に使用し、SDO_RDF_TRIPLE_S型はデータベース表へのトリプルの格納に使用します。

SDO_RDF_TRIPLEオブジェクト型には、次の属性が含まれます。

SDO_RDF_TRIPLE (
  subject VARCHAR2(4000),
  property VARCHAR2(4000),
  object VARCHAR2(10000))

SDO_RDF_TRIPLE_Sオブジェクト型には、次の属性が含まれます。

SDO_RDF_TRIPLE_S (
  RDF_C_ID  NUMBER,  -- Canonical object value ID
  SEM_M_ID NUMBER,  -- Model ID
  RDF_S_ID  NUMBER,  -- Subject value ID
  RDF_P_ID NUMBER, -- Property value ID
  RDF_O_ID  NUMBER)  -- Object value ID

SDO_RDF_TRIPLE_S型には、トリプルまたはトリプルの一部(主語、プロパティまたは目的語)を取得する次のメソッドが含まれます。

GET_TRIPLE() RETURNS SDO_RDF_TRIPLE
GET_SUBJECT() RETURNS VARCHAR2
GET_PROPERTY() RETURNS VARCHAR2
GET_OBJECT() RETURNS CLOB

例1-5に、SDO_RDF_TRIPLE_Sのメソッドを示します。

例1-5 SDO_RDF_TRIPLE_Sのメソッド

SELECT a.triple.GET_TRIPLE() AS triple
  FROM articles_rdf_data a WHERE a.id = 1;

TRIPLE(SUBJECT, PROPERTY, OBJECT)
--------------------------------------------------------------------------------
SDO_RDF_TRIPLE('<http://nature.example.com/Article1>', '<http://purl.org/dc/elem
ents/1.1/title>', '<All about XYZ>')

SELECT a.triple.GET_SUBJECT() AS subject
  FROM articles_rdf_data a WHERE a.id = 1;

SUBJECT
--------------------------------------------------------------------------------
<http://nature.example.com/Article1>

SELECT a.triple.GET_PROPERTY() AS property
  FROM articles_rdf_data a WHERE a.id = 1;

PROPERTY
--------------------------------------------------------------------------------
<http://purl.org/dc/elements/1.1/title>

SELECT a.triple.GET_OBJECT() AS object
  FROM articles_rdf_data a WHERE a.id = 1;

OBJECT
--------------------------------------------------------------------------------
<All about XYZ>

1.5.1 空白ノードのないトリプルを挿入するコンストラクタ

次のコンストラクタ書式は、トリプルをモデル表に挿入する場合に使用できます。2つの書式の唯一の違いは、2番目の書式における目的語のデータ型がCLOBであり、非常に長いリテラルに対応できることです。

SDO_RDF_TRIPLE_S (
  model_name VARCHAR2, -- Model name
  subject    VARCHAR2, -- Subject
  property   VARCHAR2, -- Property
  object     VARCHAR2) -- Object
  RETURN     SELF;

SDO_RDF_TRIPLE_S (
  model_name VARCHAR2, -- Model name
  subject    VARCHAR2, -- Subject
  property   VARCHAR2, -- Property
  object     CLOB) -- Object
  RETURN SELF;

GET_OBJ_VALUE() RETURN VARCHAR2;

例1-6では、1番目のコンストラクタ書式を使用してトリプルを挿入します。

例1-6 トリプルを挿入するSDO_RDF_TRIPLE_Sコンストラクタ

INSERT INTO articles_rdf_data VALUES (2,
  SDO_RDF_TRIPLE_S ('articles','<http://nature.example.com/Article1>',
    '<http://purl.org/dc/elements/1.1/creator>',
    '"Jane Smith"'));

1.5.2 空白ノードのあるトリプルまたは空白ノードのないトリプルを挿入するコンストラクタ

次のコンストラクタ書式は、空白ノードを参照するトリプルをモデル表に挿入する場合に使用できます。2つの書式の唯一の違いは、2番目の書式における4つ目の属性のデータ型がCLOBであり、非常に長いリテラルに対応できることです。

SDO_RDF_TRIPLE_S (
  model_name VARCHAR2, -- Model name
  sub_or_bn  VARCHAR2, -- Subject or blank node
  property   VARCHAR2, -- Property
  obj_or_bn  VARCHAR2, -- Object or blank node
  bn_m_id    NUMBER) -- ID of the model from which to reuse the blank node
  RETURN SELF;

SDO_RDF_TRIPLE_S (
  model_name VARCHAR2, -- Model name
  sub_or_bn  VARCHAR2, -- Subject or blank node
  property   VARCHAR2, -- Property
  object     CLOB, -- Object
  bn_m_id    NUMBER) -- ID of the model from which to reuse the blank node
  RETURN SELF;

bn_m_idの値が正の場合、ターゲット・モデルのモデルIDと同じである必要があります。

例1-7では、1番目のコンストラクタ書式を使用して、主語で空白ノードを再利用するトリプルを挿入します。

例1-7 空白ノードを再利用するSDO_RDF_TRIPLE_Sコンストラクタ

INSERT INTO nsu_data VALUES (SDO_RDF_TRIPLE_S(
  'nsu',
  '_:BNSEQN1001A',
  '<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>',
  '<http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq>',
  4));

1.6 SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ

セマンティク・データを問い合せるには、SEM_MATCHテーブル・ファンクションを使用します。このファンクションには、次の属性が含まれます。

SEM_MATCH(
  query        VARCHAR2,
  models       SEM_MODELS,
  rulebases    SEM_RULEBASES,
  aliases      SEM_ALIASES,
  filter       VARCHAR2,
  index_status VARCHAR2,
  options      VARCHAR2
 ) RETURN ANYDATASET;

query属性は必須です。その他の属性はオプションです(それぞれNULL値を指定できます)。

query属性は、通常は変数が含まれる1つ以上のトリプル・パターンを備えた文字列リテラル(または文字列リテラルを連結したもの)です。(query属性には、バインド変数またはバインド変数を含む式を指定することはできません。)トリプル・パターンは、カッコで囲まれた3つのアトムです。各アトムには、変数(?xなど)、デフォルトの名前空間およびaliases属性の値に基づいて拡張された修飾名(rdf:type)、または完全なURI(<http://www.example.org/family/Male>など)を指定できます。また、3番目のアトムには、数値リテラル(3.14など)、プレーン・リテラル("Herman"など)、言語タグ付きのプレーン・リテラル("Herman"@enなど)または型付きリテラル("123"^^xsd:intなど)を指定できます。

たとえば、次のquery属性では、3つのトリプル・パターンを使用して祖父(祖父母の男性の方)とその孫の身長を検索します。

'(?x :grandParentOf ?y) (?x rdf:type :Male) (?y :height ?h)'

models属性では、使用する1つ以上のモデルを指定します。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。仮想モデルを問い合せる場合、他のモデル名は指定せず、その仮想モデルの名前のみを指定します。(仮想モデルの詳細は、1.3.8項を参照してください。)

rulebases属性では、問合せに適用するルールが含まれる1つ以上のルールベースを指定します。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSDO_RDF_RULEBASESです。仮想モデルを問い合せる場合、この属性はNULLである必要があります。

aliases属性では、デフォルトの名前空間以外に、問合せパターンの修飾名の拡張に使用する1つ以上の名前空間を指定します。そのデータ型は、TABLE OF SEM_ALIASという定義を持つSEM_ALIASESです。各SEM_ALIAS要素により、名前空間IDと名前空間値が識別されます。SEM_ALIASデータ型は、(namespace_id VARCHAR2(30), namespace_val VARCHAR2(4000))という定義を持ちます。

SEM_MATCHテーブル・ファンクションでは、次のデフォルトの名前空間(namespace_id属性とnamespace_val属性)が使用されます。

('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#')
('rdfs', 'http://www.w3.org/2000/01/rdf-schema#')
('xsd', 'http://www.w3.org/2001/XMLSchema#')

これらのデフォルトを上書きするには、aliases属性でnamespace_id値および異なるnamespace_val値を指定します。

filter属性では、追加の選択基準を指定します。この属性がNULLではない場合、WHEREキーワードのないWHERE句の形式で文字列を指定する必要があります。たとえば、この項で前に示したトリプル・パターンの例で'(h >= 6)'と指定すると、身長が6以上である祖父の孫に検索結果を絞り込めます。

index_status属性では、関連するルール索引のステータスが無効の場合でも、セマンティク・データを問い合せることができます。(仮想モデルを問い合せる場合、この属性は、その仮想モデルに関連付けられたルール索引を参照します。)この属性がNULLの場合、ルール索引のステータスが無効であると、問合せによりエラーが戻されます。この属性がNULLではない場合、文字列INCOMPLETEまたはINVALIDを指定する必要があります。異なるindex_status値による問合せ動作の詳細は、1.6.1項を参照してください。

options属性は、問合せの結果に影響を与えることのできるオプションを指定します。オプションは、キーワードと値のペアで表記します。次のオプションがサポートされています。

SEM_MATCHテーブル・ファンクションでは、入力変数に応じた要素とともにANYDATASET型のオブジェクトが戻されます。次の説明において、varは問合せで使用される変数名を示します。

このような場合、varは変数にバインドされた字句の値を保持し、var$RDFVIDは変数にバインドされた値のVALUE_IDを持ちます。var$_PREFIXおよびvar$_SUFFIXは、変数にバインドされた値の接頭辞と接尾辞です。var$RDFVTYPは、変数にバインドされた値のタイプ(URILIT [literal]またはBLN [blank node])を示します。var$RDFCLOBは、値がロング・リテラルの場合に変数にバインドされた字句の値を持ちます。var$RDFLTYPは、リテラルがバインドされている場合にそのバインドされたリテラルのタイプを示します。var$RDFLANGは、言語タグ付きのリテラルがバインドされている場合に、そのバインドされたリテラルの言語タグを持ちます。var$RDFCLOBはCLOB型ですが、他のすべての属性はVARCHAR2型です。

リテラル値または空白ノードの場合、接頭辞は値そのものになり、接尾辞はNULLになります。URI値の場合、接頭辞は値の一番右側にある/(スラッシュ)、#(ポンド)または:(コロン)の3つのいずれかの文字から左側の部分となり、接尾辞はそれより右側の値部分となります。たとえば、URI値http://www.example.org/family/grandParentOfの場合、接頭辞はhttp://www.example.org/family/、接尾辞はgrandParentOfとなります。

例1-8では、RDFSfamily_rbの2つのルールベースによる推論を使用して、familyモデルからすべての祖父(祖父母の男性の方)とその孫を選択します。(この例は、1.10.2項例1-14からの抜粋です。)

例1-8 SEM_MATCHテーブル・ファンクション

SELECT x, y
  FROM TABLE(SEM_MATCH(
    '(?x :grandParentOf ?y) (?x rdf:type :Male)',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'),
    SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
    null));

例1-9例1-8と同じ機能ですが、HINT0オプションが追加されています。

例1-9 SEM_MATCHテーブル・ファンクションを使用したHINT0オプション

SELECT x, y
  FROM TABLE(SEM_MATCH(
    '(?x :grandParentOf ?y) (?x rdf:type :Male)',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'),
    SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
    null,
    null,
    'HINT0={LEADING(t0 t1) USE_NL(?x ?y) GET_CANON_VALUE(?x ?y)}'));

例1-10では、Pathway/Genome BioPaxオントロジを使用して、ProteinsComplexesの両方に属するすべての化学的複合タイプを取得します。

例1-10 SEM_MATCHテーブル・ファンクション

SELECT t.r
  FROM TABLE (SEM_MATCH (
      '(?r rdfs:subClassOf Proteins)
       (?r rdfs:subClassOf Complexes)',
      SEM_Models ('BioPax'),
      SEM_Rulebases ('rdfs'), NULL)) t;

例1-10のとおり、SEM_MATCHテーブル・ファンクションの検索パターンは、変数が疑問符文字(?)で始まるSPARQLに似た構文を使用して指定します。この例の場合、変数?rは、同じ語に一致する必要があるため、ProteinsComplexesの両方のサブクラスである必要があります。

SEM_RELATED演算子を使用してOWLオントロジを問い合せる方法の詳細は、2.3項を参照してください。

複数のモデルを問い合せる場合、または1つ以上のモデルおよびそれに対応するルール索引を問い合せる場合、パフォーマンスの向上のため、仮想モデルを使用することを考慮してください(1.3.8項を参照)。

1.6.1 不完全なルール索引または無効なルール索引を使用した問合せの実行

関連するルール索引のステータスが無効の場合でも、SEM_MATCHテーブル・ファンクションのindex_status属性に文字列値INCOMPLETEまたはINVALIDを指定すれば、セマンティク・データを問い合せることができます。(ルール索引のステータスは、1.3.7項に記載されているとおり、MDSYS.SEM_RULES_INDEX_INFOビューのSTATUS列に格納されます。SEM_MATCHテーブル・ファンクションの詳細は、1.6項を参照してください。)

index_status属性の値は、問合せの動作に次のように影響します。

  • ルール索引のステータスが有効の場合、問合せ動作はindex_status属性の値に影響を受けません。

  • index_statusに値を指定しないか、NULL値を指定すると、ルール索引のステータスが無効である場合、問合せによりエラーが戻されます。

  • index_status属性に文字列INCOMPLETEを指定すると、ルール索引のステータスが不完全または有効である場合、問合せが実行されます。

  • index_status属性に文字列INVALIDを指定すると、ルール索引の実際のステータス(無効、不完全または有効)にかかわらず問合せが実行されます。

ただし、ルール索引のステータスが不完全または無効の場合、次の考慮事項が適用されます。

  • ステータスが不完全の場合、ルール索引の内容は近似値となる可能性があります。基礎となるモデルに最近挿入されて推論可能となったいくつかのトリプルは、実際にはルール索引に存在しないことがあり、したがって問合せにより戻される結果は不正確となる可能性があるためです。

  • ステータスが無効の場合、ルール索引の内容は近似値となる可能性があります。基礎となるモデルまたはルールベース(あるいはその両方)が最近変更されて推論不可能となったいくつかのトリプルは、まだルール索引に存在することがあり、したがって問合せにより戻される結果の正確性が影響を受ける可能性があるためです。推論不可能となったトリプルが存在する可能性に加え、一部の推論可能な行が実際にはルール索引に存在しない可能性もあります。

1.6.2 グラフ・パターン: 中カッコ構文およびOPTIONALキーワードのサポート

SEM_MATCHテーブル・ファンクションは、一連のトリプル・パターンを中カッコで囲むグラフ・パターンの構文を受け入れます。OPTIONALキーワードが続く場合以外は、セパレータとしてピリオドが必要です。また、この構文でOPTIONAL構成要素を使用して、部分一致の場合にも結果を取得することができます。

例1-11例1-8と同じ機能ですが、中カッコとピリオドを含む構文を使用してSEM_MATCHテーブル・ファンクション内のグラフ・パターンを表現しています。

例1-11 中カッコの構文

SELECT x, y
  FROM TABLE(SEM_MATCH(
    '{?x :grandParentOf ?y . ?x rdf:type :Male}',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'),
    SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
    null));

例1-12では、各祖父の参加する試合の名前(いずれの試合にも参加しない場合はNULL)が戻されるように、OPTIONAL構成要素を使用して例1-11を変更しています。

例1-12 中カッコの構文およびOPTIONAL構成要素

SELECT x, y, game
  FROM TABLE(SEM_MATCH(
    '{?x :grandParentOf ?y . ?x rdf:type :Male .
      OPTIONAL{?x :plays ?game}
     }',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'),
    SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
    null,
    null,
    'HINT0={LEADING(t0 t1) USE_NL(?x ?y)}'));

中カッコを含む構文を使用してグラフ・パターンを表現した場合、次のようになります。

  • 問合せは常に、変数の一致する値の正規字句形式を戻します。

  • HINT0={<hint-string>}を使用して指定するヒント(1.6項を参照)は、OPTIONAL構成要素の外側のグラフ・パターン部分に基づいてのみ構成する必要があります。たとえば、例1-12の問合せのヒント指定で使用できる有効な別名は、t0t1?xおよび?yのみです。

1.7 セマンティク・データのロードおよびエクスポート

セマンティク・データをモデルにロードするには、次の1つ以上のオプションを使用します。

セマンティク・データをエクスポートするには、1.7.4項に記載されているJava APIを使用します。

1.7.1 ステージング表を使用したセマンティク・データのバルク・ロード

ステージング表を使用して、セマンティク・データ(およびオプションでセマンティク・データ以外の関連データ)をバルク・ロードできます。データは、最初に解析して構文の正確性をチェックしてからステージング表にロードする必要があります。次に、SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャをコールします(第3章を参照)。

次の例では、すべての必須列とそれらの列の必須名を含むステージング表の書式を示します。

CREATE TABLE stage_table (
                     RDF$STC_sub varchar2(4000) not null,
                     RDF$STC_pred varchar2(4000) not null,
                     RDF$STC_obj varchar2(4000) not null
);

非セマンティク・データもロードする場合は、CREATE TABLE文に非セマンティク・データ用の追加列を指定します。非セマンティク列の名前の形式は、必須列の名前と異なる必要があります。次の例では、非セマンティク属性用の2つの追加列(SOURCEおよびID)を含むステージング表を作成します。

CREATE TABLE stage_table_with_extra_cols (
                     source VARCHAR2(4000),
                     id NUMBER,
                     RDF$STC_sub varchar2(4000) not null,
                     RDF$STC_pred varchar2(4000) not null,
                     RDF$STC_obj varchar2(4000) not null
);

注意:

いずれの形式のCREATE TABLE文でも、表を圧縮するためにCOMPRESS句を追加できます。このオプションにより、必要なディスク領域が減少し、バルク・ロードのパフォーマンスが向上する可能性があります。

MDSYSユーザーに、ステージング表に対するSELECT権限と、アプリケーション表に対するINSERT権限を付与する必要があります。

SQL*Loaderユーティリティを使用して、セマンティク・データを解析し、ステージング表にロードします。Oracle Database Examplesメディアからデモ・ファイルをインストールしている場合(『Oracle Database Examplesインストレーション・ガイド』を参照)、サンプルの制御ファイル$ORACLE_HOME/md/demo/network/rdf_demos/bulkload.ctlを使用できます。このファイルは変更して使用できます。

4000バイトを超える目的語はロードできません。サンプルのSQL*Loader制御ファイルを使用する場合、このような長い値を含むトリプル(行)は、自動的に拒否され、SQL*Loaderの不良ファイルに格納されます。

ただし、4000バイトを超える目的語の値を含むトリプルは、次の方法を使用することでロードできます。

  1. SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャを使用して、ステージング表に格納可能なすべての行をロードします。

  2. N-Triple形式のファイルから残りの行(SQL*Loaderでサンプルの制御ファイルを使用した場合に拒否される行)をロードします(1.7.2項を参照)。

1.7.1.1 バルク・ロード中のイベント・トレースの記録

起動側のスキーマに表RDF$ET_TABが存在し、この表に対するINSERT権限がMDSYSユーザーに付与されている場合、SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャ実行中に実行されるタスクの一部に対するイベント・トレースが表に追加されます。バルク・ロードの問題を報告する必要がある場合は、この表の内容が役に立ちます。RDF$ET_TAB表は、次のようにして作成してください。

CREATE TABLE RDF$ET_TAB (
  proc_sid VARCHAR2(30),
  proc_sig VARCHAR2(200),
  event_name varchar2(200),
  start_time timestamp,
  end_time timestamp,
  start_comment varchar2(1000) DEFAULT NULL,
  end_comment varchar2(1000) DEFAULT NULL
);
GRANT INSERT on RDF$ET_TAB to MDSYS;

1.7.2 Java APIを使用したセマンティク・データのバッチ・ロード

バッチ・ロード操作を実行するには、<ORACLE_HOME>/md/jlib/sdordf.jarにパッケージされているJavaクラスoracle.spatial.rdf.client.BatchLoaderを使用します。バッチ・ロード操作を実行する前に、次のことを確認してください。

  • セマンティク・データがN-Triple形式であること。(RDF/XMLからN-Triple形式への変換に使用できるツールがいくつか存在します。Oracle Technology Networkを参照するか、RDF/XMLからN-Tripleへの変換に関する情報をWebで検索してください。)

  • Oracle Databaseリリース11(Oracle Spatial付き)がインストールされており、パーティショニング機能が有効であること。

  • セマンティク・テクノロジ・ネットワーク、アプリケーション表、および対応するセマンティク・モデルがデータベースに作成されていること。

  • CLASSPATH定義にojdbc5.jarが含まれていること。

  • JDKバージョン1.5以上を使用していること。(<ORACLE_HOME>/jdk/binにパッケージされたJavaバージョンを使用できます。)

oracle.spatial.rdf.client.BatchLoaderクラスを実行するには、単一のコマンドラインで次の一般的な形式のコマンドを使用します(サンプルのデータベース接続情報は、実際の接続情報で置き換えてください)。

  • Linuxシステム:

    java -Ddb.user=scott -Ddb.password=password -Ddb.host=127.0.0.1 -Ddb.port=1522 -Ddb.sid=orcl -classpath ${ORACLE_HOME}/
    md/jlib/sdordf.jar:${ORACLE_HOME}/jdbc/lib/ojdbc5.jar oracle.spatial.rdf.client.BatchLoader <N-TripleFile> <tablename>
     <tablespaceName> <modelName>
    
  • Windowsシステム:

    java -Ddb.user=scott -Ddb.password=password -Ddb.host=127.0.0.1 -Ddb.port=1522 -Ddb.sid=orcl -classpath %ORACLE_HOME%
    \md\jlib\sdordf.jar;%ORACLE_HOME%\jdbc\lib\ojdbc5.jar oracle.spatial.rdf.client.BatchLoader <N-TripleFile> <tablename>
     <tablespaceName> <modelName>
    

BatchLoaderでは、デフォルトでユーザーのアプリケーション表に少なくとも2つの列(NUMBER型のID列およびSDO_RDF_TRIPLE_S型のTRIPLE列)が存在するとみなされます。ただし、JVMプロパティ-DidColumn=<idColumnName>および-DtripleColumn=<tripleColumnName>を使用することでデフォルト名を上書きできます。ID列は必須ではありません。トリプルが挿入されるたびにBatchLoaderによって連番のような識別子がID列に生成されることを避けるには、JVMプロパティ-DjustTriple=trueを指定します。

アプリケーション表が空でなく、追加モードでバッチ・ロードを実行する場合、追加のJVMプロパティ-Dappend=trueを指定します。また、追加モードでは、ユーザーのアプリケーション表のID列に対して異なる開始値を選択できます。これを行うには、コマンドラインにJVMプロパティ-DstartID=<startingIntegerValue>を追加します。デフォルトでは、ID列は1から始まり、トリプルがアプリケーション表に新しく挿入されるたびに順番に増加します。

<N-TripleFile>の先頭のn個のトリプルをスキップするには、コマンドラインにJVMプロパティ-Dskip=<numberOfTriplesSkipped>を追加します。

デフォルトとは異なるキャラクタ・セットでN-Tripleファイルをロードするには、JVMプロパティ-Dcharset=<charsetName>を指定します。たとえば、-Dcharset="UTF-8"と指定すると、UTF-8エンコーディングとして認識されます。ただし、UTF-8文字をN-Tripleファイルに適切に格納するには、AL32UTF8などの対応する汎用キャラクタ・セットを使用するようOracle Databaseを構成する必要があります。

BatchLoaderクラスでは、圧縮形式のN-Tripleファイルのロードがサポートされます。<N-TripleFile>の拡張子が.zipや.jarである場合、そのファイルの解凍とロードが同時に実行されます。

1.7.2.1 バッチ・ロードを選択する場合

バッチ・ロードは、INSERT文を使用したセマンティク・データのロード(1.7.3項を参照)より高速です。ただし、大量のデータを処理する場合は、バッチ・ロードよりバルク・ロード(1.7.1項を参照)の方がずっと高速です。通常、バッチ・ロードは、次の条件に合致するときに適切なオプションです。

  • ロードするデータに含まれるトリプルが、数百万を超えない場合。

  • データにかなりの量のロング・リテラル(4000バイト超)が含まれる場合。

1.7.3 INSERT文を使用したセマンティク・データのロード

INSERT文を使用してセマンティク・データをロードする場合、URIは< >(山カッコ)で、空白ノードは_:(アンダースコアとコロン)で、リテラルは" "(引用符)で囲む必要があります。URIまたは空白ノードに空白文字を使用することはできません。データを挿入するには、SDO_RDF_TRIPLE_Sコンストラクタを使用します(1.5.1項を参照)。


注意:

URIが< >で、リテラルが" "で囲まれていなくても、文はそのまま処理されます。ただし、VALUE_TYPE値の判定に余分な処理が必要とされるため、文によるロードに時間がかかります。

次の例には、URI、空白ノード(nsuのmodel_idは4)、リテラル、言語タグ付きのリテラルおよび型付きリテラルを使用した文が含まれます。

INSERT INTO nsu_data VALUES (SDO_RDF_TRIPLE_S('nsu', '<http://nature.example.com/nsu/rss.rdf>',
  '<http://purl.org/rss/1.0/title>', '"Nature''s Science Update"'));
INSERT INTO nsu_data VALUES (SDO_RDF_TRIPLE_S('nsu', '_:BNSEQN1001A',
  '<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>',
  '<http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq>', 4));
INSERT INTO nsu_data VALUES (SDO_RDF_TRIPLE_S('nsu',
  '<http://nature.example.com/cgi-taf/dynapage.taf?file=/nature/journal/v428/n6978/index.html>',
  '<http://purl.org/dc/elements/1.1/language>', '"English”@en-GB'));
INSERT INTO nature VALUES (SDO_RDF_TRIPLE_S('nsu', '<http://dx.doi.org/10.1038/428004b>',
  '<http://purl.org/dc/elements/1.1/date>', '"2004-03-04"^^xsd:date'));

セマンティクXMLデータをINSERT文に変換するには、サンプルのrss2insert.xsl XSLTファイルを編集してセマンティク・データXMLファイルのすべての機能を変換します。空白ノード・コンストラクタは、空白ノードを含む文を挿入する場合に使用します。XSLTを編集したら、Xalan XSLTプロセッサ(http://xml.apache.org/xalan)をダウンロードし、そのインストール指示に従います。編集したバージョンのrss2insert.xslファイルを使用してセマンティク・データXMLファイルをINSERT文に変換するには、次の形式のコマンドを使用します。

java org.apache.xalan.xslt.Process –in input.rdf -xsl rss2insert.xsl –out output.nt

1.7.4 セマンティク・データのエクスポート

セマンティク・データをN-Triple形式のファイルに出力するには、NTripleConverter Javaクラスを使用します。NDM2NTriple(String, int)メソッドにより、指定したモデル用に格納されているすべてのトリプルをエクスポートできます。

NTriple converterクラスの使用方法の詳細は、Oracle Technology Networkからダウンロードできるsdordf_converter.zipファイル内のREADME.txtファイルを参照してください。

1.8 セマンティク・ネットワーク索引の作成および管理

セマンティク・ネットワーク索引は、一意でないBツリー索引です。セマンティク・ネットワーク索引を追加、変更および削除して、セマンティク・ネットワーク内のモデルやルール索引とともに使用できます。このような索引を使用すると、ネットワーク内のモデルやルール索引に対するSEM_MATCH問合せのパフォーマンスを調整できます。セマンティク・ネットワーク索引は、次のサブプログラムを使用して作成および管理できます。

これらのサブプログラムはすべて、index_codeパラメータを持ちます。このパラメータには、PCSMおよびOを任意の順序(繰返しなし)で含めることができます。index_code内で使用されたこれらの文字は、ビューSEMM_*およびSEMI_*の列P_VALUE_ID、CANON_END_NODE_ID、START_NODE_ID、MODEL_IDおよびEND_NODE_IDに対応しています。

SEM_APIS.ADD_SEM_INDEXプロシージャは、セマンティク・ネットワーク索引を作成します。これにより、既存のモデルおよびルール索引それぞれに対して、一意でないBツリー索引がUNUSABLEステータスで作成されます。この索引の名前はRDF_LNK_<index_code>_IDXとなり、索引の所有者はMDSYSとなります。この操作は、起動側にDBAロールがある場合にのみ許可されます。次の例では、キー<P_VALUE_ID, START_NODE_ID, CANON_END_NODE_ID, MODEL_ID>を使用してPSCM索引を作成しています。

EXECUTE SEM_APIS.ADD_SEM_INDEX('PSCM');

セマンティク・ネットワーク索引を作成した後、対応する一意でないBツリー索引はいずれもUNUSABLEステータスになります。これは、この索引を使用可能にすると、大量の時間とリソースが消費され、後続の索引のメンテナンス操作のパフォーマンスが低下する可能性があるためです。自分が所有する特定のモデルまたはルール索引に対してセマンティク・ネットワーク索引を使用可能または使用不能にするには、SEM_APIS.ALTER_SEM_INDEX_ON_MODELおよびSEM_APIS.ALTER_SEM_INDEX_ON_RULES_INDEXプロシージャをコールし、commandパラメータとして'REBUILD'または'UNUSABLE'を指定します。このように、様々なセマンティク・ネットワーク索引を使用可能および使用不能にして実験を重ねることにより、パフォーマンスの違いを確認できます。たとえば、次の文は、FAMILYモデルに対してPSCM索引を使用可能にします。

EXECUTE SEM_APIS.ALTER_SEM_INDEX_ON_MODEL('FAMILY','PSCM','REBUILD');

また、次の点にも注意してください。

1.9 セマンティク・データを使用するためのクイック・スタート

Oracle Databaseのセマンティク・データを操作するには、次の一般的な手順に従います。

  1. システム表の表領域を作成します。表領域を作成する適切な権限を持つユーザーとして接続している必要があります。次の例では、RDF_TBLSPACEという表領域を作成します。

    CREATE TABLESPACE rdf_tblspace
     DATAFILE '/oradata/orcl/rdf_tblspace.dat' SIZE 1024M REUSE
     AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED
     SEGMENT SPACE MANAGEMENT AUTO;
    
  2. セマンティク・データ・ネットワークを作成します。

    セマンティク・データ・ネットワークを作成すると、Oracle Databaseにセマンティク・データ・サポートが追加されます。十分な領域を備えた有効な表領域を指定することで、DBA権限を持つユーザーとしてセマンティク・データ・ネットワークを作成する必要があります。このネットワークは、1つのOracle Databaseに対して1回のみ作成します。

    次の例では、RDF_TBLSPACEという表領域を使用してセマンティク・データ・ネットワークを作成します(RDF_TBLSPACEはすでに存在している必要があります)。

    EXECUTE SEM_APIS.CREATE_SEM_NETWORK('rdf_tblspace');
    
  3. セマンティク・データの格納先となるスキーマを保有するデータベース・ユーザーとして接続します(SYS、SYSTEMまたはMDSYSとして接続している場合は、次の手順を実行しないでください)。

  4. セマンティク・データへの参照を格納する表を作成します。(この手順と残りの手順では、DBA権限を持つユーザーとして接続している必要はありません。)

    この表には、単一のモデルに関連付けられたすべてのデータへの参照を保持するSDO_RDF_TRIPLE_S型の列が含まれる必要があります。

    次の例では、ARTICLES_RDF_DATAという表を作成します。

    CREATE TABLE articles_rdf_data (id NUMBER, triple SDO_RDF_TRIPLE_S);
    
  5. モデルを作成します。

    モデルを作成する場合、モデル名、モデルのセマンティク・データへの参照を保持する表、およびその表内のSDO_RDF_TRIPLE_S型の列を指定します。

    次のコマンドでは、前の手順で作成した表を使用するARTICLESというモデルを作成します。

    EXECUTE SEM_APIS.CREATE_SEM_MODEL('articles', 'articles_rdf_data', 'triple');
    
  6. 可能であれば、アプリケーション表のSDO_RDF_TRIPLE_S列に対する直接問合せのパフォーマンスを向上するため、SELECT文のWHERE句で指定される条件にOracle Databaseの索引を作成します。(これらの索引は、SEM_MATCHテーブル・ファンクションが使用される場合には無視されます。)次の例では、このような索引を作成します。

    -- Create indexes on the subjects, properties, and objects
    -- in the ARTICLES_RDF_DATA table.
    CREATE INDEX articles_sub_idx ON articles_rdf_data (triple.GET_SUBJECT());
    CREATE INDEX articles_prop_idx ON articles_rdf_data (triple.GET_PROPERTY());
    CREATE INDEX articles_obj_idx ON articles_rdf_data (TO_CHAR(triple.GET_OBJECT()));
    

モデルを作成した後は、表にトリプルを挿入できます(1.10項の例を参照)。

1.10 セマンティク・データの例

この項には、次のPL/SQLの例が含まれます。

1.10.1 例: 雑誌記事の情報

この項では、雑誌記事に関する文のモデルに対応する簡単なPL/SQLの例を示します。例1-13には、説明的なコメント(この章で説明されている各概念を参照)と、複数のファンクションおよびプロシージャ(第3章を参照)が含まれます。

例1-13 雑誌記事の情報に関するモデルの使用

-- Basic steps:
-- After you have connected as a privileged user and called
-- SEM_APIS.CREATE_RDF_NETWORK to add RDF support,
-- connect as a regular database user and do the following.
-- 1. For each desired model, create a table to hold its data.
-- 2. For each model, create a model (SEM_APIS.CREATE_RDF_MODEL).
-- 3. For each table to hold semantic data, insert data into the table.
-- 4. Use various subprograms and consructors.

-- Create the table to hold data for the model.
CREATE TABLE articles_rdf_data (id NUMBER, triple SDO_RDF_TRIPLE_S);

-- Create the model.
EXECUTE SEM_APIS.CREATE_RDF_MODEL('articles', 'articles_rdf_data', 'triple');

-- Information to be stored about some fictitious articles:
-- Article1, titled "All about XYZ" and written by Jane Smith, refers
--   to Article2 and Article3.
-- Article2, titled "A review of ABC" and written by Joe Bloggs,
--   refers to Article3.
-- Seven SQL statements to store the information. In each statement:
-- Each article is referred to by its complete URI The URIs in
--   this example are fictitious.
-- Each property is referred to by the URL for its definition, as
--   created by the Dublin Core Metadata Initiative.

-- Insert rows into the table.

-- Article1 has the title "All about XYZ".
INSERT INTO articles_rdf_data VALUES (1,
  SDO_RDF_TRIPLE_S ('articles','http://nature.example.com/Article1',
    'http://purl.org/dc/elements/1.1/title','All about XYZ'));

-- Article1 was created (written) by Jane Smith.
INSERT INTO articles_rdf_data VALUES (2,
  SDO_RDF_TRIPLE_S ('articles','http://nature.example.com/Article1',
    'http://purl.org/dc/elements/1.1/creator',
    'Jane Smith'));

-- Article1 references (refers to) Article2.
INSERT INTO articles_rdf_data VALUES (3,
  SDO_RDF_TRIPLE_S ('articles',
    'http://nature.example.com/Article1',
    'http://purl.org/dc/terms/references',
    'http://nature.example.com/Article2'));

-- Article1 references (refers to) Article3.
INSERT INTO articles_rdf_data VALUES (4,
  SDO_RDF_TRIPLE_S ('articles',
    'http://nature.example.com/Article1',
    'http://purl.org/dc/terms/references',
    'http://nature.example.com/Article3'));

-- Article2 has the title "A review of ABC".
INSERT INTO articles_rdf_data VALUES (5,
  SDO_RDF_TRIPLE_S ('articles',
    'http://nature.example.com/Article2',
    'http://purl.org/dc/elements/1.1/title',
    'A review of ABC'));

-- Article2 was created (written) by Joe Bloggs.
INSERT INTO articles_rdf_data VALUES (6,
  SDO_RDF_TRIPLE_S ('articles',
    'http://nature.example.com/Article2',
    'http://purl.org/dc/elements/1.1/creator',
    'Joe Bloggs'));

-- Article2 references (refers to) Article3.
INSERT INTO articles_rdf_data VALUES (7,
  SDO_RDF_TRIPLE_S ('articles',
    'http://nature.example.com/Article2',
    'http://purl.org/dc/terms/references',
    'http://nature.example.com/Article3'));

COMMIT;

-- Query semantic data.

SELECT SEM_APIS.GET_MODEL_ID('articles') AS model_id FROM DUAL;

SELECT SEM_APIS.GET_TRIPLE_ID(
  'articles',
  'http://nature.example.com/Article2',
  'http://purl.org/dc/terms/references',
  'http://nature.example.com/Article3') AS RDF_triple_id FROM DUAL;

SELECT SEM_APIS.IS_TRIPLE(
  'articles',
  'http://nature.example.com/Article2',
  'http://purl.org/dc/terms/references',
  'http://nature.example.com/Article3') AS is_triple FROM DUAL;

-- Use SDO_RDF_TRIPLE_S member functions in queries.

SELECT a.triple.GET_TRIPLE() AS triple
  FROM articles_rdf_data a WHERE a.id = 1;
SELECT a.triple.GET_SUBJECT() AS subject
  FROM articles_rdf_data a WHERE a.id = 1;
SELECT a.triple.GET_PROPERTY() AS property
  FROM articles_rdf_data a WHERE a.id = 1;
SELECT a.triple.GET_OBJECT() AS object
  FROM articles_rdf_data a WHERE a.id = 1;

1.10.2 例: 家系の情報

この項では、ファミリ・ツリー(家系)情報に関する文のモデルに対応する簡単なPL/SQLの例を示します。例1-14には、説明的なコメント(この章で説明されている各概念を参照)と、複数のファンクションおよびプロシージャ(第3章を参照)が含まれます。

この例の家族関係は、図1-3のファミリ・ツリーを反映しています。また、この図では、例における一部の情報(CathyはJackの姉妹、JackとTomは男性、Cindyは女性)が直接言明されています。

図1-3 RDFの例のファミリ・ツリー

図1-3の説明が続きます。
「図1-3 RDFの例のファミリ・ツリー」の説明

例1-14 家系の情報に関するモデルの使用

-- Basic steps:
-- After you have connected as a privileged user and called
-- SEM_APIS.CREATE_RDF_NETWORK to enable RDF support,
-- connect as a regular database user and do the following.
-- 1. For each desired model, create a table to hold its data.
-- 2. For each model, create a model (SEM_APIS.CREATE_RDF_MODEL).
-- 3. For each table to hold semantic data, insert data into the table.
-- 4. Use various subprograms and constructors.

-- Create the table to hold data for the model.
CREATE TABLE family_rdf_data (id NUMBER, triple SDO_RDF_TRIPLE_S);

-- Create the model.
execute SEM_APIS.create_rdf_model('family', 'family_rdf_data', 'triple');

-- Insert rows into the table. These express the following information:
-----------------
-- John and Janice have two children, Suzie and Matt.
-- Matt married Martha, and they have two children:
--   Tom (male, height 5.75) and Cindy (female, height 06.00).
-- Suzie married Sammy, and they have two children:
--   Cathy (height 5.8) and Jack (male, height 6).

-- Person is a class that has two subslasses: Male and Female.
-- parentOf is a property that has two subproperties: fatherOf and motherOf.
-- siblingOf is a property that has two subproperties: brotherOf and sisterOf.
-- The domain of the fatherOf and brotherOf properties is Male.
-- The domain of the motherOf and sisterOf properties is Female.
------------------------

-- John is the father of Suzie.
INSERT INTO family_rdf_data VALUES (1,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/John',
'http://www.example.org/family/fatherOf',
'http://www.example.org/family/Suzie'));

-- John is the father of Matt.
INSERT INTO family_rdf_data VALUES (2,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/John',
'http://www.example.org/family/fatherOf',
'http://www.example.org/family/Matt'));

-- Janice is the mother of Suzie.
INSERT INTO family_rdf_data VALUES (3,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Janice',
'http://www.example.org/family/motherOf',
'http://www.example.org/family/Suzie'));

-- Janice is the mother of Matt.
INSERT INTO family_rdf_data VALUES (4,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Janice',
'http://www.example.org/family/motherOf',
'http://www.example.org/family/Matt'));

-- Sammy is the father of Cathy.
INSERT INTO family_rdf_data VALUES (5,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Sammy',
'http://www.example.org/family/fatherOf',
'http://www.example.org/family/Cathy'));

-- Sammy is the father of Jack.
INSERT INTO family_rdf_data VALUES (6,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Sammy',
'http://www.example.org/family/fatherOf',
'http://www.example.org/family/Jack'));

-- Suzie is the mother of Cathy.
INSERT INTO family_rdf_data VALUES (7,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Suzie',
'http://www.example.org/family/motherOf',
'http://www.example.org/family/Cathy'));

-- Suzie is the mother of Jack.
INSERT INTO family_rdf_data VALUES (8,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Suzie',
'http://www.example.org/family/motherOf',
'http://www.example.org/family/Jack'));

-- Matt is the father of Tom.
INSERT INTO family_rdf_data VALUES (9,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Matt',
'http://www.example.org/family/fatherOf',
'http://www.example.org/family/Tom'));

-- Matt is the father of Cindy
INSERT INTO family_rdf_data VALUES (10,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Matt',
'http://www.example.org/family/fatherOf',
'http://www.example.org/family/Cindy'));

-- Martha is the mother of Tom.
INSERT INTO family_rdf_data VALUES (11,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Martha',
'http://www.example.org/family/motherOf',
'http://www.example.org/family/Tom'));

-- Martha is the mother of Cindy.
INSERT INTO family_rdf_data VALUES (12,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Martha',
'http://www.example.org/family/motherOf',
'http://www.example.org/family/Cindy'));

-- Cathy is the sister of Jack.
INSERT INTO family_rdf_data VALUES (13,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Cathy',
'http://www.example.org/family/sisterOf',
'http://www.example.org/family/Jack'));

-- Jack is male.
INSERT INTO family_rdf_data VALUES (14,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Jack',
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
'http://www.example.org/family/Male'));

-- Tom is male.
INSERT INTO family_rdf_data VALUES (15,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Tom',
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
'http://www.example.org/family/Male'));

-- Cindy is female.
INSERT INTO family_rdf_data VALUES (16,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Cindy',
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
'http://www.example.org/family/Female'));

-- Person is a class.
INSERT INTO family_rdf_data VALUES (17,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Person',
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
'http://www.w3.org/2000/01/rdf-schema#Class'));

-- Male is a subclass of Person.
INSERT INTO family_rdf_data VALUES (18,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Male',
'http://www.w3.org/2000/01/rdf-schema#subClassOf',
'http://www.example.org/family/Person'));

-- Female is a subclass of Person.
INSERT INTO family_rdf_data VALUES (19,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Female',
'http://www.w3.org/2000/01/rdf-schema#subClassOf',
'http://www.example.org/family/Person'));

-- siblingOf is a property.
INSERT INTO family_rdf_data VALUES (20,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/siblingOf',
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
'http://www.w3.org/1999/02/22-rdf-syntax-ns#Property'));

-- parentOf is a property.
INSERT INTO family_rdf_data VALUES (21,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/parentOf',
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
'http://www.w3.org/1999/02/22-rdf-syntax-ns#Property'));

-- brotherOf is a subproperty of siblingOf.
INSERT INTO family_rdf_data VALUES (22,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/brotherOf',
'http://www.w3.org/2000/01/rdf-schema#subPropertyOf',
'http://www.example.org/family/siblingOf'));

-- sisterOf is a subproperty of siblingOf.
INSERT INTO family_rdf_data VALUES (23,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/sisterOf',
'http://www.w3.org/2000/01/rdf-schema#subPropertyOf',
'http://www.example.org/family/siblingOf'));

-- A brother is male.
INSERT INTO family_rdf_data VALUES (24,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/brotherOf',
'http://www.w3.org/2000/01/rdf-schema#domain',
'http://www.example.org/family/Male'));

-- A sister is female.
INSERT INTO family_rdf_data VALUES (25,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/sisterOf',
'http://www.w3.org/2000/01/rdf-schema#domain',
'http://www.example.org/family/Female'));

-- fatherOf is a subproperty of parentOf.
INSERT INTO family_rdf_data VALUES (26,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/fatherOf',
'http://www.w3.org/2000/01/rdf-schema#subPropertyOf',
'http://www.example.org/family/parentOf'));

-- motherOf is a subproperty of parentOf.
INSERT INTO family_rdf_data VALUES (27,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/motherOf',
'http://www.w3.org/2000/01/rdf-schema#subPropertyOf',
'http://www.example.org/family/parentOf'));

-- A father is male.
INSERT INTO family_rdf_data VALUES (28,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/fatherOf',
'http://www.w3.org/2000/01/rdf-schema#domain',
'http://www.example.org/family/Male'));

-- A mother is female.
INSERT INTO family_rdf_data VALUES (29,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/motherOf',
'http://www.w3.org/2000/01/rdf-schema#domain',
'http://www.example.org/family/Female'));

-- Use SET ESCAPE OFF to prevent the caret (^) from being
-- interpreted as an escape character. Two carets (^^) are
-- used to represent typed literals.
SET ESCAPE OFF;

-- Cathy's height is 5.8 (decimal).
INSERT INTO family_rdf_data VALUES (30,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Cathy',
'http://www.example.org/family/height',
'"5.8"^^xsd:decimal'));

-- Jack's height is 6 (integer).
INSERT INTO family_rdf_data VALUES (31,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Jack',
'http://www.example.org/family/height',
'"6"^^xsd:integer'));

-- Tom's height is 05.75 (decimal).
INSERT INTO family_rdf_data VALUES (32,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Tom',
'http://www.example.org/family/height',
'"05.75"^^xsd:decimal'));

-- Cindy's height is 06.00 (decimal).
INSERT INTO family_rdf_data VALUES (33,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/Cindy',
'http://www.example.org/family/height',
'"06.00"^^xsd:decimal'));

COMMIT;

-- RDFS inferencing in the family model
BEGIN
  SEM_APIS.CREATE_RULES_INDEX(
    'rdfs_rix_family',
    SEM_Models('family'),
    SEM_Rulebases('RDFS'));
END;
/

-- Select all males from the family model, without inferencing.
SELECT m
  FROM TABLE(SEM_MATCH(
    '(?m rdf:type :Male)',
    SEM_Models('family'),
    null,
    SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
    null));

-- Select all males from the family model, with RDFS inferencing.
SELECT m
  FROM TABLE(SEM_MATCH(
    '(?m rdf:type :Male)',
    SEM_Models('family'),
    SDO_RDF_Rulebases('RDFS'),
    SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
    null));

-- General inferencing in the family model

EXECUTE SEM_APIS.CREATE_RULEBASE('family_rb');

INSERT INTO mdsys.semr_family_rb VALUES(
  'grandparent_rule',
  '(?x :parentOf ?y) (?y :parentOf ?z)',
  NULL,
  '(?x :grandParentOf ?z)',
  SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')));

COMMIT;

-- Because a new rulebase has been created, and it will be used in the
-- rules index, drop the preceding rules index and then re-create it.
EXECUTE SEM_APIS.DROP_RULES_INDEX ('rdfs_rix_family');

-- Re-create the rules index.
BEGIN
  SEM_APIS.CREATE_RULES_INDEX(
    'rdfs_rix_family',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'));
END;
/

-- Select all grandfathers and their grandchildren from the family model,
-- without inferencing. (With no inferencing, no results are returned.)
SELECT x grandfather, y grandchild
  FROM TABLE(SEM_MATCH(
    '(?x :grandParentOf ?y) (?x rdf:type :Male)',
    SEM_Models('family'),
    null,
    SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
    null));

-- Select all grandfathers and their grandchildren from the family model.
-- Use inferencing from both the RDFS and family_rb rulebases.
SELECT x grandfather, y grandchild
  FROM TABLE(SEM_MATCH(
    '(?x :grandParentOf ?y) (?x rdf:type :Male)',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'),
    SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
    null));

-- Set up to find grandfathers of tall (>= 6) grandchildren
-- from the family model, with RDFS inferencing and
-- inferencing using the "family_rb" rulebase.

UPDATE mdsys.semr_family_rb SET
  antecedents = '(?x :parentOf ?y) (?y :parentOf ?z) (?z :height ?h)',
  filter = '(h >= 6)',
  aliases = SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/'))
WHERE rule_name = 'GRANDPARENT_RULE';

-- Because the rulebase has been updated, drop the preceding rules index,
-- and then re-create it.
EXECUTE SEM_APIS.DROP_RULES_INDEX ('rdfs_rix_family');

-- Re-create the rules index.
BEGIN
  SEM_APIS.CREATE_RULES_INDEX(
    'rdfs_rix_family',
    SEM_Models('family'),
    SEM_Rulebases('RDFS','family_rb'));
END;
/

-- Find the rules index that was just created (that is, the
-- one based on the specified model and rulebases).
SELECT SEM_APIS.LOOKUP_RULES_INDEX(SEM_MODELS('family'),
  SEM_RULEBASES('RDFS','family_rb')) AS lookup_rules_index FROM DUAL;

-- Select grandfathers of tall (>= 6) grandchildren, and their
-- tall grandchildren.
SELECT x grandfather, y grandchild
  FROM TABLE(SEM_MATCH(
    '(?x :grandParentOf ?y) (?x rdf:type :Male)',
    SEM_Models('family'),
    SEM_RuleBases('RDFS','family_rb'),
    SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
    null));

1.11 セマンティク・テクノロジ・サポートの必須手順

Oracleセマンティク・テクノロジ・サポートに関連するタイプ、シノニムまたはPL/SQLパッケージを使用する前に、DBA権限を持つユーザーとしてデータベースに接続し、SQL*Plusを起動して、必要に応じて次のいずれかのスクリプトを実行する必要があります。


注意:

Oracle Databaseリリース10.2からアップグレードする場合で、リリース10.2のRDFデータが存在するものの、そのRDFデータを移行しないときは、catsem10i.sqlスクリプトを実行する前に次の操作を実行する必要があります。
  • RDFネットワークを削除します。

  • ユーザー表のSDO_RDF_TRIPLE_S型とSDO_RDF_TRIPLE型のすべての列を削除します。


catsem10i.sqlスクリプトは、包括的なツールであり、インストール操作およびリリース10.2形式からリリース11形式への(必要に応じた)RDFデータの移行操作を両方とも処理します。リリース10.2のRDFネットワークがすでに存在する場合、このスクリプトは必須です。ただし、既存のリリース10.2のRDFネットワークに大量のRDFデータが含まれる場合は、実行するのに時間がかかる可能性があります。

catsem11i.sqlスクリプトは、リリース11.1を新規インストールする場合、またはリリース10.2からのアップグレードにおいて、既存のRDFネットワークが存在せず、ユーザー表のSDO_RDF_TRIPLE_S型またはSDO_RDF_TRIPLE型の列も存在しない場合に適切です。

リリース10.2のRDFネットワークが存在する場合や、リリース10.2のRDF型であるSDO_RDF_TRIPLE_SまたはSDO_RDF_TRIPLEに対する依存性が存在する場合、catsem11i.sqlスクリプトはエラーとともに終了します。その場合は、リリース10.2のRDFサポートの使用を継続し、後でアップグレードの準備ができた段階でcatsem10i.sqlスクリプトを実行できます。

1.12 パーティショニングおよび高度な圧縮の要件

RDFおよびOWLの機能を使用する前に、パーティショニングおよび高度な圧縮のオプションを有効にする必要があります。

パーティショニングおよび高度な圧縮に関するライセンス情報は、『Oracle Databaseライセンス情報』を参照してください。パーティショニングの使用に関する情報は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

1.13 以前のOracle Databaseリリースへのダウングレード

Oracle Databaseリリース10.2にダウングレードする必要がある場合で、Oracle Databaseリリース11のRDFまたはOWL機能をすでに使用しており、既存のセマンティク・データおよびルールベースを保存する場合、ダウングレードを準備する文を実行してからダウングレードを実行し、次にセマンティク・データをリストアする別の文を実行する必要があります。

ただし、次の考慮事項が適用されます。

次の手順を実行します。

  1. データベースのダウングレードの前に、SYSDBA権限を持つSYSユーザーとしてリリース11のデータベースに接続します(SYS AS SYSDBAを使用して接続し、プロンプトが表示されたらSYSアカウントのパスワードを入力します)。

  2. SQL*Plusを起動し、次の文を入力します。

    EXECUTE SDO_SEM_DOWNGRADE.PREPARE_DOWNGRADE_FROM_11;
    

    この文の実行に成功すると、既存のすべてのセマンティク・データとルールベースが保存されます。これらのセマンティク・データは、データベースのダウングレード後にリストアします。

  3. データベースのダウングレードを実行します。

  4. Oracle Technology Networkサイトの「Semantic Technologies」ページからsdosemdgu.plbというファイルをダウンロードします。

  5. 現在使用中のOracle Databaseリリース10.2のリリース番号が10.2.0.1の場合にのみ、「Software」リンクをクリックし、RDF固有のパッチをダウンロードしてインストールします。(リリース10.2.0.1にはセマンティク・データをリストアするためのバッチ・ロード機能が含まれていないため、このパッチが必要です。)

  6. SYSDBA権限を持つSYSユーザーとしてリリース10.2のデータベースに接続します。

  7. SQL*Plusを起動し、次の文を入力します。

    EXECUTE SDO_SEM_DOWNGRADE_UTL.PREPARE_DOWNGRADE_TO_102('<tablespace-name>');
    

    <tablespace-name>は、RDFネットワークを作成する表領域の名前です。

    この文の実行に成功すると、ダウングレード前に保存したすべてのセマンティク・データがリストアされ、使用できるようになります。

1.14 セマンティク・テクノロジ用のソフトウェアの名前変更

Oracle Databaseリリース11.1では、セマンティク・データのサポートが元のRDFの対象範囲を超えて拡張されているため、多くのソフトウェア・オブジェクト(PL/SQLパッケージ、ファンクションおよびプロシージャ、システム表およびビューなど)の名前が変更されています。ほとんどの場合、この変更で文字列RDFSEMに置換されていますが、SDO_RDFSEMに置換されている場合もあります。

リリース11.1より前の名前を使用しているすべての有効なコードは、引き続き動作します。既存のアプリケーションに障害は発生しません。ただし、古いアプリケーションは変更して新しいオブジェクト名を使用することをお薦めします。新規アプリケーションでは新しい名前を使用してください。このマニュアルでは、新しい名前のみを記載しています。

表1-12に、セマンティク・テクノロジのサポートに関連する一部のオブジェクトの旧名と新規名を、旧名のアルファベット順に示します。

表1-12 セマンティク・テクノロジのソフトウェア・オブジェクト: 旧名と新規名

旧名 新規名

RDF_ALIASデータ型

SEM_ALIAS

RDF_MODEL$ビュー

SEM_MODEL$

RDF_RULEBASE_INFOビュー

SEM_RULEBASE_INFO

RDF_RULES_INDEX_DATASETSビュー

SEM_RULES_INDEX_DATASETS

RDF_RULES_INDEX_INFOビュー

SEM_RULES_INDEX_INFO

RDFI_rules-index-nameビュー

SEMI_rules-index-name

RDFM_model-nameビュー

SEMM_model-name

RDFR_rulebase-nameビュー

SEMR_rulebase-name

SDO_RDFパッケージ

SEM_APIS

SDO_RDF_INFERENCEパッケージ

SEM_APIS

SDO_RDF_MATCHテーブル・ファンクション

SEM_MATCH

SDO_RDF_MODELSデータ型

SEM_MODELS

SDO_RDF_RULEBASESデータ型

SEM_RULEBASES