この章では、セマンティク・テクノロジのサポート、特にResource Description Framework(RDF)およびWeb Ontology Language(OWL)のサブセットのサポートについて説明します。ここでは、読者がRDFおよびOWLに関する主要な概念({主語、述語、目的語}のトリプル、URI、空白ノード、プレーン・リテラル、型付きリテラル、オントロジなど)についてよく理解していることを前提とします。この章では、これらの概念に関する詳細な説明を省くかわりに、各概念がどのようにOracleに実装されているかについて重点的に解説します。
RDFの概念に関する優れた解説は、http://www.w3.org/TR/rdf-primer/
にあるWorld Wide Web Consortium(W3C)の「RDF Primer」を参照してください。
OWLの詳細は、http://www.w3.org/TR/owl-ref/
にある「OWL Web Ontology Language Reference」を参照してください。
セマンティク・データを操作するための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パッケージ、ファンクションおよびプロシージャ、システム表およびビューなど)の名前が変更されています。ほとんどの場合、この変更で文字列RDFがSEMに置換されています。ただし、以前のリリースの有効な名前を使用している既存のアプリケーションは、引き続き動作します。詳細は、1.14項を参照してください。 |
Spatial、パーティショニングおよび高度な圧縮: Oracle Spatialは、RDFおよびOWLの機能を使用する前にインストールする必要があります。1.12項の説明にあるとおり、パーティショニングおよび高度な圧縮の機能も有効にする必要があります。 |
Oracle Databaseでは、セマンティク・データとオントロジを格納し、セマンティク・データを問い合せることや、エンタープライズ・リレーショナル・データに対してオントロジ支援問合せを実行することができます。また、付属の推論またはユーザー定義の推論を使用して、セマンティク・データに対する問合せ機能を拡張することも可能です。図1-1に、これらの機能の相互関係を示します。
図1-1に示されているとおり、データベースには、セマンティク・データおよびオントロジ(RDF/OWLモデル)に加え、従来のリレーショナル・データが含まれます。セマンティク・データをロードするには、バルク・ロードが最も効率的な方法ですが、トランザクション型のINSERT文を使用してデータを増分ロードすることも可能です。
セマンティク・データおよびオントロジは問合せ可能です。また、セマンティク・データや従来のリレーショナル・データに対してオントロジ支援問合せを実行し、セマンティク関係を検出することもできます。オントロジ支援問合せを実行するには、SEM_RELATED演算子を使用します(2.3項を参照)。
セマンティク・データに対する問合せ機能は、推論を使用して拡張できます。推論では、ルールベースのルールを使用します。推論により、データおよびルールに基づいて論理的な推測を行うことができます。推論でルールおよびルールベースを使用する方法の詳細は、1.3.6項を参照してください。
セマンティク・データには、その形式意味論に加え、有向グラフを使用して効率的にモデル化される単純なデータ構造が含まれます。メタデータ文は、トリプルとして表現されます。ノードはトリプルの2つの部分を示すために使用され、3番目の部分はノード間の関係を記述する有向リンクによって示されます。トリプルは、セマンティク・データ・ネットワークに格納されます。また、データベース・ユーザーにより作成された特定のセマンティク・データ・モデルに関する情報も保持されます。ユーザーに作成されたモデルは、モデル名を持ち、指定した表の列に格納されたトリプルを示します。
文は、{主語(リソース)、述語(プロパティ)、目的語(値)}のトリプルで表現されます。このマニュアルでは、{主語、プロパティ、目的語}を使用してトリプルを記述します。文という用語とトリプルという用語は、同義的に使用される場合があります。各トリプルは、特定のドメインに関する完全で一意のファクトであり、有向グラフのリンクで表現されます。
データベースに格納されるすべてのセマンティク・データに対して、単一の場所が用意されます。すべてのトリプルは、解析され、MDSYSスキーマの表内のエントリとしてシステムに格納されます。{主語、プロパティ、目的語}のトリプルは、1つのデータベース・オブジェクトとして処理されます。そのため、複数のトリプルを含む単一の文書は、複数のデータベース・オブジェクトになります。
トリプルのすべての主語および目的語は、セマンティク・データ・ネットワークのノードにマップされます。プロパティは、主語を開始ノード、目的語を終了ノードとするネットワーク・リンクにマップされます。使用可能なノード・タイプは、空白ノード、URI、プレーン・リテラルおよび型付きリテラルです。
URIの指定とデータベースへのセマンティク・データの格納には、次の要件が適用されます。
主語は、URIまたは空白ノードである必要があります。
プロパティは、URIである必要があります。
目的語は、URI、空白ノードまたはリテラルのいずれのタイプでもかまいません。(ただし、NULL値およびNULL文字列はサポートされません。)
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値にマップされるとはかぎりません。 |
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列に格納されたテキスト情報のタイプ。使用される値は、 |
VNAME_PREFIX |
VARCHAR2(4000) |
字句の値の長さが4000バイト以下の場合、この列に字句の値の一部である接頭辞が格納されます。接頭辞の計算には、SEM_APIS.VALUE_NAME_PREFIXファンクションを使用できます。たとえば、山カッコを除く字句 |
VNAME_SUFFIX |
VARCHAR2(512) |
字句の値の長さが4000バイト以下の場合、この列に字句の値の一部である接尾辞が格納されます。接尾辞の計算には、SEM_APIS.VALUE_NAME_SUFFIXファンクションを使用できます。VNAME_PREFIX列の説明に記載されている字句の値の場合、接尾辞は |
LITERAL_TYPE |
VARCHAR2(4000) |
型付きリテラルの場合は型情報、それ以外の場合はNULL。たとえば、1999-08-16という作成日を示す行の場合、VALUE_TYPE列には |
LANGUAGE_TYPE |
VARCHAR2(80) |
言語タグ付きのリテラル(つまり、VALUE_TYPEが |
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列の値を連結したものになります。 |
重複するトリプルはデータベースに格納されません。あるトリプルが既存のトリプルと重複していないかどうかをチェックするため、新規トリプルの主語、プロパティおよび目的語は、指定したモデルのトリプル値と照合されます。新規の主語、プロパティおよび目的語がすべて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$表で最初に出現するリテラルは、正規形として扱われ、それぞれCPL
、CPL@
、CTL
、CPLL
、CPLL@
またはCTLL
というVALUE_TYPE値が適切に割り当てられます(つまり、正規形の場合は実際の値タイプにC
という接頭辞が付けられます)。以前挿入されたリテラルと同じ正規形を持つ(ただし異なる字句表現の)リテラルがRDF_VALUE$表に挿入されると、その新しい挿入に対してそれぞれPL
、PL@
、TL
、PLL
、PLL@
またはTLL
というVALUE_TYPE値が適切に割り当てられます。
したがって、正規化後に等価となる異なる字句表現を持つテキスト値は、RDF_VALUE$表に格納されますが、正規化後に等価となるトリプルはデータベースに格納されません。
RDFの主語と目的語は、セマンティク・データ・ネットワークのノードにマップされます。主語のノードはリンクの開始ノードで、目的語のノードはリンクの終了ノードです。リテラル以外のノード(URIや空白ノード)は、主語および目的語のノードとして使用できます。リテラルは、目的語のノードとしてのみ使用できます。
空白ノードは、セマンティク・ネットワークの主語および目的語のノードとして使用できます。空白ノード識別子は、1つのセマンティク・モデル内を有効範囲とする点において、URIとは異なります。つまり、単一のセマンティク・モデル内に同じ空白ノード識別子が複数出現した場合、それらは常に同じリソースを示しますが、異なる2つのセマンティク・モデル内に同じ空白ノード識別子が出現した場合、それらは同じリソースを示しません。
Oracleセマンティク・ネットワークにおいて、この動作は、空白ノードは常に1つのセマンティク・モデル内で再利用され、2つの異なるモデル間では再利用されない(つまり、同じ空白ノード識別子が使用される場合は同じリソースを表している)という要件の適用によりモデル化されます。このため、空白ノードを含むトリプルをモデルに挿入する場合、空白ノードの再利用をサポートするSDO_RDF_TRIPLE_Sコンストラクタを使用する必要があります。
プロパティは、開始ノード(主語)と終了ノード(目的語)を備えたリンクにマップされます。したがって、1つのリンクは完全なトリプルを表します。
トリプルがモデルに挿入されると、主語、プロパティおよび目的語のテキスト値について、それらがすでにデータベースに存在するかどうかがチェックされます。他のモデルの以前の文に基づくテキスト値がすでに存在する場合、新規エントリは作成されません。テキスト値が存在しない場合、RDF_VALUE$表(1.3.2項を参照)に新規行が挿入されます。
推論は、ルールに基づいて論理的な推測を行う機能です。推論により、文字列などの値に基づく構文的な一致機能ではなく、データの各要素間の意味的な関係に基づいてセマンティクな一致機能を実行する問合せを作成できます。推論では、ルールベースに格納されたルールを使用します。ルールには、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) |
|
例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項を参照してください。
ルール索引は、指定したルールベースのセットを指定したモデルのセットに適用することで推論できる計算済のトリプルを含むオブジェクトです。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) |
|
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) |
ルール索引に含まれるデータのタイプ。たとえば、 |
DATA_NAME |
VARCHAR2(25) |
DATA_TYPE列に含まれるタイプのオブジェクトの名前 |
例1-3では、family
モデルとRDFS
およびfamily_rb
ルールベースを使用して、family_rb_rix_family
というルール索引を作成します。(この例は、1.10.2項の例1-14からの抜粋です。)
仮想モデルとは、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) |
|
MODEL_COUNT |
NUMBER |
仮想モデル内のモデルの数。 |
RULEBASE_COUNT |
NUMBER |
仮想モデルに使用されるルールベースの数。 |
RULES_INDEX_COUNT |
NUMBER |
仮想モデル内のルール索引の数。 |
すべてのオブジェクト(モデル、ルールベースおよびルール索引)に関する情報は、MDSYS.SEM_VMODEL_DATASETSビューに保持されます。表1-7に、このビューの列を示します(1つの行がすべての列の値の一意の組合せに対応します)。
セマンティク・データを使用する場合、次のデータベース・セキュリティの考慮事項が適用されます。
モデルまたはルール索引を作成すると、関連ビューに対するGRANTオプション付きのSELECT権限が所有者に付与されます。これらのビューに対してSELECT権限を持つユーザーは、関連モデルまたはルール索引に対してSEM_MATCH問合せを実行できます。
ルールベースを作成すると、ルールベースに対するGRANTオプション付きのSELECT、INSERT、UPDATEおよびDELETE権限が所有者に付与されます。ルールベースに対してSELECT権限を持つユーザーは、ルールベースを含むルール索引を作成できます。INSERT、UPDATEおよびDELETE権限により、ルールベースを変更できるユーザーと、その変更方法が制御されます。
モデルに対してデータ操作言語(DML)の操作を実行する場合、ユーザーは対応する実表に対するDML権限を持っている必要があります。
モデルに対応する実表の作成者は、他のユーザーに権限を付与できます。
ルールベースに対してデータ操作言語(DML)の操作を実行する場合、ユーザーは対応するデータベース・ビューに対する適切な権限を持っている必要があります。
モデルの作成者は、対応するデータベース・ビューに対するSELECT権限を他のユーザーに付与できます。
ユーザーは、対応するデータベース・ビューに対するSELECT権限を持っているモデルのみを問い合せることができます。
モデルまたはルールベースを削除できるのは、その作成者のみです。
Oracle Databaseでは、セマンティク・データに関連するメタデータを保持するために、MDSYSスキーマで複数の表およびビューが管理されます。(これらの表およびビューの一部は、1.9項に記載されているSEM_APIS.CREATE_SEM_NETWORKプロシージャによって作成され、一部は必要な場合にのみ作成されます。)表1-11に、これらの表およびビューをアルファベット順に示します。(また、Oracleで内部的に使用するためにいくつかの表およびビューも作成されますが、それらの表およびビューにはDBA権限を持つユーザーのみがアクセスできます。)
表1-11 セマンティク・メタデータ表およびビュー
名前 | 含まれる情報 | 参照先 |
---|---|---|
RDF_VALUE$ |
文を表すのに使用される主語、プロパティおよび目的語 |
|
SEM_MODEL$ |
データベースに定義されているすべてのモデル |
|
SEMM_model-name |
指定したモデルのトリプル |
|
SEM_RULEBASE_INFO |
ルールベース |
|
SEM_RULES_INDEX_DATASETS |
ルール索引で使用されるデータベース・オブジェクト |
|
SEM_RULES_INDEX_INFO |
ルール索引 |
|
SEM_VMODEL_INFO |
仮想モデル |
|
SEM_VMODEL_DATASETS |
仮想モデルで使用されるデータベース・オブジェクト |
|
SEMI_rules-index-name |
指定したルール索引のトリプル |
|
SEMR_rulebase-name |
指定したルールベースのルール |
|
SEMU_virtual-model-name |
仮想モデル内の一意のトリプル |
|
SEMV_virtual-model-name |
仮想モデル内のトリプル |
|
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>
次のコンストラクタ書式は、トリプルをモデル表に挿入する場合に使用できます。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番目のコンストラクタ書式を使用してトリプルを挿入します。
次のコンストラクタ書式は、空白ノードを参照するトリプルをモデル表に挿入する場合に使用できます。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番目のコンストラクタ書式を使用して、主語で空白ノードを再利用するトリプルを挿入します。
セマンティク・データを問い合せるには、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
属性は、問合せの結果に影響を与えることのできるオプションを指定します。オプションは、キーワードと値のペアで表記します。次のオプションがサポートされています。
ALLOW_DUP=T
は、セマンティク・モデルと推論データ(適用可能な場合)のUNIONではなくUNION ALLを実行する、基礎となるSQL文を生成します。このオプションを使用した場合、結果セットに追加の行(重複するトリプル)が生成されるために、それに応じてアプリケーション・ロジックを調整する必要があることがあります。このオプションを指定しない場合、すべてのモデルと推論データにわたって、重複するトリプルは自動的に削除され、マージされたRDFグラフの設定済セマンティクが保持されます。ただし、重複するトリプルを削除すると、問合せの処理時間が長くなります。一般に、1つのSEM_MATCH問合せに複数のセマンティク・モデルが関連している場合、'ALLOW_DUP=T'
を指定することで、パフォーマンスが大幅に向上します。
仮想モデルを問い合せる場合、ALLOW_DUP=T
を指定すると、SEMV_vm_nameビューが問合せされます。指定しない場合、SEMU_vm_nameビューが問合せされます。
HINT0={<hint-string>}
(発音および表記は"hint(ヒント)"と数字のゼロ)は、1つ以上のキーワードを、問合せの実行計画および結果に影響を与えるヒントとともに指定します。概念的には、n個のトリプル・パターンを持つグラフ・パターンで、m個の固有の変数を参照した場合、(n+m)方向の結合となります。つまり、ターゲットRDFモデルおよび対応するルール索引(オプション)のn方向の自己結合が実行された後、値からm個の変数を検索するために、RDF_VALUE$でm個の結合が実行されます。ヒント指定は、問合せ実行で使用される結合順序と結合タイプに影響を与えます。
ヒント指定<hint-string>では、キーワードを使用します。一部のキーワードは、問合せで使用される各トリプル・パターンおよび変数ごとに、一連(一群)の別名または参照で構成されるパラメータを持ちます。トリプル・パターンの別名の形式は、tiです。iは、問合せ内のトリプル・パターンの0から始まる序数です。たとえば、問合せ内の最初のトリプル・パターンの別名はt0
で、2番目のトリプル・パターンの別名はt1
、...のようになります。問合せで使用される変数の別名は単に、その変数の名前です。このため、ヒント指定では、グラフ・パターンで使用される変数?x
の別名として?x
が使用されます。
問合せの実行計画に影響を与えるために使用するヒントには、LEADING(<sequence of aliases>)、USE_NL(<set of aliases>)、USE_HASH(<set of aliases>)およびINDEX(<alias> <index_name>)があります。問合せの結果に影響を与えるために使用するヒントには、GET_CANON_VALUE(<set of aliases for variables>)があります。このヒントを使用すると、参照される変数に対して返される値は必ず正規字句形式になります。これらのヒントの書式と基本的な意味は、SQL文のヒントと同じです(『Oracle Database SQL言語リファレンス』を参照)。
例1-9に、SEM_MATCH問合せで使用されるHINT0オプションを示します。
SEM_MATCHテーブル・ファンクションでは、入力変数に応じた要素とともにANYDATASET型のオブジェクトが戻されます。次の説明において、varは問合せで使用される変数名を示します。
リテラルを指定可能な変数varごとに(つまり、問合せパターンの目的語の位置にのみ出現する変数ごとに)、結果要素には属性var、var$RDFVID、var$_PREFIX, var$_SUFFIX, var$RDFVTYP、var$RDFCLOB、var$RDFLTYP、var$RDFVID、var$_PREFIX、var$_SUFFIXおよびvar$RDFLANGが含まれます。
リテラル値を指定できない変数varごとに、結果要素にはvarおよびvar$RDFVTYPという属性が含まれます。
このような場合、varは変数にバインドされた字句の値を保持し、var$RDFVIDは変数にバインドされた値のVALUE_IDを持ちます。var$_PREFIXおよびvar$_SUFFIXは、変数にバインドされた値の接頭辞と接尾辞です。var$RDFVTYPは、変数にバインドされた値のタイプ(URI
、LIT
[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では、RDFS
とfamily_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
オントロジを使用して、Proteins
とComplexes
の両方に属するすべての化学的複合タイプを取得します。
例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
は、同じ語に一致する必要があるため、Proteins
とComplexes
の両方のサブクラスである必要があります。
SEM_RELATED演算子を使用してOWLオントロジを問い合せる方法の詳細は、2.3項を参照してください。
複数のモデルを問い合せる場合、または1つ以上のモデルおよびそれに対応するルール索引を問い合せる場合、パフォーマンスの向上のため、仮想モデルを使用することを考慮してください(1.3.8項を参照)。
関連するルール索引のステータスが無効の場合でも、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
を指定すると、ルール索引の実際のステータス(無効、不完全または有効)にかかわらず問合せが実行されます。
ただし、ルール索引のステータスが不完全または無効の場合、次の考慮事項が適用されます。
ステータスが不完全の場合、ルール索引の内容は近似値となる可能性があります。基礎となるモデルに最近挿入されて推論可能となったいくつかのトリプルは、実際にはルール索引に存在しないことがあり、したがって問合せにより戻される結果は不正確となる可能性があるためです。
ステータスが無効の場合、ルール索引の内容は近似値となる可能性があります。基礎となるモデルまたはルールベース(あるいはその両方)が最近変更されて推論不可能となったいくつかのトリプルは、まだルール索引に存在することがあり、したがって問合せにより戻される結果の正確性が影響を受ける可能性があるためです。推論不可能となったトリプルが存在する可能性に加え、一部の推論可能な行が実際にはルール索引に存在しない可能性もあります。
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)}'));
中カッコを含む構文を使用してグラフ・パターンを表現した場合、次のようになります。
セマンティク・データをモデルにロードするには、次の1つ以上のオプションを使用します。
バルク・ロード: SQL*Loaderのダイレクト・パス・ロードを使用してN-Triple形式のデータをステージング表に取得し、次にPL/SQLプロシージャを使用してセマンティク・データ・ストアにデータをロードまたは追加します(1.7.1項を参照)。
このオプションは、大量のデータをロードする場合の最も高速な方法ですが、4000バイトを超える目的語の値を含むトリプルは処理できません。
バッチ・ロード: Javaクライアント・インタフェースを使用してN-Triple形式のファイルのデータをセマンティク・データ・ストアにロードまたは追加します(1.7.2項を参照)。
このオプションは、バルク・ロードより低速ですが、4000バイトを超える目的語の値を含むトリプルも処理できます。
SDO_RDF_TRIPLE_SコンストラクタをコールするSQL INSERT文を使用した表へのロード(1.7.3項を参照)。
セマンティク・データをエクスポートするには、1.7.4項に記載されているJava APIを使用します。
ステージング表を使用して、セマンティク・データ(およびオプションでセマンティク・データ以外の関連データ)をバルク・ロードできます。データは、最初に解析して構文の正確性をチェックしてからステージング表にロードする必要があります。次に、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バイトを超える目的語の値を含むトリプルは、次の方法を使用することでロードできます。
SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャを使用して、ステージング表に格納可能なすべての行をロードします。
N-Triple形式のファイルから残りの行(SQL*Loaderでサンプルの制御ファイルを使用した場合に拒否される行)をロードします(1.7.2項を参照)。
起動側のスキーマに表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;
バッチ・ロード操作を実行するには、<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である場合、そのファイルの解凍とロードが同時に実行されます。
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
セマンティク・データをN-Triple形式のファイルに出力するには、NTripleConverter
Javaクラスを使用します。NDM2NTriple(String, int)
メソッドにより、指定したモデル用に格納されているすべてのトリプルをエクスポートできます。
NTriple converter
クラスの使用方法の詳細は、Oracle Technology Networkからダウンロードできるsdordf_converter.zip
ファイル内のREADME.txt
ファイルを参照してください。
セマンティク・ネットワーク索引は、一意でないBツリー索引です。セマンティク・ネットワーク索引を追加、変更および削除して、セマンティク・ネットワーク内のモデルやルール索引とともに使用できます。このような索引を使用すると、ネットワーク内のモデルやルール索引に対するSEM_MATCH問合せのパフォーマンスを調整できます。セマンティク・ネットワーク索引は、次のサブプログラムを使用して作成および管理できます。
これらのサブプログラムはすべて、index_codeパラメータを持ちます。このパラメータには、P
、C
、S
、M
および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つに、この項に示したサブプログラムをコールするときにindex_code
を'PSCF'
と指定することで管理できる索引があります。
新規のモデルまたは新規のルール索引を作成すると、セマンティク・ネットワーク索引ごとに一意でない新規のBツリー索引が作成されます。このようなBツリー索引はいずれも、USABLEステータスになります。
(index_code
値に'M'を含めることにより)セマンティク・ネットワーク索引キーにMODEL_ID列を含めると、問合せのパフォーマンスが向上することがあります。特に、仮想モデルを使用する場合はこの操作が有効です。
Oracle Databaseのセマンティク・データを操作するには、次の一般的な手順に従います。
システム表の表領域を作成します。表領域を作成する適切な権限を持つユーザーとして接続している必要があります。次の例では、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;
セマンティク・データ・ネットワークを作成します。
セマンティク・データ・ネットワークを作成すると、Oracle Databaseにセマンティク・データ・サポートが追加されます。十分な領域を備えた有効な表領域を指定することで、DBA権限を持つユーザーとしてセマンティク・データ・ネットワークを作成する必要があります。このネットワークは、1つのOracle Databaseに対して1回のみ作成します。
次の例では、RDF_TBLSPACEという表領域を使用してセマンティク・データ・ネットワークを作成します(RDF_TBLSPACEはすでに存在している必要があります)。
EXECUTE SEM_APIS.CREATE_SEM_NETWORK('rdf_tblspace');
セマンティク・データの格納先となるスキーマを保有するデータベース・ユーザーとして接続します(SYS、SYSTEMまたはMDSYSとして接続している場合は、次の手順を実行しないでください)。
セマンティク・データへの参照を格納する表を作成します。(この手順と残りの手順では、DBA権限を持つユーザーとして接続している必要はありません。)
この表には、単一のモデルに関連付けられたすべてのデータへの参照を保持するSDO_RDF_TRIPLE_S型の列が含まれる必要があります。
次の例では、ARTICLES_RDF_DATAという表を作成します。
CREATE TABLE articles_rdf_data (id NUMBER, triple SDO_RDF_TRIPLE_S);
モデルを作成します。
モデルを作成する場合、モデル名、モデルのセマンティク・データへの参照を保持する表、およびその表内のSDO_RDF_TRIPLE_S型の列を指定します。
次のコマンドでは、前の手順で作成した表を使用するARTICLESというモデルを作成します。
EXECUTE SEM_APIS.CREATE_SEM_MODEL('articles', 'articles_rdf_data', 'triple');
可能であれば、アプリケーション表の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項の例を参照)。
この項には、次のPL/SQLの例が含まれます。
この項では、雑誌記事に関する文のモデルに対応する簡単な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;
この項では、ファミリ・ツリー(家系)情報に関する文のモデルに対応する簡単なPL/SQLの例を示します。例1-14には、説明的なコメント(この章で説明されている各概念を参照)と、複数のファンクションおよびプロシージャ(第3章を参照)が含まれます。
この例の家族関係は、図1-3のファミリ・ツリーを反映しています。また、この図では、例における一部の情報(CathyはJackの姉妹、JackとTomは男性、Cindyは女性)が直接言明されています。
例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));
Oracleセマンティク・テクノロジ・サポートに関連するタイプ、シノニムまたはPL/SQLパッケージを使用する前に、DBA権限を持つユーザーとしてデータベースに接続し、SQL*Plusを起動して、必要に応じて次のいずれかのスクリプトを実行する必要があります。
データ移行を伴うアップグレード: $ORACLE_HOME/md/admin/catsem10i.sql
新規インストール: $ORACLE_HOME/md/admin/catsem11i.sql
注意: Oracle Databaseリリース10.2からアップグレードする場合で、リリース10.2のRDFデータが存在するものの、そのRDFデータを移行しないときは、catsem10i.sql スクリプトを実行する前に次の操作を実行する必要があります。
|
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
スクリプトを実行できます。
RDFおよびOWLの機能を使用する前に、パーティショニングおよび高度な圧縮のオプションを有効にする必要があります。
パーティショニングおよび高度な圧縮に関するライセンス情報は、『Oracle Databaseライセンス情報』を参照してください。パーティショニングの使用に関する情報は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。
Oracle Databaseリリース10.2にダウングレードする必要がある場合で、Oracle Databaseリリース11のRDFまたはOWL機能をすでに使用しており、既存のセマンティク・データおよびルールベースを保存する場合、ダウングレードを準備する文を実行してからダウングレードを実行し、次にセマンティク・データをリストアする別の文を実行する必要があります。
ただし、次の考慮事項が適用されます。
伴意グラフ・データは保存されません(Oracle Databaseリリース10.2のRDF推論APIを使用して同じ情報を生成できるためです)。
OWLに関連するルールベースまたはルール索引は保存されません(Oracle Databaseリリース10.2ではOWLボキャブラリがサポートされないためです)。
次の手順を実行します。
データベースのダウングレードの前に、SYSDBA権限を持つSYSユーザーとしてリリース11のデータベースに接続します(SYS
AS SYSDBA
を使用して接続し、プロンプトが表示されたらSYSアカウントのパスワードを入力します)。
SQL*Plusを起動し、次の文を入力します。
EXECUTE SDO_SEM_DOWNGRADE.PREPARE_DOWNGRADE_FROM_11;
この文の実行に成功すると、既存のすべてのセマンティク・データとルールベースが保存されます。これらのセマンティク・データは、データベースのダウングレード後にリストアします。
データベースのダウングレードを実行します。
Oracle Technology Networkサイトの「Semantic Technologies」ページからsdosemdgu.plb
というファイルをダウンロードします。
現在使用中のOracle Databaseリリース10.2のリリース番号が10.2.0.1の場合にのみ、「Software」リンクをクリックし、RDF固有のパッチをダウンロードしてインストールします。(リリース10.2.0.1にはセマンティク・データをリストアするためのバッチ・ロード機能が含まれていないため、このパッチが必要です。)
SYSDBA権限を持つSYSユーザーとしてリリース10.2のデータベースに接続します。
SQL*Plusを起動し、次の文を入力します。
EXECUTE SDO_SEM_DOWNGRADE_UTL.PREPARE_DOWNGRADE_TO_102('<tablespace-name>');
<tablespace-name>は、RDFネットワークを作成する表領域の名前です。
この文の実行に成功すると、ダウングレード前に保存したすべてのセマンティク・データがリストアされ、使用できるようになります。
Oracle Databaseリリース11.1では、セマンティク・データのサポートが元のRDFの対象範囲を超えて拡張されているため、多くのソフトウェア・オブジェクト(PL/SQLパッケージ、ファンクションおよびプロシージャ、システム表およびビューなど)の名前が変更されています。ほとんどの場合、この変更で文字列RDFがSEMに置換されていますが、SDO_RDFがSEMに置換されている場合もあります。
リリース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 |