この章では、Oracle Spatial and Graphでのセマンティク・テクノロジのサポート、特にResource Description Framework (RDF)およびWeb Ontology Language (OWL)のサブセットのサポートについて説明します。これらの機能は、Oracle Spatial and GraphのRDFセマンティク・グラフ機能と呼ばれます。この章では、読者が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パッケージに含まれています。詳細は、「SEM_APISパッケージのサブプログラム」を参照してください。
RDFサポートおよびOWLサポートは、Oracle Spatial and Graphの機能です。これらの機能を使用するには、Oracle Spatial and Graphをインストールする必要があります。ただし、RDFおよびOWLの使用は、空間データに制限されません。
この章には次の項が含まれます。
OWLの概念とOracle DatabaseによるOWL機能のサポートの詳細は、「OWLの概要」を参照してください。
注意:
このマニュアルで説明している操作を実行するには、「RDFセマンティク・グラフ・サポートを有効にする」に示すように、前もってデータベースでRDFセマンティク・グラフ・サポートを有効にして他の前提条件も満たす必要があります。
Oracle Databaseでは、セマンティク・データとオントロジを格納し、セマンティク・データを問い合せることや、エンタープライズ・リレーショナル・データに対してオントロジ支援問合せを実行することができ、また、付属の推論またはユーザー定義の推論を使用して、セマンティク・データに対する問合せ機能を拡張することも可能です。図1-1に、これらの機能の相互関係を示します。
図1-1に示されているとおり、データベースには、セマンティク・データおよびオントロジ(RDF/OWLモデル)に加え、従来のリレーショナル・データが含まれます。セマンティク・データをロードするには、バルク・ロードが最も効率的な方法ですが、トランザクション型のINSERT文を使用してデータを増分ロードすることも可能です。
注意:
Oracle Databaseリリース11.1より前のリリースで作成した既存のセマンティク・データを使用する場合、「RDFセマンティク・グラフ・サポートの有効化」の手順に従ってデータをアップグレードする必要があります。
セマンティク・データおよびオントロジは問合せ可能です。また、セマンティク・データや従来のリレーショナル・データに対してオントロジ支援問合せを実行し、セマンティク関係を検出することもできます。オントロジ支援型問合せを実行するには、SEM_RELATED演算子を使用します(「リレーショナル・データに対する照会でのセマンティク演算子の使用」を参照)。
セマンティク・データに対する問合せ機能は、推論を使用して拡張できます。推論では、ルールベースのルールを使用します。推論により、データおよびルールに基づいて論理的な推測を行うことができます。推論でルールおよびルールベースを使用する方法の詳細は、「推論: ルールとルールベース」を参照してください。
セマンティク・データには、その形式意味論に加え、有向グラフを使用して効率的にモデル化される単純なデータ構造が含まれます。メタデータ文は、トリプルとして表現されます。ノードはトリプルの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) |
このモデルのトリプルを格納するための表領域の名前。 |
MODEL_TYPE |
VARCHAR2(40) |
値はRDFモデルのタイプを示し、 |
モデルを作成すると、そのモデルに関連付けられたトリプルのビューもMDSYSスキーマに作成されます。このビューは、SEMM_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。 |
COST |
NUMBER |
(今後使用予定) |
CTXT1 |
NUMBER |
(予約済の列。ファイングレイン・アクセス制御に使用可能) |
CTXT2 |
VARCHAR2(4000) |
(今後使用予定) |
DISTANCE |
NUMBER |
(今後使用予定) |
EXPLAIN |
VARCHAR2(4000) |
(今後使用予定) |
PATH |
VARCHAR2(4000) |
(今後使用予定) |
G_ID |
NUMBER |
トリプルのグラフ名のテキスト値に対応するVALUE_ID。Nullはデフォルト・グラフを示します(「名前付きグラフ」を参照)。 |
LINK_ID |
VARCHAR2(71) |
一意のトリプル識別子の値。(現在は計算結果列ですが、将来のリリースでは定義が変更される可能性があります。) |
注意:
表1-2の列P_VALUE_ID、START_NODE_ID、END_NODE_ID、CANON_END_NODE_IDおよびG_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
は、すべて同じ正規形に変換されます。
注意:
重複したトリプルとクワッドはMDSYS.RDFM_<model>ビューの基礎となる表パーティションには格納されませんが、重複した行がアプリケーション表に含まれることはあります。たとえば、トリプルがアプリケーション表に複数回挿入された場合、MDSYS.RDFM_<model>ビューには1つしか表示されませんが、アプリケーション表内では複数行を占めます。
字句形式の値ベースの一致は、次のデータ型でサポートされます。
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$表(「文」を参照)に新規行が挿入されます。
推論は、ルールに基づいて論理的な推測を行う機能です。推論により、文字列などの値に基づく構文的な一致機能ではなく、データの各要素間の意味的な関係に基づいてセマンティクな一致機能を実行する問合せを作成できます。推論では、ルールベースに格納されたルールを使用し、ルールには、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側に単一のトリプル・パターンを使用します。ルールのTHEN側に複数のトリプル・パターンが含まれる場合、THEN側でそれぞれ単一のトリプル・パターンを含むようにそれを複数のルールに簡単に分割できます。
ルールベースは、ルールを含むオブジェクトです。Oracleには、次のルールベースが付属しています。
RDFS
RDF (RDFSのサブセット)
OWLSIF (空)
RDFS++ (空)
OWL2RL (空)
OWLPrime (空)
SKOSCORE (空)
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データ・タイプの説明は、「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。) |
すべてのルールベースに関する情報は、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 ルールベースへのルールの挿入
例1-1では、family_rb
というルールベースを作成し、そのfamily_rb
ルールベースにgrandparent_rule
というルールを挿入します。このルールは、ある人物がある子の親であり、その子がさらに別の子の親である場合、その人物が自分の子供の子供に対する祖父母である(つまり、自分の子供の子供に関してgrandParentOf
関係を持つ)ことを示します。また、使用する名前空間も指定します。(この例は、 「例: 家系の情報」の例1-90の抜粋です。)
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/')));
例1-1に示されている祖父母ルールの種類は、OWL 2プロパティ・チェーン構成要素を使用して実装できることに注意してください。プロパティ・チェーンの処理の詳細は、「プロパティ・チェーンの処理」を参照してください。
例1-2 推論でのルールベースの使用
SEM_MATCHテーブル・ファンクション(「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」項を参照)をコールするときに1つ以上のルールベースを指定して、セマンティク・データに対する問合せの動作を制御できます。例1-2では、family_rb
ルールベースと、例1-1で作成したgrandParentOf
関係を参照して、すべての祖父(祖父母の男性の方)とその孫を検索します。(この例は、「例: 家系の情報」の例1-90の抜粋です。)
-- 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推論のサポートの詳細は、「OWL推論の使用方法」を参照してください。
伴意(ルール索引)は、指定したルールベースのセットを指定したモデルのセットに適用することで推論できる計算済のトリプルを含むオブジェクトです。SEM_MATCH問合せで任意のルールベースを参照する場合、問合せ内のルールベースとモデルの組合せごとに伴意が存在している必要があります。
伴意を作成するには、SEM_APIS.CREATE_ENTAILMENTプロシージャを使用します。伴意を削除するには、SEM_APIS.DROP_ENTAILMENTプロシージャを使用します。
伴意を作成すると、その伴意に関連付けられたトリプルのビューもMDSYSスキーマに作成されます。このビューは、SEMI_entailment-nameという形式の名前を持ち、伴意の所有者および適切な権限を持つユーザーにのみ表示されます。各MDSYS.SEMI_entailment-nameビューには、ネットワークにリンクとして格納されたトリプルごとに1つの行が保持され、また、SEMM_model-nameビューと同じ列が含まれます(「モデルのメタデータ」の表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-90の抜粋です。)
例1-3 伴意の作成
BEGIN SEM_APIS.CREATE_ENTAILMENT( 'rdfs_rix_family', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb')); END; /
仮想モデルとは、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_MATCH問合せでの複数のモデルの問合せと同等であるため、問合せの指定を簡略化できます。たとえば、モデルm1、m2およびm3がすでに存在し、OWLPrimeルールベースを使用してm1、m2およびm3に対して伴意が作成されているとします。仮想モデルvm1を次のように作成できます。
EXECUTE sem_apis.create_virtual_model('vm1', sem_models('m1', 'm2', 'm3'), sem_rulebases('OWLPRIME'));
仮想モデルを問い合せるには、SEM_MATCH問合せのモデルと同様の仮想モデル名を使用します。たとえば、仮想モデルに対する次の問合せがあるとします。
SELECT * FROM TABLE (sem_match('{…}', sem_models('vm1'), null, …));
これは、すべての個別モデルに対する次の問合せと同等です。
SELECT * FROM TABLE (sem_match('{…}', sem_models('m1', 'm2', 'm3'), sem_rulebases('OWLPRIME'), …));
仮想モデルに対するSEM_MATCH問合せでは、それぞれのモデルおよび伴意のUNIONまたはUNION ALLを問い合せることなく、SEMVまたはSEMUビューを問い合せます(デフォルトはSEMUで、'ALLOW_DUP=T'オプションが指定されている場合はSEMV)。これらのビューおよびオプションの詳細は、SEM_APIS.CREATE_VIRTUAL_MODELプロシージャのリファレンスの項を参照してください。
仮想モデルに参加するモデルでは、Oracle Workspace Managerのバージョニングの有効化を使用できません。(Workspace ManagerによるRDFデータのサポートの詳細は、「RDFデータに対するWorkspace Managerサポート」を参照してください。)
仮想モデルは、ビューを使用し(この項の後の部分を参照)、いくつかのメタデータ・エントリを追加しますが、システム記憶域要件はそれほど増大しません。
仮想モデルを作成するには、SEM_APIS.CREATE_VIRTUAL_MODELプロシージャを使用します。仮想モデルを削除するには、SEM_APIS.DROP_VIRTUAL_MODELプロシージャを使用します。仮想モデルのコンポーネント・モデル、ルールベースまたは伴意が削除されると、その仮想モデルは自動的に削除されます。それを削除することなく仮想モデルを置き換えるには、SEM_APIS.CREATE_VIRTUAL_MODELプロシージャをREPLACE=T
オプションとともに使用します。仮想モデルを置き換えると、それを再定義する一方で、任意のアクセス権限を保持することができます。
仮想モデルを問い合せるには、例1-4に示すとおり、SEM_MATCH表関数のmodels
パラメータで仮想モデル名を指定します。
SEM_MATCHテーブル・ファンクションの詳細は、「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。この項には、仮想モデルを問い合せるときの特定の属性の使用方法が示されています。
仮想モデルを作成すると、MDSYS.SEM_MODEL$ビューに仮想モデルのエントリが作成されます(「モデルのメタデータ」の表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-9に、このビューの列を示します(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-10に、このビューの列を示します(1つの行がすべての列の値の一意の組合せに対応します)。
表1-10 MDSYS.SEM_VMODEL_DATASETSビューの列
列名 | データ型 | 説明 |
---|---|---|
VIRTUAL_MODEL_NAME |
VARCHAR2(25) |
仮想モデルの名前。 |
DATA_TYPE |
VARCHAR2(8) |
仮想モデルに含まれるオブジェクトのタイプ。例: |
DATA_NAME |
VARCHAR2(25) |
DATA_TYPE列に含まれるタイプのオブジェクトの名前 |
例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'));
RDFセマンティク・グラフは名前付きグラフの使用をサポートしており、これについてはW3C勧告の「SPARQL Query Language for RDF」のRDFデータセットに関する項(http://www.w3.org/TR/rdf-sparql-query/#rdfDataset
)で説明されています。
このサポートは、従来の主語、述語、目的語で構成されるRDFトリプルを、グラフ名を表す追加の構成要素を含めるように拡張することで実現されます。拡張されたRDFトリプルは、4つの構成要素を含みますが、このドキュメントでは引き続きRDFトリプルと呼びます。また、次の用語が使用されることもあります。
N-Triple: 拡張トリプルを許可しない形式です。したがって、n-tripleは3つのコンポーネントを持つトリプルのみを含むことができます。
N-Quad: 通常のトリプル(3つのコンポーネント)と拡張トリプル(グラフ名を含む4つのコンポーネント)を許可する形式です。詳細は、http://www.w3.org/TR/2013/NOTE-n-quads-20130409/
を参照してください。
拡張トリプルを含むファイル(通常は標準トリプルが混在)をOracle Databaseにロードする場合、入力ファイルはN-Quad形式である必要があります。
RDFトリプルのグラフ名の構成要素は、NULLまたはURIである必要があります。これがNULLの場合、RDFトリプルはデフォルト・グラフに属していると言われます(それ以外の場合、URIで指定された名前を持つ名前付きグラフに属していると言われます)。
また、SDO_RDF_TRIPLE_Sオブジェクト型(「セマンティク・データの型、コンストラクタ、およびメソッド」を参照)の名前付きグラフをサポートするため、モデル-グラフ(モデルとグラフ(存在する場合)の組合せ)を指定するための新しい構文が用意され、RDF_M_ID属性はモデル-グラフの識別子(グラフ(存在する場合)のモデルIDと値IDの組合せ)を保持します。モデル-グラフの名前をmodel_nameとして指定し、グラフが存在する場合は、その後にコロン(:
)区切り文字とグラフ名が続きます(これはURIであり、山カッコ< >
で囲まれる必要があります)。
たとえば、医療データセットでは、各RDFトリプルの名前付きグラフの構成要素は患者の識別子に基づくURIになるため、一意の患者と同じ数の名前付きグラフが存在することになります(それぞれの名前付きグラフは特定の患者のデータで構成されます)。
名前付きグラフに特定の操作を実行する方法の詳細は、次の項を参照してください。
コンストラクタおよびメソッドの使用: セマンティク・データの型、コンストラクタおよびメソッド
ロード: 「外部表を使用したステージング表へのN-Quad形式のデータのロード」および「INSERT文を使用した名前付きグラフへのデータのロード」
TriG (http://wifo5-03.informatik.uni-mannheim.de/bizer/trig/
)およびN-QUADS (http://www.w3.org/TR/2013/NOTE-n-quads-20130409/
)は、トリプル・データにグラフ名(またはコンテキスト)を提供する2つの一般的なデータ形式です。(2011年11月の時点では、どちらも標準形式ではありませんでした。)グラフ名(コンテキスト)は様々な方法で使用できます。典型的な使用方法には、管理、ローカライズされた問合せ、ローカライズされた推論および来歴を容易にするためのトリプルのグループ化がありますが、これに限定されるものではありません。
例1-5 TriG形式でエンコードされたRDFデータ
例1-5は、TriG形式でエンコードされるRDFデータセットを示しています。デフォルト・グラフと名前付きグラフが含まれます。
@prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix dc: <http://purl.org/dc/elements/1.1/> . # Default graph { <http://my.com/John> dc:publisher <http://publisher/Xyz> . } # A named graph <http://my.com/John> { <http://my.com/John> foaf:name "John Doe" . }
例1-5のTriGファイルをDatasetGraphOracleSem
オブジェクトにロード(たとえば、「RDF Semantic Graph Support for Apache Jenaを使用したバルク・ロード」の例7-12を使用)する場合に、定数"N-QUADS"
を"TRIG"
に置き換えると、デフォルト・グラフ内のトリプルは、トリプルとしてnullグラフ名とともにOracle Databaseにロードされ、名前付きグラフ内のトリプルは指定されたグラフ名とともにOracle Databaseにロードされます。
例1-6 N-QUADS形式の表現
N-QUADS形式は、オプションの4番目の列(グラフ名またはコンテキスト)を追加することで既存のN-TRIPLES形式を単純に拡張したものです。例1-6に、例1-5に基づくTriGファイルのN-QUADS形式の表現を示します。
<http://my.com/John> <http://purl.org/dc/elements/1.1/publisher> <http://publisher/Xyz> . <http://my.com/John> <http://xmlns.com/foaf/0.1/name> "John Doe" <http://my.com/John>
N-QUADSファイルをDatasetGraphOracleSem
オブジェクトにロードすると(例7-12を参照)、4つ目の列のない行はnullグラフ名を持つトリプルとしてOracle Databaseにロードされ、4つ目の列がある行は指定されたグラフ名でOracle Databaseにロードされます。
セマンティク・データを使用する場合、次のデータベース・セキュリティの考慮事項が適用されます。
モデルまたは伴意を作成すると、関連ビューに対するGRANTオプション付きのSELECT権限が所有者に付与されます。これらのビューに対してSELECT権限を持つユーザーは、関連モデルまたは伴意に対してSEM_MATCH問合せを実行できます。
ルールベースを作成すると、ルールベースに対するGRANTオプション付きのSELECT、INSERT、UPDATEおよびDELETE権限が所有者に付与されます。ルールベースに対してSELECT権限を持つユーザーは、ルールベースを含む伴意を作成できます。INSERT、UPDATEおよびDELETE権限により、ルールベースを変更できるユーザーと、その変更方法が制御されます。
モデルに対してデータ操作言語(DML)の操作を実行する場合、ユーザーは対応する実表に対するDML権限を持っている必要があります。
モデルに対応する実表の作成者は、他のユーザーに権限を付与できます。
ルールベースに対してデータ操作言語(DML)の操作を実行する場合、ユーザーは対応するデータベース・ビューに対する適切な権限を持っている必要があります。
モデルの作成者は、対応するデータベース・ビューに対するSELECT権限を他のユーザーに付与できます。
ユーザーは、対応するデータベース・ビューに対するSELECT権限を持っているモデルのみを問い合せることができます。
モデルまたはルールベースを削除できるのは、その作成者のみです。
Oracle Databaseでは、セマンティク・データに関連するメタデータを保持するために、MDSYSスキーマで複数の表およびビューが管理されます。(これらの表およびビューの一部は、「セマンティク・データの使用に関するクイック・スタート」に記載されているSEM_APIS.CREATE_SEM_NETWORKプロシージャによって作成され、さらにその一部は、必要な場合にのみ作成されます。)表1-11に、これらの表およびビューをアルファベット順に示します。(また、Oracleで内部的に使用するためにいくつかの表およびビューも作成されますが、それらの表およびビューにはDBA権限を持つユーザーのみがアクセスできます。)
表1-11 セマンティク・メタデータ表およびビュー
名前 | 含まれる情報 | 参照先 |
---|---|---|
RDF_VALUE$ |
文を表すのに使用される主語、プロパティおよび目的語 |
|
RDFOLS_SECURE_RESOURCE |
Oracle Label Security (OLS)ポリシーで保護されたリソースと、それらのリソースに関連付けられた機密性ラベル |
|
RDFVPD_MODELS |
RDFモデルとそれらに関連付けられたVPDポリシー |
|
RDFVPD_POLICIES |
スキーマに定義されているすべてのVPDポリシーまたはユーザーが完全なアクセス権を持っているポリシー |
|
RDFVPD_POLICY_CONSTRAINTS |
現在のユーザーがアクセスできるVPDポリシーに定義された制約 |
|
RDFVPD_PREDICATE_MDATA |
VPDポリシーに関連付けられた述語メタデータ |
|
RDFVPD_RESOURCE_REL |
VPDポリシーのリソース間に定義されているサブクラス、サブプロパティおよび等価プロパティの関係 |
|
SEM_DTYPE_INDEX_INFO |
ネットワークのすべてのデータ型索引 |
|
SEM_MODEL$ |
データベースに定義されているすべてのモデル |
|
SEM_NETWORK_INDEX_INFO$ |
セマンティク・ネットワーク索引 |
|
SEM_RULEBASE_INFO |
ルールベース |
|
SEM_RULES_INDEX_DATASETS |
伴意で使用されるデータベース・オブジェクト |
|
SEM_RULES_INDEX_INFO |
伴意(ルール索引) |
|
SEM_VMODEL_INFO |
仮想モデル |
|
SEM_VMODEL_DATASETS |
仮想モデルで使用されるデータベース・オブジェクト |
|
SEMCL_entailment-name |
|
|
SEMI_entailment-name |
指定した伴意のトリプル |
|
SEMM_model-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 RDF_M_ID NUMBER, -- Model (or Model-Graph) 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型には、RDFモデル(モデル-グラフ)の名前、トリプル、またはトリプルの一部(主語、プロパティまたは目的語)を取得する次のメソッドが含まれます。
GET_MODEL() RETURNS VARCHAR2 GET_TRIPLE() RETURNS SDO_RDF_TRIPLE GET_SUBJECT() RETURNS VARCHAR2 GET_PROPERTY() RETURNS VARCHAR2 GET_OBJECT() RETURNS CLOB
例1-7に、SDO_RDF_TRIPLE_Sのメソッドを示します。
例1-7 SDO_RDF_TRIPLE_Sのメソッド
SELECT a.triple.GET_MODEL() AS model_graph, a.triple.GET_TRIPLE() AS triple FROM articles_rdf_data a WHERE a.id = 99; MODEL_GRAPH -------------------------------------------------------------------------------- TRIPLE(SUBJECT, PROPERTY, OBJECT) -------------------------------------------------------------------------------- ARTICLES:<http://examples.com/ns#Graph1> SDO_RDF_TRIPLE('<http://nature.example.com/Article101>', '<http://purl.org/dc/elements/1.1/creator>', '"John Smith"') 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-8では、1番目のコンストラクタ書式を使用して複数のトリプルを挿入します。
例1-8 トリプルを挿入する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"')); INSERT INTO articles_rdf_data VALUES (98, SDO_RDF_TRIPLE_S ('articles:<http://examples.com/ns#Graph1>', '<http://nature.example.com/Article102>', '<http://purl.org/dc/elements/1.1/creator>', '_:b1')); INSERT INTO articles_rdf_data VALUES (97, SDO_RDF_TRIPLE_S ('articles:<http://examples.com/ns#Graph1>', '_:b2', '<http://purl.org/dc/elements/1.1/creator>', '_:b1'));
セマンティク・データを問い合せるには、SEM_MATCH表関数を使用します。この関数には、次の属性が含まれます。
SEM_MATCH( query VARCHAR2, models SEM_MODELS, rulebases SEM_RULEBASES, aliases SEM_ALIASES, filter VARCHAR2, index_status VARCHAR2, options VARCHAR2, graphs SEM_GRAPHS, named_graphs SEM_GRAPHS ) 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です。仮想モデルを問い合せる場合、他のモデル名は指定せず、その仮想モデルの名前のみを指定します。(仮想モデルの詳細は、「仮想モデル」を参照してください。)
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表関数とSEM_CONTAINSおよびSEM_RELATED演算子では、次のデフォルトの名前空間(namespace_id
属性とnamespace_val
属性)が使用されます。
('ogc', 'http://www.opengis.net/ont/geosparql#') ('ogcf', 'http://www.opengis.net/def/function/geosparql/') ('ogcgml', 'http://www.opengis.net/ont/gml#') ('ogcsf', 'http://www.opengis.net/ont/sf#') ('orardf', 'http://xmlns.oracle.com/rdf/') ('orageo', 'http://xmlns.oracle.com/rdf/geo/') ('owl', 'http://www.w3.org/2002/07/owl#') ('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以上である祖父の孫に検索結果を絞り込めます。
注意:
filter
属性を使用するかわりに、できるかぎり問合せパターン内でFILTERキーワードを使用してください(「グラフ・パターン: 中カッコの構文とOPTIONAL、FILTER、UNIONおよびGRAPHキーワードのサポート」を参照)。FILTERキーワードを使用すると、内部が最適化されるため、パフォーマンスが向上する傾向があります。ただし、FILTERキーワードで表現できないSQL構成要素が必要な場合は、filter
引数が便利です。
index_status
属性では、関連する伴意のステータスが無効の場合でも、セマンティク・データを問い合せることができます。(仮想モデルを問い合せる場合、この属性は、その仮想モデルに関連付けられた伴意を参照します。)この属性がnullの場合、伴意のステータスが無効だと、問合せによりエラーが戻されます。この属性がNULLではない場合、文字列INCOMPLETE
またはINVALID
を指定する必要があります。異なるindex_status
値を持つ問合せの動作については、「不完全な伴意または無効な伴意を使用した問合せの実行」の説明を参照してください。
options
属性は、問合せの結果に影響を与えることのできるオプションを指定します。オプションは、キーワードと値のペアで表記します。次のオプションがサポートされています。
ALL_BGP_HASH
およびALL_BGP_NL
は、すべてのBGP間の結合(ルートBGPとOPTIONAL BGPの間の結合など)で指定の結合タイプを使用する必要があることを示すグローバル問合せオプティマイザ・ヒントです。(BGPは、basic graph patternの略語です)。W3C勧告の「SPARQL Query Language for RDF」の説明では、「SPARQLのグラフ・パターン照合は、基本グラフ・パターンの照合結果を組み合せるという観点で定義されています。単一の基本グラフ・パターンは、フィルタの割込がある一連のトリプル・パターンによって形成されます。任意のグラフ・パターンによって、基本グラフ・パターンが終了します」と記述されています。
BGP_JOIN(USE_NL)
およびBGP_JOIN(USE_HASH)
HINT0問合せオプティマイザ・ヒントを使用して、結合タイプをきめ細かく制御できます。
例1-14に、SEM_MATCH問合せで使用されるALL_BGP_HASHオプションを示します。
ALL_LINK_HASH
およびALL_LINK_NL
は、すべてのRDF_LINK$結合(BGP内のトリプル・パターン間のすべての結合)の結合タイプを指定するグローバル問合せオプティマイザ・ヒントです。ALL_LINK_HASH
とALL_LINK_NL
も、きめ細かい制御のためにHINT0問合せオプティマイザ内で使用できます。
ALL_MAX_PP_DEPTH(n)
はグローバル問合せオプティマイザ・ヒントです。これは、プロパティ・パス演算子*と+の評価に使用する最大深度を設定します。デフォルト値は10です。MAP_PP_DEPTH(n)
HINT0ヒントは、さらに細かく最大深度を指定するために使用できます。
ALL_ORDERED
は、問合せ内の各BGPのトリプル・パターンが順番に評価される必要があることを指定するグローバル問合せオプティマイザ・ヒントです。
例1-14に、SEM_MATCH問合せで使用されるALL_ORDEREDオプションを示します。
ALL_USE_PP_HASH
およびALL_USE_PP_NL
は、プロパティ・パス表現の評価に使用する結合タイプを指定するグローバル問合せオプティマイザ・ヒントです。USE_PP_HASH
およびUSE_PP_NL
HINT0ヒントは、結合タイプをさらにきめ細かく指定するために使用できます。
ALLOW_DUP=T
は、セマンティク・モデルと推論データ(適用可能な場合)のUNIONではなくUNION ALLを実行する、基礎となるSQL文を生成します。このオプションを使用した場合、結果セットに追加の行(重複するトリプル)が生成されるために、それに応じてアプリケーション・ロジックを調整する必要があることがあります。このオプションを指定しない場合、すべてのモデルと推論データにわたって、重複するトリプルは自動的に削除され、マージされたRDFグラフの設定済セマンティクが保持されます。ただし、重複するトリプルを削除すると、問合せの処理時間が長くなります。一般に、1つのSEM_MATCH問合せに複数のセマンティク・モデルが関連している場合、'ALLOW_DUP=T'
を指定することで、パフォーマンスが大幅に向上します。
仮想モデルを問い合せる場合、ALLOW_DUP=T
を指定すると、SEMV_vm_nameビューが問い合せられます。指定しない場合、SEMU_vm_nameビューが問い合せられます。
ALLOW_PP_DUP=T
は、+および*プロパティ・パス問合せで結果の重複を許可します。結果の重複が認められると、最初の結果行が早く戻されます。
CLOB_AGG_SUPPORT=T
は、集計(MIN、MAX、GROUP_CONCAT、SAMPLE)でCLOB値のサポートを有効にします。CLOBサポートを有効化するとパフォーマンスが大幅に低下することに注意してください。
CLOB_EXP_SUPPORT=T
は、一部の組込みSPARQL関数でのCLOB値のサポートを有効にします。CLOBサポートを有効化するとパフォーマンスが大幅に低下することに注意してください。
CONSTRUCT_STRICT=T
は、SPARQL CONSTRUCTまたはSPARQL DESCRIBE構文の問合せの結果から無効なRDFトリプルを消去します。主語の位置にリテラルがあるRDFトリプル、または述語の位置にリテラルか空白ノードがあるRDFトリプルは無効とみなされます。
CONSTRUCT_UNIQUE=T
は、SPARQL CONSTRUCTまたはSPARQL DESCRIBE構文の問合せの結果から重複RDFトリプルを消去します。
DO_UNESCAPE=T
は、返却列のvar、var$_PREFIX、var$_SUFFIX、var$RDFCLOB、var$RDFLTYP、var$RDFLANGおよびvar$RDFTERMの文字を、W3CのN-Triples仕様(http://www.w3.org/TR/rdf-testcases/#ntriples
)に従ってエスケープしません。
SEM_APIS.ESCAPE_CLOB_TERM、SEM_APIS.ESCAPE_CLOB_VALUE、SEM_APIS.ESCAPE_RDF_TERM、SEM_APIS.ESCAPE_RDF_VALUE、SEM_APIS.UNESCAPE_CLOB_TERM、SEM_APIS.UNESCAPE_CLOB_VALUE、SEM_APIS.UNESCAPE_RDF_TERMおよびSEM_APIS.UNESCAPE_RDF_VALUEのリファレンス情報も参照してください。
FINAL_VALUE_HASH
およびFINAL_VALUE_NL
は、FILTER句で使用されていない問合せ変数の字句の値を取得するために、使用する必要がある結合メソッドを指定するグローバル問合せオプティマイザ・ヒントです。
GRAPH_MATCH_UNNAMED=T
を使用すると、名前なしトリプル(null G_ID
)をGRAPH句内で照合可能になります。つまり、グラフが等しい場合、またはグラフの一方または両方がnullの場合、2つのトリプルはグラフ結合条件を満たすことになります。データセットに名前なしTBOXトリプルまたは名前なし伴意トリプルが含まれている場合に、このオプションが役立つことがあります。
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)があります。これらのヒントの書式と基本的な意味は、SQL文のヒントと同じです(『Oracle Database SQL言語リファレンス』を参照)。
例1-10に、SEM_MATCH問合せで使用されるHINT0オプションを示します。
HTTP_METHOD=POST_PAR
は、URLエンコーディング・パラメータ・パスを含むHTTP POSTメソッドをSERVICEリクエストに対して使用する必要があると指定します。リクエストのデフォルト・オプションはHTTP GETメソッドです。SPARQLプロトコルの詳細は、http://www.w3.org/TR/2013/REC-sparql11-protocol-20130321/#protocol
を参照してください。
INF_ONLY=T
は、指定されたモデルおよびルールベースの伴意グラフのみを問い合せます。
PLUS_RDFT=T
は、SPARQL SELECT構文(「SELECT句の式」を参照)で、射影される各問合せ変数のvar$RDFTERM CLOB列を追加で返す場合に使用できます。この列の値は、SEM_APIS.COMPOSE_RDF_TERM(var, var$RDFVTYP, var$RDFLTYP, var$RDFLANG, var$RDFCLOB)の結果と同等です。このオプションを使用する場合、各変数varの戻り列は、var、var$RDFVID、var$_PREFIX、var$_SUFFIX、var$RDFVTYP、var$RDFCLOB、var$RDFLTYP、var$RDFLANGおよびvar$RDFTERMになります。
PLUS_RDFT=VC
は、SPARQL SELECT構文(「SELECT句の式」を参照)で、射影される各問合せ変数のvar$RDFTERM VARCHAR2(4000)列を追加で返す場合に使用できます。この列の値は、SEM_APIS.COMPOSE_RDF_TERM(var, var$RDFVTYP, var$RDFLTYP, var$RDFLANG)の結果と同等です。このオプションを使用する場合、各変数varの戻り列は、var、var$RDFVID、var$_PREFIX、var$_SUFFIX、var$RDFVTYP、var$RDFCLOB、var$RDFLTYP、var$RDFLANGおよびvar$RDFTERMになります。
PROJ_EXACT_VALUES=T
は、関数から返される値と、値割当て文で使用される定数値の正規化を無効にします。これらの値はデフォルトでは正規化されます。
SERVICE_CLOB=F
は、サービスをコールするときにvar$RDFCLOBの列値を保存するかわりに値にnullを設定します。CLOBデータがアプリケーションで必要ない場合、このオプションを使用してCLOB処理を省略するとパフォーマンスを向上させることができます。
SERVICE_ESCAPE=F
は、SPARQL SERVICEコールから返されるRDFリテラル値の文字のエスケープを無効にします。RDFリテラル値はデフォルトではエスケープされます。文字のエスケープがアプリケーションに関係ない場合は、文字のエスケープを無効にするとパフォーマンスを向上させることができます。
SERVICE_JPDWN=T
は、SPARQL SERVICEでネステッド・ループ結合を使用するための問合せオプティマイザ・ヒントです。例1-70に、SEM_MATCH問合せで使用されるSERVICE_JPDWN=T
オプションを示します。
SERVICE_PROXY=
<proxy-string>
は、http接続を実行するときに使用されるプロキシ・アドレスを設定します。指定したproxy-stringがSERVICE問合せで使用されます。例1-73に、プロキシ・アドレスを含むSEM_MATCH問合せを示します。
STRICT_AGG_CARD=T
は、一致しなかったグラフ・パターンを含む集計問合せで、SPARQLセマンティク(1つのnull行)をSQLセマンティク(0行)のかわりに使用します。このオプションによってパフォーマンスがわずかに低下します。
STRICT_DEFAULT=T
は、データセット情報が指定されない場合に、デフォルト・グラフを名前なしトリプルに制限します。
graphs
属性は、SEM_MACH問合せ用のデフォルト・グラフの構築元となる、名前付きグラフのセットを指定します。そのデータ型はSEM_GRAPHSで、TABLE OF VARCHAR2(4000)
という定義を持ちます。この属性のデフォルト値はNULL
です。graphs
がNULL
の場合、問合せモデルのセット内のすべてのグラフのすべての和集合が、デフォルト・グラフとして使用されます。
named_graphs
属性は、GRAPH句で照合可能な名前付きグラフのセットを指定します。そのデータ型はSEM_GRAPHSで、TABLE OF VARCHAR2(4000)
という定義を持ちます。この属性のデフォルト値はNULL
です。named_graphsがNULL
の場合、問合せモデルのセット内のすべての名前付きグラフを、GRAPH句によって照合することができます。
SEM_MATCH表関数では、入力変数に応じた要素とともにANYDATASET型のオブジェクトが戻されます。次の説明において、varは問合せで使用される変数名を示します。変数varごとに、結果要素にはvar、var$RDFVID、var$_PREFIX、var$_SUFFIX、var$RDFVTYP、var$RDFCLOB、var$RDFLTYPおよびvar$RDFLANGの各属性が含まれます。
このような場合、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
となります。
変数値の列とともに、SPARQL SELECT構文を使用するSEM_MATCH問合せは、追加のNUMBER列であるSEM$ROWNUMを戻します(この列は、SPARQL ORDER BY句を含む問合せの正しい結果順序を保証するために使用できます)。
SPARQL ASK構文を使用するSEM_MATCH問合せは、列ASK、ASK$RDFVID、ASK$_PREFIX、ASK$_SUFFIX、ASK$RDFVTYP、ASK$RDFCLOB、ASK$RDFLTYP、ASK$RDFLANGおよびSEM$ROWNUMを返します。これは、1つの?ask
変数を射影するSPARQL SELECT構文の問合せと同じです。
SPARQL CONSTRUCTまたはSPARQL DESCRIBE構文を使用するSEM_MATCH問合せは、問合せ結果バインディングではなくRDFトリプル・データを含む列を返します。これらの問合せは、主語、述語および目的語のコンポーネントについて値を返します。詳細は、「グラフ・パターン: SPARQL CONSTRUCT構文のサポート」を参照してください。
SEM_RELATED演算子を使用してOWLオントロジを問い合せる方法の詳細は、「セマンティク演算子を使用したリレーショナル・データの問合せ」を参照してください。
複数のモデルを問い合せる場合、または1つ以上のモデルおよびそれに対応する伴意を問い合せる場合、パフォーマンスの向上のため、仮想モデルを使用することを考慮してください(「仮想モデル」を参照)。
この項には次のトピックも含まれます。
例1-9 SEM_MATCH表関数
例1-9では、RDFS
とfamily_rb
の2つのルールベースによる推論を使用して、family
モデルからすべての祖父(祖父母の男性の方)とその孫を選択します。(この例は、「例: 家系の情報」の例1-90の抜粋です。)
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-10 SEM_MATCH表関数を使用したHINT0オプション
例1-10は例1-9と同じ機能ですが、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-11 SEM_MATCH表関数
例1-11では、Pathway/Genome BioPax
オントロジを使用して、Proteins
とComplexes
の両方に属するすべての化学的複合タイプを取得します。
SELECT t.r FROM TABLE (SEM_MATCH ( '{?r rdfs:subClassOf :Proteins . ?r rdfs:subClassOf :Complexes}', SEM_Models ('BioPax'), SEM_Rulebases ('rdfs'), SEM_Aliases (SEM_ALIAS('', 'http://www.biopax.org/release1/biopax-release1.owl')), NULL)) t;
例1-11のとおり、SEM_MATCH表関数の検索パターンは、変数が疑問符文字(?
)で始まるSPARQLに似た構文を使用して指定します。この例の場合、変数?r
は、同じ語に一致する必要があるため、Proteins
とComplexes
の両方のサブクラスである必要があります。
関連する伴意のステータスが無効の場合でも、SEM_MATCH表関数のindex_status
属性に文字列値INCOMPLETE
またはINVALID
を指定すると、セマンティク・データを問い合せることができます。(伴意のステータスは、「伴意(ルール索引)」に記載されているとおり、MDSYS.SEM_RULES_INDEX_INFOビューのSTATUS列に格納されます。)(SEM_MATCH表関数については、「SEM_MATCH表関数を使用したセマンティク・データの問合せ」を参照してください。)
index_status属性の値は、問合せの動作に次のように影響します。
伴意のステータスが有効の場合、問合せ動作はindex_status
属性の値に影響を受けません。
index_status
に値を指定しないか、NULL値を指定した場合に、伴意のステータスが無効だと、問合せからエラーが戻されます。
index_status
属性に文字列INCOMPLETE
を指定すると、伴意のステータスが不完全または有効である場合、問合せが実行されます。
index_status
属性に文字列INVALID
を指定すると、伴意の実際のステータス(無効、不完全または有効)にかかわらず問合せが実行されます。
ただし、伴意のステータスが不完全または無効の場合、次の考慮事項が適用されます。
ステータスが不完全の場合、基礎となるモデルに最近挿入されて推論可能となったいくつかのトリプルは、実際には伴意に存在しないことがあり、したがって問合せにより戻される結果は不正確となる可能性があるため、伴意の内容は近似値となる可能性があります。
ステータスが無効の場合、基礎となるモデルまたはルールベース(あるいはその両方)が最近変更されて推論不可能となったいくつかのトリプルは、まだ伴意に存在することがあり、したがって問合せにより戻される結果の正確性が影響を受ける可能性があるため、伴意の内容は近似値となる可能性があります。推論不可能となったトリプルが存在する可能性に加え、一部の推論可能な行が実際には伴意に存在しない可能性もあります。
SEM_MATCH表関数は、一連のトリプル・パターンを中カッコで囲むグラフ・パターンの構文を受け入れます。OPTIONAL、FILTER、UNIONまたはGRAPHキーワードが続く場合以外は、セパレータとしてピリオドが必要です。この構文では、次の操作を任意に組み合せて実行できます。
OPTIONAL構成要素を使用して、部分一致の場合にも結果を取得できます。
FILTER構成要素を使用して、ソリューションを問合せに制限するグラフ・パターンのフィルタ式を指定できます。
UNION構成要素を使用して、複数の代替グラフ・パターンのいずれかを一致させることができます。
GRAPH構成要素(「GRAPHキーワード・サポート」を参照)を使用して、グラフ・パターンの一致範囲を名前付きグラフのセットに制限できます。
算術演算子(+、-、*、/)、ブール演算子と論理連結語(||、&&、!)、および比較演算子(<、>、<=、>=、=、!=)に加えて、いくつかの組込み関数をFILTER句で使用できます。表1-12に、FILTER句で使用できる組込み関数を示します。表1-12の「説明」列で、x、yおよびzは、適切な型の引数です。
表1-12 FILTER句で使用できる組込み関数
機能 | 説明 |
---|---|
ABS(RDF term) |
|
BNODE(literal)またはBNODE() |
問合せのデータセット内のすべての空白ノード、および他の問合せでこの関数によって作成された空白ノードとは別の空白ノードを構築します。引数を指定しない形式では、すべてのコールで異なる空白ノードが構築されます。単純なリテラルを指定する形式の場合、異なる単純なリテラルに対しては異なる空白ノードが構築され、同じ単純なリテラルを使用したコールでは同じ空白ノードが構築されます。 |
BOUND(variable) |
BOUND(x)は、 |
CEIL(RDF term) |
term以上の最も近い小数部分なしの数値を戻します。termが数値以外の場合は、nullを戻します。 |
COALESCE(term list) |
エラーが発生せずに評価された引数リストの最初の要素を戻します。評価される場合は、バインドされていない変数でエラーが発生します。有効な要素が語句リストにない場合は、nullを戻します。 |
CONCAT(term list) |
語句リスト内の文字列値を連結した結果の |
CONTAINS(literal, match) |
文字列 |
DATATYPE(literal) |
DATATYPE(x)は、 |
DAY(argument) |
引数の日部分に対応する整数を戻します。引数が |
ENCODE_FOR_URI(literal) |
|
EXISTS(pattern) |
含まれているグループ・グラフ・パターンと現在のアクティブ・グラフ内の現在のバインディングを使用して、パターンが問合せデータセットと一致する場合に、 |
FLOOR(RDF term) |
|
HOURS(argument) |
|
IF(condition, expression1, expression2) |
条件を評価して、有効なブール値を取得します。trueの場合、最初の式が評価され、その値が戻されます。falseの場合、2つ目の式が使用されます。条件でエラーが発生した場合、エラーはIF文の結果として渡されます。 |
IRI(RDF term) |
引数 |
isBLANK(RDF term) |
isBLANK(x)は、 |
isIRI(RDF term) |
isIRI(x)は、 |
isLITERAL(RDF term) |
isLiteral(x)は、 |
IsNUMERIC(RDF term) |
|
isURI(RDF term) |
isURI(x)は、 |
LANG(literal) |
LANG(x)は、 |
LANGMATCHES(literal, literal) |
LANGMATCHES(x、y)は、言語タグ |
LCASE(literal) |
リテラル内の各文字を対応する子文字に変換して、文字列を戻します。 |
MD5(literal) |
MD5ハッシュ関数に対応する、 |
MINUTES(argument) |
|
MONTH(argument) |
|
NOT_EXISTS(pattern) |
含まれているグループ・グラフ・パターンと現在のアクティブ・グラフ内の現在のバインディングを使用して、パターンが問合せデータセットと一致しない場合に、 |
NOW() |
問合せ実行時点の現在の時刻に対応する |
RAND() |
[0,1)のレンジ内の数値を生成します。 |
REGEX(string, pattern) |
REGEX(x,y)は、 |
REGEX(string, pattern, flags) |
REGEX (x,y,z)は、 |
REPLACE(string, pattern, replacement) |
|
REPLACE(string, pattern, replacement, flags) |
string内の正規表現 サポートされる正規表現の詳細は、『Oracle Database SQL言語リファレンス』の付録「Oracleの正規表現のサポート」を参照してください。 |
ROUND(RDF term) |
|
sameTerm(RDF term, RDF term) |
sameTerm(x, y)は、 |
SECONDS(argument) |
|
SHA1(literal) |
SHA1ハッシュ関数に対応する、 |
SHA256(literal) |
SHA256ハッシュ関数に対応する、 |
SHA384(literal) |
SHA384ハッシュ関数に対応する、 |
SHA512(literal) |
SHA512ハッシュ関数に対応する、 |
STR(RDF term) |
STR(x)は、 |
STRAFTER(literal, literal) |
StrAfter (x,y)は、 |
STRBEFORE(literal, literal) |
StrBefore (x,y)は、 |
STRDT(string, datatype) |
引数として渡される |
STRENDS(literal, match) |
文字列 |
STRLANG (string, languageTag) |
引数として渡された |
STRLEN(literal) |
|
STRSTARTS(literal, match) |
文字列 |
STRUUID() |
新しいUUIDのスキーム・セクションを含む文字列を戻します。 |
SUBSTR(term, startPos) |
|
SUBSTR(term, startPos, length) |
|
term IN (term list) |
|
term NOT IN (term list) |
|
TIMEZONE(argument) |
|
TZ(argument) |
|
UCASE(literal) |
|
URI(RDF term) |
IRI(RDF term)のシノニム |
UUID() |
新しいUniversal Unique Identifierを含むURIを戻します。この値およびバージョンは、PL/SQL関数 |
YEAR(argument) |
|
SEM_MATCHで使用可能な組込み関数の理解を深めるには、SPARQL問合せ言語指定(http://www.w3.org/TR/sparql11-query/
)において定義される組込み関数の説明も参照してください。
次のXMLスキーマをキャストする関数は、FILTER句で使用できます。これらの関数は、RDF語句を入力として取得して必要な型の新しいRDF語句を戻すか、RDF語句を目的の型にキャストできない場合はエラーを発生させます。型キャストの詳細は、XPath問合せの仕様(http://www.w3.org/TR/xpath-functions/#casting-from-primitive-to-primitive
)の17.1項を参照してください。これらの関数は、XMLネームスペースxsd : http://www.w3.org/2001/XMLSchema#
を使用します。
xsd:string (RDF term)
xsd:dateTime (RDF term)
xsd:boolean (RDF term)
xsd:integer (RDF term)
xsd:float (RDF term)
xsd:double (RDF term)
xsd:decimal (RDF term)
中カッコを含む構文を使用してグラフ・パターンを表現した場合、次のようになります。
問合せは常に、変数の一致する値の正規字句形式を戻します。
options
引数にHINT0={<hint-string>}を使用して指定するヒント(「SEM_MATCH表関数を使用したセマンティク・データの問合せ」を参照)は、ルートBGP内のグラフ・パターン部分に基づいてのみ構築する必要があります。たとえば、例1-13の問合せのヒント指定で使用できる有効な別名は、t0
、t1
、?x
および?y
のみです。インライン問合せオプティマイザ・ヒントを使用すると、グラフ・パターンの他の部分に影響を与えることができます(「インライン問合せオプティマイザ・ヒント」を参照)。
FILTER構成要素は、ロング・リテラルにバインドされた変数ではサポートされません。
例1-12 中カッコの構文
例1-12は、中カッコとピリオドを含む構文を使用して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-13 中カッコの構文およびOPTIONAL構成要素
例1-13では、各祖父の参加する試合の名前(いずれの試合にも参加しない場合はNULL)が戻されるように、OPTIONAL構成要素を使用して例1-12を変更しています。
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-14 中カッコの構文および複数パターンのOPTIONAL構成要素
OPTIONALグラフ・パターンに複数のトリプル・パターンが存在すると、オプションの変数の値は、OPTIONALグラフ・パターンの各トリプル・パターンに一致が検出された場合のみ戻されます。例1-14は例1-13を変更したもので、祖父ごとに、祖父と孫の両方が参加する試合の名前、または祖父と孫に共通の試合がない場合はnullが戻されるようになっています。ここでは、グローバル問合せオプティマイザ・ヒントも使用して、トリプル・パターンが各BGP内で順番に評価される必要があること、およびルートBGPをOPTIONAL BGPと結合するためにハッシュ結合を使用する必要があることを指定しています。
SELECT x, y, game FROM TABLE(SEM_MATCH( '{?x :grandParentOf ?y . ?x rdf:type :Male . OPTIONAL{?x :plays ?game . ?y :plays ?game} }', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb'), SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')), null, 'ALL_ORDERED ALL_BGP_HASH'));
例1-15 中カッコの構文およびネストしたOPTIONAL構成要素
単一の問合せに複数のOPTIONALグラフ・パターンを含むことが可能であり、ネスト化またはパラレル化することもできます。例1-15は、例1-14を変更してOPTIONALグラフ・パターンをネスト化したものです。この例では、祖父ごとに、(1)祖父が参加した試合、または祖父が試合に参加しなかった場合はnullを戻し、(2)祖父が試合に参加した場合は同じ試合に参加した孫の年齢、または孫と共通の試合がなかった場合はnullを戻します。例1-15では、ネストされたOPTIONALグラフ・パターン「?y :plays ?game . ?y :age ?age
」が一致しない場合でも、?game
に対して値が戻される点に注意してください。
SELECT x, y, game, age FROM TABLE(SEM_MATCH( '{?x :grandParentOf ?y . ?x rdf:type :Male . OPTIONAL{?x :plays ?game OPTIONAL {?y :plays ?game . ?y :age ?age} } }', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb'), SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')), null));
例1-16 中カッコの構文およびパラレルのOPTIONAL構成要素
例1-16では、パラレルのOPTIONALグラフ・パターンを使用して例1-14を変更しています。この例では、各祖父について、(1)祖父の参加する試合(いずれの試合にも参加しない場合はNULL)、および(2)祖父の電子メール・アドレス(電子メール・アドレスがない場合はNULL)が戻されます。ネストしたOPTIONALグラフ・パターンとは異なり、パラレルのOPTIONALグラフ・パターンはそれぞれ個別に処理されます。つまり、電子メール・アドレスが見つかると、それは試合が見つかったかどうかにかかわらず戻され、試合が見つかると、それは電子メール・アドレスが見つかったかどうかにかかわらず戻されます。
SELECT x, y, game, email FROM TABLE(SEM_MATCH( '{?x :grandParentOf ?y . ?x rdf:type :Male . OPTIONAL{?x :plays ?game} OPTIONAL{?x :email ?email} }', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb'), SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')), null));
例1-17 中カッコの構文およびFILTER構成要素
例1-17では、NYまたはCAに居住している祖父のみの孫の情報が戻されるように、FILTER構成要素を使用して例1-12を変更しています。
SELECT x, y
FROM TABLE(SEM_MATCH(
'{?x :grandParentOf ?y . ?x rdf:type :Male . ?x :residentOf ?z
FILTER (?z = "NY" || ?z = "CA")}',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null));
例1-18 中カッコの構文とREGEXおよびSTR組込み関数を使用したFILTER構成要素
例1-18では、REGEX組込み関数を使用して、Oracle電子メール・アドレスを持つすべての祖父を選択しています。正規表現パターン内のバックスラッシュ(\
)文字は、問合せ文字列内でエスケープする必要があります(たとえば\\.
はパターン\.
となります)。
SELECT x, y, z
FROM TABLE(SEM_MATCH(
'{?x :grandParentOf ?y . ?x rdf:type :Male . ?x :email ?z
FILTER (REGEX(STR(?z), "@oracle\\.com$"))}',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null));
例1-19 中カッコの構文とUNIONおよびFILTER構成要素
例1-19では、祖父がNYまたはCAに居住しているか、NYまたはCAに不動産を所有している場合にのみ、あるいは両方の条件がtrueの場合(祖父がNYまたはCAに居住し、かつ不動産を所有している場合)に祖父が戻されるように、UNION構成要素を使用して例1-17を変更しています。
SELECT x, y FROM TABLE(SEM_MATCH( '{?x :grandParentOf ?y . ?x rdf:type :Male {{?x :residentOf ?z} UNION {?x :ownsPropertyIn ?z}} FILTER (?z = "NY" || ?z = "CA")}', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb'), SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')), null));
SEM_MATCH問合せは、RDFデータセットに対して実行されます。RDFデータセットは、1つの名前なしグラフ(デフォルト・グラフ)および1つ以上の名前付きグラフを含むグラフのコレクションです(URIで識別されます)。GRAPH句に出現するグラフ・パターンは名前付きグラフのセットに対して照合され、GRAPH句に出現しないグラフ・パターンはデフォルト・グラフに対して照合されます。graphs
およびnamed_graphs
SEM_MATCHパラメータは、SEM_MATCH問合せに対してデフォルト・グラフおよび名前付きグラフのセットを構築するために使用されます。可能なデータセットの構成を、表1-13にまとめます。
表1-13 SEM_MATCHのgraphsとnamed_graphsの値、および結果のデータセット構成
パラメータの値 | デフォルト・グラフ | 名前付きグラフのセット |
---|---|---|
|
すべての名前なしトリプルと、すべての名前付きグラフ・トリプルのすべての和集合。(ただし、 |
すべての名前付きグラフ |
|
空のセット |
{g1,…, gn} |
|
{g1,…, gm}のUNION ALL |
空のセット |
|
{g1,…, gm}のUNION ALL |
{gn,…, gz} |
RDFデータセットとGRAPH構成要素の詳細は、W3C SPARQL仕様、特にhttp://www.w3.org/TR/rdf-sparql-query/#rdfDataset
も参照してください。
例1-20 名前付きグラフの構成要素
例1-20では、GRAPH構成要素を使用して、グラフ・パターン照合の範囲を特定の名前付きグラフに指定しています。この例では、<http://www.example.org/family/Smith>
名前付きグラフで、すべての人の名前および電子メール・アドレスを検出します。
SELECT name, email FROM TABLE(SEM_MATCH( '{GRAPH :Smith { ?x :name ?name . ?x :email ?email } }', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb'), SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')), null));
例1-21 named_graphsパラメータの使用
URIの他に、GRAPHキーワードの後に変数を使用できます。例1-21では、GRAPHキーワードとともに変数?g
を使用し、named_graphs
パラメータを使用して、?g
の可能な値を、<http://www.example.org/family/Smith>
および<http://www.example.org/family/Jones>
名前付きグラフに制限しています。SEM_ALIASES引数で指定される別名は、graphs
およびnamed_graphs
パラメータで使用できます。
SELECT name, email FROM TABLE(SEM_MATCH( '{GRAPH ?g { ?x :name ?name . ?x :email ?email } }', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb'), SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')), null,null,null,null, SEM_GRAPHS('<http://www.example.org/family/Smith>', ':Jones')));
例1-22 graphsパラメータの使用
例1-22では、デフォルト・グラフを使用して、<http://www.example.org/family/Smith>
と<http://www.example.org/family/Jones>
名前付きグラフの和集合を問い合せています。
FROM TABLE(SEM_MATCH( '{?x :name ?name . ?x :email ?email }', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb'), SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')), null,null,null, SEM_GRAPHS('<http://www.example.org/family/Smith>', ':Jones'), null));
SEM_MATCHでは、問合せパラメータに完全指定のSPARQL ASK問合せを使用できます。
ASK問合せは、指定の問合せパターンに対する解が存在するかどうかをテストするために使用されます。他の形式のSPARQL問合せとは異なり、ASK問合せでは問合せパターンの解に関する情報は返されません。かわりに、解が存在する場合は"true"^^xsd:boolean
、解が存在しない場合は"false"^^xsd:boolean
が返されます。
すべてのSPARQL ASK問合せは同じ列(ASK、ASK$RDFVID、ASK$_PREFIX、ASK$_SUFFIX、ASK$RDFVTYP、ASK$RDFCLOB、ASK$RDFLTYP、ASK$RDFLANG、SEM$ROWNUM)を返します。これらの列は、1つの?ask
変数を射影するSPARQL SELECT構文の問合せと同じであることに注意してください。
SPARQL ASK問合せは、同等のSPARQL SELECT構文の問合せよりもパフォーマンスが高くなります。ASK問合せは、問合せ変数の字句の値を取得する必要がなく、1つの結果が見つかると問合せの実行を停止できるためです。
SPARQL ASK問合せはSPARQL SELECT問合せと同じ構文を使用しますが、最上位のSELECT句をキーワードASKで置き換える必要があります。
例1-23 SPARQL ASK
例1-23に、10メガ・ピクセル超で50ドル未満のカメラが売り出されているかどうかを判別するSPARQL ASK問合せを示します。
SELECT ask FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/electronics/> ASK WHERE {?x :price ?p . ?x :megapixels ?m . FILTER (?p < 50 && ?m > 10) }', SEM_Models('electronics'), SEM_Rulebases('RDFS'), null, null));
SPARQL ASK問合せの詳細は、W3C SPARQL仕様、特にhttp://www.w3.org/TR/sparql11-query/#ask
も参照してください。
SEM_MATCHでは、問合せパラメータに完全指定のSPARQL CONSTRUCT問合せを使用できます。
CONSTRUCT問合せは、格納されているRDFデータからRDFグラフを構築するために使用されます。SPARQL SELECT問合せとは対照的に、CONSTRUCT問合せは問合せの解(変数バインディング)のセットではなくRDFトリプルのセットを返します。
すべてのSPARQL CONSTRUCT問合せは、SEM_MATCHから同じ列を返します。これらの列は、RDFトリプルの主語、述語および目的語に対応し、トリプルの構成要素ごとに10個の列があります。この他にSEM$ROWNUM列も返されます。具体的には返される列は次のとおりです。
SUBJ SUBJ$RDFVID SUBJ$_PREFIX SUBJ$_SUFFIX SUBJ$RDFVTYP SUBJ$RDFCLOB SUBJ$RDFLTYP SUBJ$RDFLANG SUBJ$RDFTERM SUBJ$RDFCLBT PRED PRED$RDFVID PRED$_PREFIX PRED$_SUFFIX PRED$RDFVTYP PRED$RDFCLOB PRED$RDFLTYP PRED$RDFLANG PRED$RDFTERM PRED$RDFCLBT OBJ OBJ$RDFVID OBJ$_PREFIX OBJ$_SUFFIX OBJ$RDFVTYP OBJ$RDFCLOB OBJ$RDFLTYP OBJ$RDFLANG OBJ$RDFTERM OBJ$RDFCLBT SEM$ROWNUM
各コンポーネントで、COMP、COMP$RDFVID、COMP$_PREFIX、COMP$_SUFFIX、COMP$RDFVTYP、COMP$RDFCLOB、COMP$RDFLTYPおよびCOMP$RDFLANGは、SPARQL SELECT問合せの同じ列の値に対応します。COMP$RDFTERMはN-Triple構文のVARCHAR2(4000) RDF語句を保持し、COMP$RDFCLBTはN-Triple構文のCLOB RDF語句を保持します。
SPARQL CONSTRUCT問合せはSPARQL SELECT問合せと同じ構文を使用しますが、最上位のSELECT句をCONSTRUCTテンプレートで置き換えます。CONSTRUCTテンプレートは、WHERE句に定義された問合せパターンの結果を使用して結果のRDFグラフの作成方法を決定します。CONSTRUCTテンプレートでは、キーワードCONSTRUCTの後に、中カッコで囲まれた一連のSPARQLトリプル・パターンが続きます。キーワードOPTIONAL、UNION、FILTER、MINUS、BIND、VALUESおよびGRAPHは、CONSTRUCTテンプレートでは使用できません。プロパティ・パス表現もCONSTRUCTテンプレート内で使用できません。ただし、WHERE句内の問合せパターンではこれらのキーワードを使用できます。
SPARQL CONSTRUCT問合せは、次の方法で結果のRDFグラフを構築します。WHERE句から返される結果行ごとに、変数値がCONSTRUCTテンプレートに代入され、1つ以上のRDFトリプルが作成されます。例1-24のWHERE句のグラフ・パターンが次の結果行を返すとします。
E$RDFTERM | FNAME$RDFTERM | LNAME$RDFTERM |
---|---|---|
ent:employee1 |
"Fred" |
"Smith" |
ent:employee2 |
"Jane" |
"Brown" |
ent:employee3 |
"Bill" |
"Jones" |
例1-24のSEM_MATCH CONSTRUCT問合せ全体は、6個のRDFトリプルに対応する次の行を返します(問合せパターンの結果行ごとに2個ずつ)。
SUBJ$RDFTERM | PRED$RDFTERM | OBJ$RDFTERM |
---|---|---|
ent:employee1 |
foaf:givenName |
"Fred" |
ent:employee1 |
foaf:familyName |
"Smith" |
ent:employee2 |
foaf:givenName |
"Jane" |
ent:employee2 |
foaf:familyName |
"Brown" |
ent:employee3 |
foaf:givenName |
"Bill" |
ent:employee3 |
foaf:familyName |
"Jones" |
SPARQL CONSTRUCTの動作に影響を与えるSEM_MATCH問合せオプションが2つあります。CONSTRUCT_UNIQUE=T
およびCONSTRUCT_STRICT=T
です。CONSTRUCT_UNIQUE=T
問合せオプションを使用すると、CONSTRUCT問合せから一意のRDFトリプルのみが返されます。 CONSTRUCT_STRICT=T
問合せオプションを使用すると、CONSTRUCT問合せから有効なRDFトリプルのみが返されます。有効なRDFトリプルは、主語の位置にURIまたは空白ノードがあり(1)、述語の位置にURIがあり(2)、目的語の位置にURI、空白ノードまたはRDFリテラルがあります(3)。問合せのパフォーマンスが向上するように、これらの問合せオプションはいずれもデフォルトではオフになっています。
例1-24 SPARQL CONSTRUCT
例1-24に、foafボキャブラリを使用して従業員名のRDFグラフを構築するSPARQL CONSTRUCT問合せを示します。
SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm FROM TABLE(SEM_MATCH( 'PREFIX ent: <http://www.example.org/enterprise/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> CONSTRUCT {?e foaf:givenName ?fname . ?e foaf:familyName ?lname } WHERE {?e ent:fname ?fname . ?e ent:lname ?lname }', SEM_Models('enterprise'), SEM_Rulebases('RDFS'), null, null));
例1-25 解の修飾子を含むCONSTRUCT
SPARQLの解の修飾子をCONSTRUCT問合せで使用できます。例1-25に、ORDER BYとLIMITを使用して、最も給与が高い2人の従業員のグラフを構築する方法を示します。LIMIT 2句はCONSTRUCT問合せ全体ではなく問合せパターンに適用されることに注意してください。つまり、問合せパターンは2つの結果行を返しますが、CONSTRUCT問合せ全体は6個のRDFトリプル(?e
にバインドされた従業員2人に3個ずつ)を返します。
SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm FROM TABLE(SEM_MATCH( 'PREFIX ent: <http://www.example.org/enterprise/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> CONSTRUCT { ?e ent:fname ?fname . ?e ent:lname ?lname . ?e ent:dateOfBirth ?dob } WHERE { ?e ent:fname ?fname . ?e ent:lname ?lname . ?e ent:salary ?sal } ORDER BY DESC(?sal) LIMIT 2', SEM_Models('enterprise'), SEM_Rulebases('RDFS'), null, null));
例1-26 SPARQL 1.1機能とCONSTRUCT
SPARQL 1.1の機能は、CONSTRUCT問合せパターン内でサポートされます。例1-26に、CONSTRUCT問合せで使用されている副問合せとSELECT式を示します。
SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm FROM TABLE(SEM_MATCH( 'PREFIX ent: <http://www.example.org/enterprise/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> CONSTRUCT { ?e foaf:name ?name } WHERE { SELECT ?e (CONCAT(?fname," ",?lname) AS ?name) WHERE { ?e ent:fname ?fname . ?e ent:lname ?lname } }', SEM_Models('enterprise'), SEM_Rulebases('RDFS'), null, null));
例1-27 名前付きグラフを含むSPARQL CONSTRUCT
名前付きグラフ・データをSPARQL CONSTRUCT問合せで返すことはできません。W3C SPARQL仕様に従って、RDFクワッドではなくRDFトリプルのみが返されるためです。ただし、FROM、FROM NAMEDおよびGRAPHキーワードは、WHERE句に定義された問合せパターンと一致する場合に使用できます。
例1-27は、名前付きグラフent:g1
とent:g2
のUNIONのent:name
トリプル、名前付きグラフent:g3
のent:dateOfBirth
トリプル、および名前付きグラフent:g4
のent:ssn
トリプルを含むRDFグラフを作成します。
SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm FROM TABLE(SEM_MATCH( 'PREFIX ent: <http://www.example.org/enterprise/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> CONSTRUCT { ?e ent:name ?name . ?e ent:dateOfBirth ?dob . ?e ent:ssn ?ssn } FROM ent:g1 FROM ent:g2 FROM NAMED ent:g3 FROM NAMED ent:g4 WHERE { ?e foaf:name ?name . GRAPH ent:g3 { ?e ent:dateOfBirth ?dob } GRAPH ent:g4 { ?e ent:ssn ?ssn } }', SEM_Models('enterprise'), SEM_Rulebases('RDFS'), null, null));
例1-28 SPARQL CONSTRUCTの標準形
SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm FROM TABLE(SEM_MATCH( 'PREFIX ent: <http://www.example.org/enterprise/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> CONSTRUCT {?e foaf:givenName ?fname . ?e foaf:familyName ?lname } WHERE {?e ent:fname ?fname . ?e ent:lname ?lname }', SEM_Models('enterprise'), SEM_Rulebases('RDFS'), null, null));
例1-29 SPARQL CONSTRUCTの短縮形
CONSTRUCTテンプレートがWHERE句とまったく同じ場合、CONSTRUCTの短縮形を使用できます。このケースではキーワードCONSTRUCTのみが必要です。WHERE句のグラフ・パターンもCONSTRUCTテンプレートとして使用されます。例1-29に、例1-28の短縮形を示します。
SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm FROM TABLE(SEM_MATCH( 'PREFIX ent: <http://www.example.org/enterprise/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> CONSTRUCT WHERE {?e ent:fname ?fname . ?e ent:lname ?lname }', SEM_Models('enterprise'), SEM_Rulebases('RDFS'), null, null));
SPARQL CONSTRUCTの一般的なワークフローでは、CONSTRUCT問合せを実行して、既存のセマンティク・モデルのRDFトリプル・データを抽出または変換し(あるいは両方を行い)、そのデータを既存または新規セマンティク・モデルにロードします。データのロードは、単純なINSERT文を使用するかSEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャを実行して行います。
例1-30 SPARQL CONSTRUCTのワークフロー
例1-30は、既存のent:fname
およびent:lname
トリプルからfoaf:name
トリプルを作成し、それらの新しいトリプルを元のモデルにバルク・ロードします。その後、元のモデルにfoaf:name
値を問い合せることができます。
-- use create table as select to build a staging table CREATE TABLE STAB(RDF$STC_sub, RDF$STC_pred, RDF$STC_obj) AS SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm FROM TABLE(SEM_MATCH( 'PREFIX ent: <http://www.example.org/enterprise/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> CONSTRUCT { ?e foaf:name ?name } WHERE { SELECT ?e (CONCAT(?fname," ",?lname) AS ?name) WHERE { ?e ent:fname ?fname . ?e ent:lname ?lname } }', SEM_Models('enterprise'), null, null, null)); -- grant privileges on STAB GRANT SELECT ON STAB TO MDSYS; -- bulk load data back into the enterprise model BEGIN SEM_APIS.BULK_LOAD_FROM_STAGING_TABLE( model_name=>'enterprise', table_owner=>'rdfuser', table_name=>'stab', flags=>' parallel_create_index parallel=4 '); END; / -- query for foaf:name data SELECT e$rdfterm, name$rdfterm FROM TABLE(SEM_MATCH( 'PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?e ?name WHERE { ?e foaf:name ?name }', SEM_Models('enterprise'), null, null, null));
SPARQL CONSTRUCT問合せの詳細は、W3C SPARQL仕様、特にhttp://www.w3.org/TR/sparql11-query/#construct
も参照してください。
SEM_MATCHでは、問合せパラメータに完全指定のSPARQL DESCRIBE問合せを使用できます。
SPARQL DESCRIBE問合せは、RDFデータセットの調査に役立ちます。データセットで使用される正確なRDFプロパティの情報を把握していなくても、指定された1つのリソースまたは一連のリソースについて簡単に情報を見つけることができます。DESCRIBE問合せはリソースr
の説明を返します。この説明は、主語または目的語の位置にr
を含む、問合せデータセットの一連のRDFトリプルです。
CONSTRUCT問合せと同じく、DESCRIBE問合せは結果バインディングのかわりにRDFグラフを返します。したがって、各DESCRIBE問合せはCONSTRUCT問合せと同じ列を返します(戻り列のリストは、「グラフ・パターン: SPARQL CONSTRUCT構文のサポート」を参照してください)。
SPARQL DESCRIBE問合せはSPARQL SELECT問合せと同じ構文を使用しますが、最上位のSELECT句をDESCRIBE句で置き換えます。DESCRIBE句の構成として、DESCRIBEキーワードの後に一連のURIまたは変数(あるいは両方)を空白で区切って指定するか、DESCRIBEキーワードの後に* (1つのアスタリスク)を指定します。
SPARQL DESCRIBE問合せに影響を与えるSEM_MATCH問合せオプションが2つあります。CONSTRUCT_UNIQUE=T
およびCONSTRUCT_STRICT=T
です。CONSTRUCT_UNIQUE=T
によって結果から重複したトリプルが消去され、CONSTRUCT_STRICT=T
によって結果から無効なトリプルが消去されます。これらのオプションは両方ともデフォルトではオフになっています。これらのオプションの詳細は、「グラフ・パターン: SPARQL CONSTRUCT構文のサポート」を参照してください。
SPARQL DESCRIBET問合せの詳細は、W3C SPARQL仕様、特にhttp://www.w3.org/TR/sparql11-query/#describe
も参照してください。
例1-31 SPARQL DESCRIBEの短縮形
SPARQL DESCRIBEの短縮形は、一定の1つのURIを記述するために用意されています。短縮形ではDESCRIBE句のみが必要です。例1-31に、SPARQL DESCRIBE問合せの短縮形を示します。
SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm FROM TABLE(SEM_MATCH( 'DESCRIBE <http://www.example.org/enterprise/emp_1>', SEM_Models('enterprise'), null, null, null));
例1-32 SPARQL DESCRIBEの標準形
SPARQL DESCRIBEの標準形では、DESCRIBE句とSPARQL問合せパターン(解の修飾子を含む場合もある)が指定されます。例1-32に、所属部門がニュー・ハンプシャーにあるすべての従業員を説明するSPARQL DESCRIBE問合せを示します。
SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm FROM TABLE(SEM_MATCH( 'PREFIX ent: <http://www.example.org/enterprise/> DESCRIBE ?e WHERE { ?e ent:department ?dept . ?dept ent:locatedIn "New Hampshire" }', SEM_Models('enterprise'), null, null, null));
例1-33 DESCRIBE *
例1-32に示す標準形のDESCRIBEでは、DESCRIBE句に指定された変数にバインドされるすべてのリソースが説明されます。例1-32では、問合せパターンから返され、?e
にバインドされているすべての従業員が説明されます。DESCRIBE *が使用されると、問合せに含まれるすべての変数が説明されます。
例1-33は例1-32を変更したもので、従業員(?e
にバインド)と部門(?dept
にバインド)の両方を説明しています。
SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm FROM TABLE(SEM_MATCH( 'PREFIX ent: <http://www.example.org/enterprise/> DESCRIBE * WHERE { ?e ent:department ?dept . ?dept ent:locatedIn "New Hampshire" }', SEM_Models('enterprise'), null, null, null));
中カッコのグラフ・パターンに加えて、SEM_MATCHでは、query
パラメータに完全指定のSPARQL SELECT問合せを使用できます。SPARQL SELECT構文オプションを使用すると、SEM_MATCHは問合せ構成要素のBASE、PREFIX、SELECT、SELECT DISTINCT、FROM、FROM NAMED、WHERE、ORDER BY、LIMITおよびOFFSETをサポートします。各SPARQL SELECT構文の問合せは、SELECT句とグラフ・パターンを含める必要があります。
SEM_MATCHを使用する場合の中カッコとSPARQL SELECT構文の主な違いは、SPARQL SELECT構文を使用する場合、SPARQL SELECT句に出現している変数のみがSEM_MATCHから戻されるところにあります。
SPARQL SELECT構文を使用する場合、SEM$ROWNUMという1つの追加列がSEM_MATCHから戻されます。このNUMBER列を使用して、結果の順序がSPARQL ORDER BY句で指定された順序と一致するようにSEM_MATCH問合せの結果を並べ替えることができます。
SPARQL ORDER BY句を使用すると、SEM_MATCH問合せの結果を並べ替えることができます。この句によって、指定された問合せの結果を並べ替えるために使用する一連のコンパレータを指定します。コンパレータは、変数、RDF語句、算術演算子(+、-、*、/)、ブール演算子と論理連結語(||、&&、!)、比較演算子(<、>、<=、>=、=、!=)およびFILTER式で使用可能な任意の関数で作成される式で構成されます。
SPARQL SELECT問合せを評価する場合は、次の順序で操作を実行します。
グラフ・パターン照合
グループ化(「グループ化と集計」を参照してください。)
集計(「グループ化と集計」を参照してください。)
HAVING (「グループ化と集計」を参照してください。)
VALUES (「値の割当て」を参照してください。)
SELECT式
並べ替え
投影
個別
オフセット
制限
SPARQL BASE、PREFIX、SELECT、SELECT DISTINCT、FROM、FROM NAMED、WHERE、ORDER BY、LIMITおよびOFFSET構成要素については、W3C SPARQL仕様、特にhttp://www.w3.org/TR/sparql11-query/
を参照してください。
例1-34 SPARQL PREFIX、SELECTおよびWHERE句
例1-34では、次のSPARQL構成要素を使用しています。
SPARQL PREFIX句(http://www.example.org/family/
およびhttp://xmlns.com/foaf/0.1/
名前空間に対して略称を指定する場合)
SPARQL SELECT句: 問合せから抽出する変数のセットを指定します。
SPARQL WHERE句: 問合せグラフ・パターンを指定します。
SELECT y, name FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/family/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?y ?name WHERE {?x :grandParentOf ?y . ?x foaf:name ?name }', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb'), null, null));
例1-34では、y、y$RDFVID、y$_PREFIX、y$_SUFFIX、y$RDFVTYP、y$RDFCLOB、y$RDFLTYP、y$RDFLANG、name、name$RDFVID、name$_PREFIX、name$_SUFFIX、name$RDFVTYP、name$RDFCLOB、name$RDFLTYP、name$RDFLANGおよびSEM$ROWNUMの各列を戻します。
例1-35 SPARQL SELECT * (トリプル・パターン内のすべての変数)
SPARQL SELECT句では、(A)一連の変数または式あるいはその両方(「SELECT句の式」を参照)を指定するか、(B) アスタリスク(*)を使用して、指定されたトリプル・パターンで出現するすべての変数を射影します。例1-35では、SPARQL SELECT句を使用して、指定されたトリプル・パターンで出現するすべての変数を選択しています。
SELECT x, y, name
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/family/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT *
WHERE
{?x :grandParentOf ?y .
?x foaf:name ?name }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
null, null));
例1-36 SPARQL SELECT DISTINCT
DISTINCTキーワードをSELECTの後に使用すると重複結果行を除外できます。例1-36では、SELECT DISTINCTを使用して重複しない名前のみを選択しています。
SELECT name
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/family/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?name
WHERE
{?x :grandParentOf ?y .
?x foaf:name ?name }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
null, null));
例1-37 FROMおよびFROM NAMEDを使用したRDFデータセットの指定
SPARQL FROMおよびFROM NAMEDは、問合せに対してRDFデータセット指定する場合に使用します。FROM句はデフォルト・グラフを構成するグラフのセットを指定する場合に使用し、FROM NAMED句は名前付きグラフ・セットを構成するグラフ・セットを指定する場合に使用します。例1-37では、FROMおよびFROM NAMEDを使用して、<http://www.friends.com/friends>
および<http://www.contacts.com/contacts>
グラフの和集合から電子メール・アドレスと友人を選択し、<http://www.example.org/family/Smith>
および<http://www.example.org/family/Jones>
グラフから祖父母情報を選択しています。
SELECT x, y, z, email FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/family/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX friends: <http://www.friends.com/> PREFIX contacts: <http://www.contacts.com/> SELECT * FROM friends:friends FROM contacts:contacts FROM NAMED :Smith FROM NAMED :Jones WHERE {?x foaf:frendOf ?y . ?x :email ?email . GRAPH ?g { ?x :grandParentOf ?z } }', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb'), null, null));
例1-38 SPARQL ORDER BY
SPARQL ORDER BY句の場合:
単一の変数の順序付け条件には前後のカッコは不要ですが、より複雑な順序付け条件にはカッコが必要です。
オプションのASC()またはDESC()順序修飾子を使用して、それぞれ昇順または降順となる目的の順序を指定できます。デフォルトの順序は昇順です。
SEM_MATCHでSPARQL ORDER BYを使用する場合、取り囲んでいるSQLブロック全体を通じて目的の順序を維持するためには、格納側のSQL問合せをSEM$ROWNUMで並べ替える必要があります。
例1-38では、SPARQL ORDER BY句ですべてのカメラを選択し、タイプの降順かつ合計(price * (1 - discount) * (1 + tax)
)の昇順になるように順序を指定しています。
SELECT * FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/electronics/> SELECT * WHERE {?x :price ?p . ?x :discount ?d . ?x :tax ?t . ?x :cameraType ?cType . } ORDER BY DESC(?cType) ASC(?p * (1-?d) * (1+?t))', SEM_Models('electronics'), SEM_Rulebases('RDFS'), null, null)) ORDER BY SEM$ROWNUM;
例1-39 SPARQL LIMIT
SPARQL LIMITおよびSPARQL OFFSETは、問合せの解の異なるサブセットを選択するために使用できます。例1-39ではSPARQL LIMITを使用して最も安価なカメラを5つ選択し、例1-40ではSPARQL LIMITおよびOFFSETを使用して5番目から10番目に安価なカメラを選択しています。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
}
ORDER BY ASC(?p)
LIMIT 5
',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null))
ORDER BY SEM$ROWNUM;
例1-40 SPARQL OFFSET
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
}
ORDER BY ASC(?p)
LIMIT 5
OFFSET 5',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null))
ORDER BY SEM$ROWNUM;
例1-41 完全なURIを使用した問合せ
SPARQL BASEキーワードは、グローバル接頭辞を設定するために使用します。すべての相対IRIは、「Uniform Resource Identifier (URI): Generic Syntax」(RFC3986)(http://www.ietf.org/rfc/rfc3986.txt
)の5.2項で説明されている基本的なアルゴリズムを使用して、ベースIRIで解決されます。例1-41は完全なURIを使用する簡単な問合せで、例1-42はベースIRIを使用する同等の問合せです。
SELECT * FROM TABLE(SEM_MATCH( 'SELECT ?employee ?position WHERE {?x <http://www.example.org/employee> ?p . ?p <http://www.example.org/employee/name> ?employee . ?p <http://www.example.org/employee/position> ?pos . ?pos <http://www.example.org/positions/name> ?position }', SEM_Models('enterprise'), null, null, null)) ORDER BY 1,2;
例1-42 ベースIRIを使用した問合せ
SELECT * FROM TABLE(SEM_MATCH( 'BASE <http://www.example.org/> SELECT ?employee ?position WHERE {?x <employee> ?p . ?p <employee/name> ?employee . ?p <employee/position> ?pos . ?pos <positions/name> ?position }', SEM_Models('enterprise'), null, null, null)) ORDER BY 1,2;
SEM_MATCHでは、次のSPARQL 1.1の構成要素がサポートされています。
SELECT句では式を使用して、問合せから式の値を射影することができます。SELECT式は、変数、RDF語句、算術演算子(+、-、*、/)、ブール演算子と論理連結語(||、&&、!)、比較演算子(<、>、<=、>=、=、!=)およびFILTER式で使用可能な任意の関数で構成されます。式は、ASキーワードを使用して別名として単一の変数を指定する必要があり、<expression> AS <alias>フラグメント全体をカッコで囲む必要があります。この別名変数は、問合せで事前に定義することはできません。SELECT式は、前のSELECT式(つまり、SELECT句の前の方で指定された式)の結果を参照する場合があります。
例1-43 SPARQL SELECT式
例1-43では、SELECT式を使用してカメラごとの合計を射影しています。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ((?p * (1-?d) * (1+?t)) AS ?totalPrice)
WHERE
{?x :price ?p .
?x :discount ?d .
?x :tax ?t .
?x :cameraType ?cType .
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
例1-44 SPARQL SELECT式(2)
例1-44では、2つのSELECT式を使用して、売上税がある場合とない場合の割引価格を射影しています。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ((?p * (1-?d)) AS ?preTaxPrice) ((?preTaxPrice * (1+?t)) AS ?finalPrice)
WHERE
{?x :price ?p .
?x :discount ?d .
?x :tax ?t .
?x :cameraType ?cType .
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
副問合せは、SPARQL SELECT構文で可能です。つまり、完全指定のSPARQL SELECT問合せが、他のSPARQL SELECT問合せ内に埋め込まれる場合があります。副問合せには、問合せのサブコンポーネントからの結果数を制限する場合など、多くの用途があります。
例1-45 SPARQL SELECT副問合せ
例1-45では、最も安価なカメラを製造するメーカーを検索し、このメーカーが製造した他のすべてのカメラを検索するために副問合せを使用しています。
SELECT * FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/electronics/> SELECT ?c1 WHERE {?c1 rdf:type :Camera . ?c1 :manufacturer ?m . { SELECT ?m WHERE {?c2 rdf:Type :Camera . ?c2 :price ?p . ?c2 :manufacturer ?m . } ORDER BY ASC(?p) LIMIT 1 } }', SEM_Models('electronics'), SEM_Rulebases('RDFS'), null, null));
副問合せが最初に論理的に評価され、その結果が外部問合せに射影されます。外部問合せから参照できるのは、副問合せのSELECT句で射影された変数のみです。
グループ化を実行するにはGROUP BYキーワードを使用します。構文上、GROUP BYキーワードはWHERE句の後、および解の修飾子(ORDER BYまたはLIMITなど)の前に使用する必要があります。
集計は、グループ内の結果全体の値を計算するために使用されます。集計は値のコレクションを操作して、結果として単一の値を生成します。SEM_MATCHは、組込みの集計としてCOUNT、SUM、MIN、MAX、AVG、GROUP_CONCATおよびSAMPLEをサポートしています。これらの集計を、表1-14で説明します。
表1-14 組込みの集計
集計 | 説明 |
---|---|
AVG(expression) |
グループ内の値に対するexpressionの平均値を返します。 |
COUNT(* | expression) |
expressionがグループ内にバインドされた非エラー値を持つ回数がカウントされ、アスタリスク(*)ではグループ内の結果数がカウントされます。 |
GROUP_CONCAT(expression [; SEPARATOR = "STRING"]) |
グループ内の値に関して、expressionの文字列連結を実行します。オプションのセパレータ文字列を指定すると、各値の間にセパレータ文字が配置されます。 |
MAX(expression) |
SPARQL ORDER BYによって定義される順序付けに基づいて、グループ内のexpressionの最大値を戻します。 |
MIN(expression) |
SPARQL ORDER BYによって定義される順序付けに基づいて、グループ内のexpressionの最少値を戻します。 |
SAMPLE(expression) |
グループから単一の任意の値と評価されるexpressionを戻します。 |
SUM(expression) |
グループ内の値に関してexpressionの数値合計を計算します。 |
グループ化と集計の使用時には、変数参照に特定の制限が適用されます。グループ化変数(GROUP BY句の単一の変数)およびGROUP BY値割当てからの別名変数のみを、SELECT句またはHAVING句内の非集計式で使用できます。
例1-46 簡単なグループ化の問合せ
例1-46に、GROUP BYキーワードを使用してすべての種類のカメラを検索する問合せを示します。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?cType
WHERE
{?x rdf:type :Camera .
?x :cameraType ?cType .
}
GROUP BY ?cType',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
グループ化問合せは、グループ化式(例1-46の?cType
)に基づいて問合せ結果をグループのコレクションに分割して、グループ内の各結果がグループ化式に関しては同じ値を持つようにします。グループ操作の最終結果には、各グループに1つの行が含まれます。
例1-47 複雑なグループ化式
グループ化式では、変数、式、または「<expression>
as
<alias>
」の形式を持つ値割当てを1つ以上、ひと続きで指定します。例1-47は、グループ化式で各タイプのコンポーネントを1つずつ使用しているグループ化問合せを示しています。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?cType ?totalPrice
WHERE
{?x rdf:type :Camera .
?x :cameraType ?cType .
?x :manufacturer ?m .
?x :price ?p .
?x :tax ?t .
}
GROUP BY ?cType (STR(?m)) ((?p*(1+?t)) AS ?totalPrice)',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
例1-48 集計
例1-48では、集計を使用して、各種類のカメラの最高、最低、平均価格を選択しています。
SELECT * FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/electronics/> SELECT ?cType (MAX(?p) AS ?maxPrice) (MIN(?p) AS ?minPrice) (AVG(?p) AS ?avgPrice) WHERE {?x rdf:type :Camera . ?x :cameraType ?cType . ?x :manufacturer ?m . ?x :price ?p . } GROUP BY ?cType', SEM_Models('electronics'), SEM_Rulebases('RDFS'), null, null));
例1-49 グループ化なしの集計
集計をグループ化式なしで使用すると、結果セット全体が単一のグループとして処理されます。例1-49では、データセット全体のカメラの合計数を計算しています。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT (COUNT(?x) as ?cameraCnt)
WHERE
{ ?x rdf:type :Camera
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
例1-50 DISTINCTを使用した集計
DISTINCTキーワードは、必要に応じて、集計ごとに修飾子として使用できます。DISTINCTを使用すると、集計を計算する前に各グループから重複値が除外されます。構文上、DISTINCTは集計の最初の引数として使用される必要があります。例1-50では、重複なしのカメラ・メーカー数を検索するためにDISTINCTを使用しています。この場合、STR(?m)
の重複値は、カウント前に除外されます。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT (COUNT(DISTINCT STR(?m)) as ?mCnt)
WHERE
{ ?x rdf:type :Camera .
?x :manufacturer ?m
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
例1-51 HAVING句
制約に基づいてグループをフィルタ処理するには、HAVINGキーワードを使用できます。HAVING式は、変数、RDF語句、算術演算子(+、-、*、/)、ブール演算子と論理連結語(||、&&、!)、比較演算子(<、>、<=、>=、=、!=)、集計、およびFILTER式で使用可能な任意のファンクションで構成できます。構文上、HAVINGキーワードはGROUP BY句の後、および他の解の修飾子(ORDER BYまたはLIMITなど)の前に使用します。
例1-51では、HAVING式を使用して、200ドル未満のカメラを販売するすべてのメーカーを検索しています。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?m
WHERE
{ ?x rdf:type :Camera .
?x :manufacturer ?m .
?x :price ?p
}
GROUP BY ?m
HAVING (MIN(?p) < 200)
ORDER BY ASC(?m)',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
SEM_MATCHでは、SPARQL問合せパターンでNOT EXISTSおよびMINUSの2つの形式の否定がサポートされています。NOT EXISTSはグラフ・パターンが一致したかどうかに基づいて結果をフィルタ処理するために使用可能で、MINUSは別のグラフ・パターンとの関係に基づいて解を除外するために使用できます。
例1-52 NOT EXISTSによる否定
例1-52では、NOT EXISTS FILTERを使用して、ユーザー・レビューのないカメラを選択しています。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
FILTER( NOT EXISTS({?x :userReview ?r}) )
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
例1-53 EXISTS
逆に、EXISTS演算子は、パターンの一致を確認する場合に使用できます。例1-53では、EXISTS FILTERを使用して、ユーザー・レビューを持つカメラのみを選択しています。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
FILTER( EXISTS({?x :userReview ?r}) )
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
例1-54 MINUSによる否定
例1-54では、MINUSを使用して、例1-52と同じ結果を得ています。MINUSパターンの解と互換性がない解のみが、結果に含まれます。つまり、解がすべての共有変数にMINUSパターンの解と同じ値を持つ場合、それは結果から除外されます。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
MINUS {?x :userReview ?r}
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
例1-55 NOT EXISTSによる否定(2)
NOT EXISTSとMINUSは2つの異なるスタイルの否定を表し、特定の状況では異なる結果を持ちます。例としては、否定パターンと残りの問合せの間で変数が共有されない場合が挙げられます。たとえば、例1-55のNOT EXISTS問合せでは{?subj ?prop ?obj}
がどのトリプルにも一致するためすべての解が除外されますが、例1-56のMINUS問合せでは、共有変数がないため除外される解はありません。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
FILTER( NOT EXISTS({?subj ?prop ?obj}) )
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
例1-56 MINUSによる否定(2)
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
MINUS {?subj ?prop ?obj}
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
SEM_MATCHには、値をSPARQL問合せの変数に割り当てる様々な方法が提供されています。
式の値を新しい変数に割り当てる方法には、(1)SELECT句の式、(2)GROUP BY句の式、および(3)BINDキーワードの3つがあります。どの場合も、新しい変数を問合せで事前に定義しておく必要はありません。割当て後は、この新しい変数を問合せで使用して、結果に戻すことが可能です。「SELECT句の式」で説明したように、値割当ての構文は(<expression> AS <alias>)となり、aliasは新しい変数を示し、たとえば((?price * (1+?tax)) AS ?totalPrice)
とします。
例1-57 ネストしたSELECT式
例1-57では、ネストしたSELECT式を使用して、カメラの合計価格を計算し、その値を変数(?totalPrice
)に割り当てています。その後、この変数を外部問合せのFILTERで使用して、200ドル未満のカメラを検索します。
SELECT * FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/electronics/> SELECT ?x ?cType ?totalPrice WHERE {?x :cameraType ?cType . { SELECT ?x ( ((?price*(1+?tax)) AS ?totalPrice ) WHERE { ?x :price ?price . ?x :tax ?tax } } FILTER (?totalPrice < 200) }', SEM_Models('electronics'), SEM_Rulebases('RDFS'), null, null));
例1-58 BIND
BINDキーワードは、基本グラフ・パターン内で値を割り当てるために使用可能で、構文上は同等のネストしたSELECT式より簡潔です。例1-58では、BINDキーワードを使用して、例1-57と論理的に同等な問合せを表しています。
SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?totalPrice
WHERE
{?x :cameraType ?cType .
?x :price ?price .
?x :tax ?tax .
BIND ( ((?price*(1+?tax)) AS ?totalPrice )
FILTER (?totalPrice < 200)
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));
例1-59 GROUP BY式
GROUP BY句の値割当ては、その後SELECT句、HAVING句および外部問合せ(ネストしたグループ化問合せの場合)で使用することができます。例1-59では、GROUP BY式を使用して、1000ドル未満の各価格のカメラの最大メガピクセル数を検索しています。
SELECT * FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/electronics/> SELECT ?totalPrice (MAX(?mp) as ?maxMP) WHERE {?x rdf:type :Camera . ?x :price ?price . ?x :tax ?tax . GROUP BY ( ((?price*(1+?tax)) AS ?totalPrice ) HAVING (?totalPrice < 1000) }', SEM_Models('electronics'), SEM_Rulebases('RDFS'), null, null));
例1-60 VALUES
新しい変数に式の値を割り当てる方法には、前述の3つの方法の他にVALUESキーワードを使用する方法があり、順序付けられていない解の順序を取得して、結合操作によって問合せ結果と組み合せることができます。VALUESブロックは、問合せパターン内、またはSPARQL SELECT問合せブロックの末尾の解の修飾子の後に使用できます。VALUES構成要素は、副問合せで使用できます。
例1-60では、VALUESキーワードを使用して、問合せ結果を:Company1
製造のDSLRカメラ、または:Company2
製造の任意の種類のカメラに制限しています。キーワードUNDEFは、解の順序内でバインドされていない変数を表すために使用されます。
SELECT * FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/electronics/> SELECT ?x ?cType ?m WHERE { ?x rdf:type :Camera . ?x :cameraType ?cType . ?x :manufacturer ?m } VALUES (?cType ?m) { ("DSLR" :Company1) (UNDEF :Company2) }', SEM_Models('electronics'), SEM_Rulebases('RDFS'), null, null));
例1-61 簡略化されたVALUES構文
変数が1つの一般的な例では、簡略化された構文を使用できます。特に、変数および各解の前後のカッコは省略できます。例1-61は、簡略化された構文を使用して、問合せ結果を:Company1
または:Company2
によって製造されたカメラに制限しています。
SELECT * FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/electronics/> SELECT ?x ?cType ?m WHERE { ?x rdf:type :Camera . ?x :cameraType ?cType . ?x :manufacturer ?m } VALUES ?m { :Company1 :Company2 }', SEM_Models('electronics'), SEM_Rulebases('RDFS'), null, null));
例1-62 インラインVALUESブロック
例1-62でも、問合せ結果を:Company1
または:Company2
製造のカメラに制限していますが、問合せパターン内でVALUESブロックを指定しています。
SELECT * FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/electronics/> SELECT ?x ?cType ?m WHERE { VALUES ?m { :Company1 :Company2 } ?x rdf:type :Camera . ?x :cameraType ?cType . ?x :manufacturer ?m }', SEM_Models('electronics'), SEM_Rulebases('RDFS'), null, null));
SPARQLプロパティ・パスは、RDFグラフ内の2つのRDFリソース(ノード)の間の可能なパスを示しています。プロパティ・パスはトリプル・パターンの述語位置に出現するもので、トリプル・パターンの主語からトリプル・パターンの目的語までのパスを形成するプロパティ(エッジ)に制約を適用するために、正規表現のような構文を使用します。プロパティ・パスによって、SPARQL問合せはRDFグラフの任意の長さのパスを照合し、他のグラフ・パターンを表現する簡潔な方法を提供できます。
表1-15に、SPARQLプロパティ・パスの構築に使用可能な構文構成要素を示します。iriはIRIまたは接頭辞の付いた名前で、eltはプロパティ・パス要素で、それ自体が他のプロパティ・パス要素で構成される場合があります。
表1-15 プロパティ・パスの構文の構成要素
構文の構成要素 | 一致 |
---|---|
iri |
IRIまたは接頭辞の付いた名前。長さが1のパス。 |
^elt |
逆のパス(目的語から主語へ)。 |
!iriまたは!(iri1 | … | irin) |
否定プロパティ・セット。 iriiのいずれかではないIRI。 |
!^iriまたは!(iri1 | … | irij | ^irij+1 | … | ^irin) |
逆のプロパティを持つ否定プロパティ・セット。iriiまたはirij+1...irinのいずれでもない逆パスのIRI。!^iriは!(^iri)の短縮形。プロパティと逆のプロパティの順番は、どちらが先でも問題ありません。順不同で実行されます。 |
(elt) |
グループ・パスelt(カッコは優先順位を制御します)。 |
elt1 / elt2 |
elt1、elt2の順の順序パス。 |
elt1 | elt2 |
elt1またはelt2の代替パス(すべての可能性が試行されます)。 |
elt* |
0個以上のeltのパス。 |
elt+ |
1個以上のeltのパス。 |
elt? |
0個または1個のeltのパス。 |
構文構成要素の優先順位を、高いものから順に示します。
IRI、接頭辞の付いた名前
否定プロパティ・セット
グループ
単項演算子 *、?、+
単項^逆リンク
二項演算子 /
二項演算子 |
グループ内の優先順位は左から右に評価されます。
プロパティ演算子+および*の特別な考慮事項
通常、+ (プラス記号)と* (アスタリスク)演算子を使用した、完全に無制限のグラフ・トラバースはコストが非常に高くなります。この理由から、デフォルトでは深度制限のある+演算子と*演算子が使用されます。デフォルトの深度制限は10です。また、深度制限の実装は並列で実行できます。ALL_MAX_PP_DEPTH(n)
SEM_MATCH問合せオプションまたはPP_MAX_DEPTH(n)
インラインHINT0問合せオプティマイザ・ヒントを使用して、深度制限設定を変更できます。完全に無制限のトラバースを実現するには、深度制限を1未満に設定して、CONNECT BYベースの実装に戻ります。
プロパティ・パスの問合せヒント
プロパティ・パス問合せのパフォーマンスに影響するその他の問合せヒントも使用できます。ALLOW_PP_DUP=T
問合せオプションを*問合せや+問合せと使用すると、結果の重複を認めることができます。結果の重複が認められると、問合せから最初の行が早く戻されます。また、ALL_USE_PP_HASH
およびALL_USE_PP_NL
問合せオプションは、プロパティ・パス表現を評価するときに使用される結合タイプに影響します。同様のUSE_PP_HASH
およびUSE_PP_NL
インラインHINT0問合せオプティマイザ・ヒントも使用できます。
例1-63 SPARQLプロパティ・パス(rdfs:subClassOf関係を使用)
例1-63では、プロパティ・パスを使用して、rdfs:subClassOf
関係の推移性に基づいてすべての男性を検索しています。プロパティ・パスでは、任意の数の連続的なrdfs:subClassOf
関係の一致が可能です。
SELECT x, name
FROM TABLE(SEM_MATCH(
'{ ?x foaf:name ?name .
?x rdf:type ?t .
?t rdfs:subClassOf* :Male }',
SEM_Models('family'),
null,
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')
SEM_ALIAS('foaf',' http://xmlns.com/foaf/0.1/')),
null));
例1-64 SPARQLプロパティ・パス(foaf:friendOfまたはfoaf:knows関係を使用)
例1-64では、プロパティ・パスを使用して、Scottの親しい友人(foaf:friendOf
またはfoaf:knows
関係を使用して2ホップ以内に到達可能な人々)をすべて検索しています。
SELECT name FROM TABLE(SEM_MATCH( '{ { :Scott (foaf:friendOf | foaf:knows) ?f } UNION { :Scott (foaf:friendOf | foaf:knows)/(foaf:friendOf | foaf:knows) ?f } ?f foaf:name ?name . FILTER (!sameTerm(?f, :Scott)) }', SEM_Models('family'), null, SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/'), SEM_ALIAS('foaf',' http://xmlns.com/foaf/0.1/')), null));
例1-65 プロパティ・パスの最大深度値の指定
例1-65では、ALL_MAX_PP_DEPTH(n)
問合せオプション値を使用してすべてのプロパティ・パス表現に最大深度12を指定します。
SELECT x, name FROM TABLE(SEM_MATCH( '{ ?x foaf:name ?name . ?x rdf:type ?t . ?t rdfs:subClassOf* :Male }', SEM_Models('family'), null, SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/') SEM_ALIAS('foaf',' http://xmlns.com/foaf/0.1/')), null, null, ' ALL_MAX_PP_DEPTH(12) '));
例1-66 プロパティ・パス結合ヒントの指定
例1-66に、プロパティ・パス表現の評価にネステッド・ループ結合をリクエストするインラインHINT0問合せオプティマイザ・ヒントを示します。
SELECT x, name FROM TABLE(SEM_MATCH( '{ # HINT0={ USE_PP_NL } ?x foaf:name ?name . ?x rdf:type ?t . ?t rdfs:subClassOf* :Male }', SEM_Models('family'), null, SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/') SEM_ALIAS('foaf',' http://xmlns.com/foaf/0.1/')), null));
SEM_MATCHは、SPARQL 1.1のフェデレーテッド問合せをサポートしています(http://www.w3.org/TR/sparql11-federated-query/#SPROT
を参照)。SERVICE構成要素を使用して、指定したSPARQLエンドポイントURLから結果を取得できます。この機能により、ローカルのRDFデータ(ネイティブRDFデータまたはリレーショナル・データのRDFビュー)を、W3C標準準拠のSPARQLエンドポイントによって提供される他のRDFデータ(おそらくリモート)と組み合せることができます。
この項には次のトピックも含まれます。
例1-67 すべてのトリプルを取得するSPARQL SERVICE句
例1-67は、SERVICE句を使用して、http://www.example1.org/sparql
にあるSPARQLエンドポイントからすべてのトリプルを取得する問合せです。
SELECT s, p, o FROM TABLE(SEM_MATCH( 'SELECT ?s ?p ?o WHERE { SERVICE <http://www.example1.org/sparql>{ ?s ?p ?o } }', SEM_Models('electronics'), null, null, null, null, ' '));
例1-68 リモートとローカルのRDFデータを結合するSPARQL SERVICE句
例1-68は、リモートRDFデータとローカルRDFデータを結合します。この例は、ローカル・モデルelectronics
のカメラのタイプ?cType
を、http://www.example1.org/sparql
のSPARQLエンドポイントのカメラの名前?name
に結合します。
SELECT cType, name FROM TABLE(SEM_MATCH( 'PREFIX : <http://www.example.org/electronics/> SELECT ?cType ?name WHERE { ?s :cameraType ?cType SERVICE <http://www.example1.org/sparql>{ ?s :name ?name } }', SEM_Models('electronics'), null, null, null, null, ' '));
SEM_MATCH問合せでSERVICE構成要素を使用するには、特定のデータベース権限が必要です。DBA権限を持つユーザーによって、SPARQL_SERVICE MDSYSファンクションのEXECUTE権限が付与される必要があります。次の例では、このアクセス権がRDFUSERという名前のユーザーに付与されます。
grant execute on mdsys.sparql_service to rdfuser;
また、アクセス制御リスト(ACL)を使用して、フェデレーテッド問合せを試行するユーザーにCONNECT権限を付与する必要があります。例1-69は、新しいACLを作成して、ユーザーRDFUSERにCONNECT権限を付与し、ドメイン*をACLに割り当てます。ACLの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
例1-69 アクセス制御リストとホスト割当て
dbms_network_acl_admin.create_acl ( acl => 'rdfuser.xml', description => 'Allow rdfuser to query SPARQL endpoints', principal => 'RDFUSER', is_grant => true, privilege => 'connect' ); dbms_network_acl_admin.assign_acl ( acl => 'rdfuser.xml', host => '*' );
必要な権限が付与されると、SEM_MATCHからフェデレーテッド問合せを実行する準備が整います。
SPARQL SERVICEの結合プッシュ・ダウン(SERVICE_JPDWN=T
)機能を使用すると、特定のSPARQL SERVICE問合せのパフォーマンスを改善できます。デフォルトでは、SERVICE句の問合せパターンがリモートSPARQLエンドポイントで最初に実行されます。このリモート実行のすべての結果が、問合せのローカルの部分に結合されます。この方法では、問合せのローカル部分の選択性が非常に高く、問合せのリモート部分の選択性が非常に低いと、パフォーマンスが低下することがあります。
SPARQL SERVICEの結合プッシュ・ダウン機能は、SERVICE句を複数含む問合せでは使用できません。
例1-70 SPARQL SERVICEの結合プッシュ・ダウン
例1-70に、SPARQL SERVICEの結合プッシュ・ダウン機能を示します。
SELECT s, prop, obj
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?s ?prop ?obj
WHERE {
?s rdf:type :Camera .
?s :modelName "Camera 12345"
SERVICE <http://www.example1.org/sparql> { ?s ?prop ?obj }
}',
SEM_Models('electronics'),
null, null, null, null, ' SERVICE_JPDWN=T '));
例1-70では、問合せのローカル部分ではごく少数の行が返されますが、問合せのリモート部分は完全に無制限であるためリモート・データセット全体が返されます。SERVICE_JPDWN=T
オプションが指定されると、SEM_MATCHはネステッド・ループ方式の評価を実行します。まず、問合せのローカル部分を実行してから、ローカル部分によって返された行ごとに、変更したリモート問合せを1回ずつ実行します。結合変数?s
にかわって効率よく実行するFILTER句を使用してリモート問合せを変更します。たとえば、<urn:camera1>
と<urn:camera2>
が?sのバインディングとして例1-70
のローカル部分から返されると、2つの問合せ、{ ?s ?prop ?obj FILTER (?s = <urn:camera1>) }
と{ s ?prop ?obj FILTER (?s = <urn:camera2>) }
がリモート・エンドポイントに送られます。
SILENTキーワードがフェデレーテッド問合せで使用されるとき、指定されたリモートSPARQLエンドポイントにアクセスする際のエラーが無視されます。SERVICE SILENTリクエストが失敗すると、バインディングなしの1つの解が返されます。
例1-71は、OPTIONAL句内でSILENTキーワードと一緒にSERVICEを使用しています。このため、http://www.example1.org/sparql
にアクセスする際に接続エラーが発生しても、そのようなエラーは無視され、トリプル?s :cameratype ?k
から取得されたすべての行が?n
のnull値と結合されます。
例1-71 SILENTキーワードを含むSPARQL SERVICE
SELECT s, n
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?s ?n
WHERE {
?s :cameraType ?k
OPTIONAL { SERVICE SILENT <http://www.example1.org/sparql>{ ?k :name ?n } }
}',
SEM_Models('electronics'),
null, null, null, null));
次の方法を使用して、SPARQL SERVICEリクエストをHTTPプロキシで送信できます。
現在のセッションでリクエストに使用する必要があるHTTPプロキシを指定します。これは、UTL_HTTPパッケージのSET_PROXY関数を使用して行うことができます。例1-72は、HTTPリクエストで使用するプロキシproxy.example.com
を設定し、ドメインexample2.com
のホストに対するリクエストを除外します。(SET_PROXYプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。)
SPARQL SERVICEリクエストのプロキシ・アドレスを設定できるようにするSERVICE_PROXY SEM_MATCHオプションを使用します。ただし、このケースでは例外を指定できません。すべてのリクエストは指定したプロキシ・サーバーに送信されます。例1-73に、ポート80のプロキシ・アドレスproxy.example.com
が指定されたSEM_MATCH問合せを示します。
例1-72 UTL_HTTP.SET_PROXYでのプロキシ・サーバーの設定
BEGIN UTL_HTTP.SET_PROXY('proxy.example.com:80', 'example2.com'); END; /
例1-73 SPARQL SERVICEでのプロキシ・サーバーの設定
SELECT * FROM TABLE(SEM_MATCH( 'SELECT * WHERE { SERVICE <http://www.example1.org/sparql>{ ?s ?p ?o } }', SEM_Models('electronics'), null, null, null, null, ' SERVICE_PROXY=proxy.example.com:80 '));
HTTP基本認証でSPARQLエンドポイントへのアクセスを許可するには、ユーザー資格証明をセッション・コンテキストSDO_SEM_HTTP_CTXに保存する必要があります。DBA権限を持つユーザーが、基本認証の使用を希望するユーザーにこのコンテキストのEXECUTEを付与する必要があります。次の例では、このアクセス権をRDFUSERというユーザーに付与しています。
grant execute on mdsys.sdo_sem_http_ctx to rdfuser;
権限が付与されると、ユーザーは各SPARQLエンドポイントのユーザー名とパスワードをHTTP認証に保存する必要があります。これには、関数mdsys.sdo_sem_http_ctx.set_usr
およびmdsys.sdo_sem_http_ctx.set_pwd
を使用します。次の例では、SPARQLエンドポイント(http://www.example1.org/sparql
)のユーザー名とパスワードが設定されます。
BEGIN mdsys.sdo_sem_http_ctx.set_usr('http://www.example1.org/sparql','user'); mdsys.sdo_sem_http_ctx.set_pwd('http://www.example1.org/sparql','pwrd'); END; /
SEM_MATCHでは、HINT0インライン問合せオプティマイザ・ヒントを許可するために、SPARQLコメント構成要素がオーバーロードされています。SPARQLのハッシュ(#)文字は、行のそれ以降の部分がコメントであることを示します。インライン・ヒントを特定のBGPと関連付けるには、HINT0ヒント文字列をSPARQLコメント内に配置し、開始中カッコ({)とBGPの最初のトリプル・パターンの間にコメントを挿入します。インライン・ヒントを使用すると、問合せ内の各BGPの実行計画に影響を与えることができます。例1-74に、インライン問合せオプティマイザ・ヒントを含む問合せを示します。
例1-74 インライン問合せオプティマイザ・ヒント
SELECT x, y, hp, cp FROM TABLE(SEM_MATCH( '{ # HINT0={ LEADING(t0) USE_NL(?x ?y ?bd) } ?x :grandParentOf ?y . ?x rdf:type :Male . ?x :birthDate ?bd OPTIONAL { # HINT0={ LEADING(t0 t1) BGP_JOIN(USE_HASH) } ?x :homepage ?hp . ?x :cellPhoneNum ?cp } }', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb'), SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')), null));
BGP_JOINヒントはBGP結合間に影響を与えるもので、BGP_JOIN
(<join_type>
)
という構文を使用します(<join_type>はUSE_HASHまたはUSE_NLです)。例1-74では、BGP_JOIN(USE_HASH)ヒントを使用して、OPTIONAL BGPをその親BGPと結合する場合にハッシュ結合を使用する必要があることを指定しています。
インライン・オプティマイザ・ヒントは、options
引数を使用してSEM_MATCHに渡されるすべてのヒントをオーバーライドします。たとえば、インライン・オプティマイザ・ヒントを指定していない各BGPには、グローバルALL_ORDEREDヒントが適用されますが、インライン・ヒントを持つBGPには、ALL_ORDEREDヒントではなくインライン・ヒントが使用されます。
Oracle固有のorardf:textContains
SPARQL FILTER関数は、MDSYS.RDF_VALUE$表で全文索引を使用します。この関数は次の構文を使用します(orardf
は<http://xmlns.oracle.com/rdf/>
に展開される組込みの接頭辞です)。
orardf:textContains(variable, pattern)
orardf:textContains
への最初の引数はローカル変数(つまり、orardf:textContains
フィルタを含むBGPに存在する変数)である必要があり、2つ目の引数は一定のプレーン・リテラルである必要があります。
たとえば、orardf:textContains(x, y)
は、x
が式y
と一致する場合にtrueを戻します(y
はOracle Text SQL演算子CONTAINSの有効な式です)。そのような式の詳細は、『Oracle Textリファレンス』を参照してください。
orardf:textContains
を使用する前に、RDFネットワークのOracle Text索引を作成する必要があります。そのような索引を作成するには、SEM_APIS.ADD_DATATYPE_INDEXプロシージャを次のように起動します。
EXECUTE SEM_APIS.ADD_DATATYPE_INDEX('http://xmlns.oracle.com/rdf/text');
orardf:textContains(?x, "%abc%")
のようなワイルドカード検索のパフォーマンスは、プリフィックス索引と部分文字列索引を使用することで向上します。次の任意のオプションをSEM_APIS.ADD_DATATYPE_INDEXプロシージャに含めることができます。
prefix_index=true
- プリフィックス索引の追加
prefix_min_length=
<number>
– プリフィックス索引トークンの最小長さ
prefix_max_length=
<number>
– プリフィックス索引トークンの最大長さ
substring_index=true
- 部分文字列索引の追加
Oracle Textの索引付け要素の詳細は、『Oracle Textリファレンス』を参照してください。
テキスト索引のあるセマンティク・ネットワークに対して大規模バルク・ロードを実行する場合、テキスト索引を削除してバルク・ロードを実行してからテキスト索引を再作成すると、ロード時間全体が短縮される可能性があります。データ型索引の詳細は、「データ型索引の使用」を参照してください。
テキスト索引を作成すると、SEM_MATCH問合せでorardf:textContains
FILTER関数を使用できます。例1-75では、orardf:textContains
を使用して、名前が文字AまたはBで始まるすべての祖父を検索しています。
例1-75 全文検索
SELECT x, y, hp, cp
FROM TABLE(SEM_MATCH(
'{ ?x :grandParentOf ?y . ?x rdf:type :Male . ?x :name ?n
FILTER (orardf:textContains(?n, " A% | B% ")) }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null));
RDFセマンティク・グラフは、OGC GeoSPARQL標準を介して、およびOracle固有のSPARQL拡張機能を介して空間ジオメトリ・データの記憶域および問合せをサポートしています。ジオメトリ・データはorageo:WKTLiteral
またはogc:wktLiteral
型付きリテラルとして格納可能で、空間操作用のいくつかの問合せ関数を使用してジオメトリ・データを問い合せることができます。パフォーマンス向上のための空間索引付けも、サポートされます。
orageo
は<http://xmlns.oracle.com/rdf/geo/>
に展開される組込み接頭辞、ogc
は<http://www.opengis.net/ont/geosparql#>
に展開される組込み接頭辞、ogcf
は<http://www.opengis.net/def/function/geosparql>
に展開される組込み接頭辞です。
この項の内容は次のとおりです。
RDFセマンティク・グラフは、Well-Known Text (WKT)シリアライズとシンプル・フィーチャのリレーション・ファミリを使用して、OGC GeoSPARQL標準(http://www.opengeospatial.org/standards/geosparql
)に準拠する次のクラスをサポートします。
コア
トポロジ・ボキャブラリ拡張(シンプル・フィーチャ)
ジオメトリ拡張(WKT、1.2.0)
ジオメトリ・トポロジ拡張(シンプル・フィーチャ、WKT、1.2.0)
RDFS伴意拡張(シンプル・フィーチャ、WKT、1.2.0)
GeoSPARQLを使用した空間データの表現および問合せの詳細は、以降の項で説明します。
空間ジオメトリは、RDFでorageo:WKTLiteral
またはogc:wktLiteral
型付きリテラルとして表現できます。
例1-76 orageo:WKTLiteralとして表現される空間点ジオメトリ
例1-76は単純な点ジオメトリのorageo:WKTLiteral
エンコーディングを示し、例1-77は同じ点のGeoSPARQLエンコーディングを示しています。
"Point(-83.4 34.3)"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral>
例1-77 ogc:wktLiteralとして表現される空間点ジオメトリ
"Point(-83.4 34.3)"^^<http://www.opengis.net/ont/geosparql#wktLiteral>
例1-78 orageo:WKTLiteral値を使用してエンコードされる空間データ
orageo:WKTLiteral
とogc:wktLiteral
エンコーディングはどちらも、オプションの空間参照システムURIと、それに続くWell-Known Text(WKT)文字列(ジオメトリ値をエンコードする)で構成されます。空間参照システムURIとWKT文字列は、空白文字で分離する必要があります。(このドキュメントでは、ジオメトリ・リテラルという用語で、orageo:WKTLiteral
とogc:wktLiteral
型付きリテラルの両方を指しています。)
サポートされる空間参照システムURIは、<http://xmlns.oracle.com/rdf/geo/srid/
{srid}
>
という形式を取ります({srid}は、Oracle Spatial and Graphからの有効な空間参照システムIDです)。ジオメトリ・リテラル値に空間参照システムURIが含まれない場合、デフォルトの空間参照システムのWGS84経度-緯度(URI <http://xmlns.oracle.com/rdf/geo/srid/8307>
)が使用されます。問合せ文字列内にジオメトリ・リテラル値が見つかると、同じデフォルトの空間参照システムが使用されます。
いくつかのジオメトリ・タイプは、点、線ストリング、ポリゴン、多面体面、三角形、TIN、複数点、複数の線ストリング、複数のポリゴンおよびジオメトリ・コレクションを含む、ジオメトリ・リテラル値として表現できます。2次元ジオメトリでは、1ジオメトリ当たり最大500,000の頂点がサポートされます。
例1-78は、orageo:WKTLiteral
値を使用してエンコードされるいくつかのRDF空間データ(N-triple形式)を示しています。この例では、最初の2つのジオメトリ(lot1内)はデフォルトの座標系(SRID 8307)を使用し、その他の2つのジオメトリ(lot2内)はSRID 8265を指定しています。
# spatial data for lot1 using the default WGS84 Longitude-Latitude spatial reference system <urn:lot1> <urn:hasExactGeometry> "Polygon((-83.6 34.1, -83.6 34.5, -83.2 34.5, -83.2 34.1, -83.6 34.1))"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral> . <urn:lot1> <urn:hasPointGeometry> "Point(-83.4 34.3)"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral> . # spatial data for lot2 using the NAD83 Longitude-Latitude spatial reference system <urn:lot2> <urn:hasExactGeometry> "<http://xmlns.oracle.com/rdf/geo/srid/8265> Polygon((-83.6 34.1, -83.6 34.3, -83.4 34.3, -83.4 34.1, -83.6 34.1))"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral> . <urn:lot2> <urn:hasPointGeometry> "<http://xmlns.oracle.com/rdf/geo/srid/8265> Point(-83.5 34.2)"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral> .
詳細は、『Oracle Spatial and Graph開発者ガイド』の座標系(空間参照システム)に関する章を参照してください。Open Geospatial Consortium (OGC)のシンプル・フィーチャのドキュメント(http://www.opengeospatial.org/standards/sfa
)で、WKTジオメトリ表現に関する資料も参照してください。
任意のSPARQL拡張関数(「空間データの問合せ」を参照)を使用して空間データを問い合せる前に、SEM_APIS.ADD_DATATYPE_INDEXプロシージャをコールしてRDFネットワークに空間索引を作成する必要があります。
空間索引を作成する場合、次の情報を指定する必要があります。
SRID: 空間索引を作成する空間参照システムのID。Oracle Spatial and Graphからの任意の有効な空間参照システムIDを、SRID値として使用できます。
TOLERANCE: 空間索引の許容値。許容値は、2つの点が同じ点とみなされるためにどの程度近接している必要があるかを示す正数です。この値の単位は、使用されるSRIDのデフォルト単位によって決定されます(たとえば、WGS84経度/緯度の場合はメートル)。許容差は、『Oracle Spatial and Graph開発者ガイド』で詳細に説明されています。
DIMENSIONS: 空間索引のテキスト文字列エンコーディングの次元情報。各次元は、カンマ区切りの一連の3つの値(名前、最小値および最大値)で表現されます。各次元をカッコで囲み、それらの次元のセットを外側のカッコで囲みます。
例1-79 RDFデータ上の空間データ型索引の追加
例1-79では、RDFネットワーク上の空間データ型索引を追加し、この座標系を使用する空間データの索引付けに関する、WGS84経度-緯度空間参照システム、10メートルの許容差値、推奨次元を指定しています。TOLERANCE、SRIDおよびDIMENSIONSキーワードの大/小文字は区別され、<http://xmlns.oracle.com/rdf/geo/WKTLiteral>
に対してデータ型索引を作成すると、<http://www.opengis.net/ont/geosparql#wktLiteral>
ジオメトリ・リテラルにも索引付けされ、この逆も同様に行われます(つまり、<http://www.opengis.net/ont/geosparql#wktLiteral>
に対してデータ型索引を作成すると<http://xmlns.oracle.com/rdf/geo/WKTLiteral>
ジオメトリ・リテラルにも索引付けされます)。
EXECUTE sem_apis.add_datatype_index('http://xmlns.oracle.com/rdf/geo/WKTLiteral', options=>'TOLERANCE=10 SRID=8307 DIMENSIONS=((LONGITUDE,-180,180) (LATITUDE,-90,90))');
RDFネットワークについては1つの空間データ型索引のみサポートされます。RDFネットワークに格納されるジオメトリ・リテラル値は、索引に使用される空間参照システムに自動的に正規化されるため、単一の空間索引では複数の空間参照システムからのジオメトリ・リテラル値を同時にサポートできます。この座標変換は、索引付けと空間の計算に対して透過的に行われます。ジオメトリ・リテラル値がSEM_MATCH問合せから戻されるときは、元の未変換のジオメトリが戻されます。
空間索引付けの詳細は、『Oracle Spatial and Graph開発者ガイド』で空間データの索引付けおよび問合せに関する章を参照してください。
SEM_MATCHで空間問合せを実行するために、複数のSPARQL拡張関数を使用できます。たとえば、空間RDFデータでは、ジオメトリの領域と境界線(長さ)、2つのジオメトリ間の距離、およびジオメトリの重心と最小外接矩形を検出することや、ジオメトリ間の様々な位相関係を確認することができます。
「空間問合せのSEM_MATCHサポート」には、利用可能な関数のリファレンスおよび使用法に関する情報が記載されています。
GeoSPARQLの関数
Oracle固有の関数
この項では、SEM_MATCHテーブル・ファンクションを使用してセマンティク・データを問い合せる場合に推奨される方法について説明します。次のサブセクションが含まれます:
デフォルトでは、SEM_MATCHは、xsd:date、xsd:timeおよびxsd:dateTimeの値の比較についてXMLスキーマ標準に準拠しています。この標準に従って2つのカレンダ値のc1とc2を比較すると(c1には明示的にタイムゾーンが指定され、c2にはタイムゾーンが指定されていません)、c2は[c2-14:00, c2+14:00]という間隔に変換されます。c2-14:00 <= c1 <= c2+14:00である場合、比較は未定義となり、常にfalseに評価されます。c1がこの間隔の外部にある場合、比較は定義されます。
ただし、このような比較(タイムゾーンを持つ値とタイムゾーンを持たない値)の評価に必要な追加のロジックによって、カレンダ値が関係するFILTER構成要素を含む問合せの速度が大幅に低下する可能性があります。問合せパフォーマンスを向上させるには、SEM_MATCH表関数のoptions
パラメータにFAST_DATE_FILTER=T
を指定することによって、この追加ロジックを無効にできます。FAST_DATE_FILTER=T
を指定すると、タイムゾーンのないカレンダ値については、すべてグリニッジ標準時(GMT)と想定されます。
FAST_DATE_FILTER=T
を使用すると、(1)データセットのすべてのカレンダ値がタイムゾーンを持つ場合も、(2)データセットのすべてのカレンダ値がタイムゾーンを持たない場合も、問合せの正確性には影響ありません。
FILTER構成要素を含むSEM_MATCH問合せの評価には、通常、RDF_VALUE$表に対して1つ以上のSQL関数の実行が必要になります。たとえば、フィルタ(?x < "1929-11-16Z"^^xsd:date)
によって、SEM_APIS.GETV$DATETZVAL関数が呼び出されます。
型付きリテラルが関係するフィルタ条件を含む問合せのパフォーマンスを向上させるには、関数ベースの索引を使用できます。たとえば、xsd:date
関数ベース索引によって、フィルタ(?x < "1929-11-16Z"^^xsd:date)
の評価の速度が向上する場合があります。
これらの関数ベース索引の作成、変更および削除のために、便利なインタフェースが用意されています。詳細は、「データ型索引の使用」を参照してください。
ただし、MDSYS.RDF_VALUE$表にこれらの関数ベース索引が存在することで、バルク・ロード操作の速度は大幅に低下する可能性があります。多くの場合、索引付きのままバルク・ロードを実行する場合と比較すると、索引を削除し、バルク・ロードを実行してから索引を再作成する方が高速です。
問合せオプティマイザに十分な統計を確保することは、優れた問合せパフォーマンスのために非常に重要です。通常は、SEM_PERF.GATHER_STATSプロシージャを使用して、セマンティク・ネットワークの基本的な統計が収集されていることを確認する必要があります(「SEM_PERFパッケージのサブプログラム」を参照)。
RDFデータ・モデル本来の柔軟性のため、静的情報ではSEM_MATCH問合せの最適実行計画が生成されない場合があります。通常、動的サンプリングでは、非常によい問合せ実行プランを生成できます。動的サンプリング・レベルは、optimizer_dynamic_sampling
パラメータを使用してセッションまたはシステム・レベルで設定することも、dynamic_sampling
(level)
SQL問合せヒントを使用して個別の問合せレベルで設定することもできます。通常は3から6の間の動的サンプリング・レベルで試すことをお薦めします。動的サンプリングの統計の見積りの詳細は、『Oracle Database SQLチューニング・ガイド』を参照してください。
例1-80では、動的サンプリング・レベルが6のSQLヒントを使用しています。
例1-80 動的サンプリングのSQLヒント
SELECT /*+ DYNAMIC_SAMPLING(6) */ x, y
FROM TABLE(SEM_MATCH(
'{?x :grandParentOf ?y .
?x rdf:type :Male .
?x :birthDate ?bd }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null, null, '' ));
複数のセマンティク・モデル、セマンティク・モデルと伴意、および仮想モデルの使用には、次の推奨事項が適用されます。
複数のセマンティク・モデルに対して、またはセマンティク・モデルと伴意に対してSEM_MATCH問合せを実行する場合は、問い合せるすべてのモデルと伴意を含む仮想モデル(「仮想モデル」を参照)を作成して、この単一の仮想モデルを問い合せると、問合せパフォーマンスが向上する可能性があります。
ALLOW_DUP=T
問合せオプションを使用します。このオプションを使用しない場合は、RDFデータの設定済セマンティクを保持するために、問合せ処理中に高コストな(処理に関して)重複除去手順が必要になります。ただし、このオプションを使用した場合、重複除去手順は実行されず、パフォーマンスが大幅に向上します。
OLTP索引圧縮がサポートされるシステム(Exadataなど)では、セマンティク・ネットワークによって使用される一部のBツリー索引の圧縮率を向上させる機能を利用できます。
たとえば、DBAは次のコマンドを使用して、MDSYS.RDF_VAL_NAMETYLITLNG_IDX索引での圧縮スキームを接頭辞圧縮からOLTP索引圧縮に変更できます。
SQL> alter index mdsys.RDF_VAL_NAMETYLITLNG_IDX rebuild compress for oltp high;
+および*プロパティ・パス演算子では、可能な場合には常に深度制限検索を使用する必要があります。*および+の深度制限実装のパフォーマンスは、大規模なグラフや関連性が高いグラフにおいてはCONNECT BYベースの実装を大幅に上回ります。深度制限10がデフォルトで使用されます。どのグラフでもグラフの直径を超えた深度制限は役立ちません。深度制限の設定の詳細は、「プロパティ・パス」を参照してください。
クラス階層が非常に深いオントロジに対してrdfs:subClassOf+
を使用する後方連鎖スタイルの推論は、このルールの例外になることがあります。このようなケースでは、無制限のCONNECT BYベース評価のパフォーマンスが、非常に大きな深度制限(たとえば50)の深度制限評価よりもよくなることがあります。
MIN
、MAX
およびGROUP_CONCAT
集計では、不均一なタイプ(たとえば、MAX(?x)
)の入力についてSPARQLセマンティクを完全にキャプチャするために特別なロジックが必要です。均一入力タイプをコンパイル時に判別できるケース(たとえば、MAX(STR(?x))
- プレーン・リテラル入力)では、組込みSQL集計の最適化を使用できます。通常は、このような最適化によってパフォーマンスが1桁向上します。次のケースは最適化されます。
MIN/MAX(<plain literal>)
MIN/MAX(<numeric>)
MIN/MAX(<dateTime>)
GROUP_CONCAT(<plain literal>)
図1-81はMIN/MAX(<numeric>)最適化を使用しています。
例1-81 集計の最適化
SELECT dept, minSal, maxSal FROM TABLE(SEM_MATCH( 'SELECT ?dept (MIN(xsd:decimal(?sal)) AS ?minSal) (MAX(xsd:decimal(?sal)) AS ?maxSal) WHERE {?x :salary ?y . ?x :department ?dept } GROUP BY ?dept', SEM_Models('hr_data'), null, null, null, null, '' ));
次の考慮事項は、SEM_MATCHを使用してRDFセマンティク・グラフで実行されるSPARQL問合せに適用されます。
値の割当て
値割り当てのソースで未定義の変数が参照されると、コンパイル時にエラーが発生します。
グループ化と集計
非グループ化変数(グループ化に使用されないため、射影には妥当でない問合せ変数)は、値割り当てのターゲットとして再利用できません。
数値以外の値は、AVGおよびSUM集計によって無視されます。
デフォルトでは、SEM_MATCHは、グラフ・パターンが一致しない集計問合せの場合に行を返しません。W3C仕様では、このケースでは1つのnull行が必要です。STRICT_AGG_CARD=T
問合せオプションを使用すると動作がW3Cに準拠しますが、パフォーマンスがわずかに低下します。
ORDER BY
SEM_MATCHでSPARQL ORDER BYを使用する場合、取り囲んでいるSQLブロック全体を通じて目的の順序を維持するためには、格納側のSQL問合せをSEM$ROWNUMで並べ替える必要があります。
数値計算
ネイティブのOracleのNUMBER型はすべての演算処理のために内部的に使用され、すべての算術演算の結果はxsd:decimal
としてシリアライズされます。ネイティブのOracleのNUMBER型は、BINARY_FLOATおよびBINARY_DOUBLEよりも正確です。組込みデータ型NUMBERの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
ゼロで除算した場合は、バインドされていない値が生成されるのではなく、ランタイム・エラーが発生します。
否定
潜在的にバインドされていない変数を参照するEXISTSおよびNOT EXISTSフィルタは、次のコンテキストではサポートされません。
GROUP BY内の別名のない式
集計への入力
ORDER BY内の式
OPTIONALグラフ・パターン内に出現しない変数も参照するOPTIONALグラフ・パターン内のFILTER式
最初の3つのケースは、BIND句またはSELECT式を使用して変数にEXISTSまたはNOT EXISTSフィルタの結果を最初に割り当てることで実現できます。
これらの制限は、明確にバインドされた変数のみを参照するEXISTSおよびNOT EXISTSフィルタには、当てはまりません。
空白ノード
空白ノードは、グラフ・パターン内ではサポートされません。
BNODE(literal)
関数は、同じリテラル引数でコールされるたびに、同じ空白ノード値を戻します。
プロパティ・パス
無制限の演算子+および*は、パフォーマンスの理由からデフォルトでは10ホップの深度制限を使用します。深度制限を0に設定すると、この動作を完全に無制限の検索に変更できます。詳細は、「プロパティ・パス」を参照してください。
ロング・リテラル(CLOB)
SPARQLのファンクションと集計は、デフォルトではロング・リテラルをサポートしていません。
CLOB_EXP_SUPPORT=T
問合せオプションを指定すると、SPARQL関数(IF、COALESCE、STRLANG、STRDT、SUBSTR、STRBEFORE、STRAFTER、CONTAINS、STRLEN、STRSTARTS、STRENDS)でのロング・リテラルのサポートが有効になります。
CLOB_AGG_SUPPORT=T
問合せオプションを指定すると、集計(MIN、MAX、SAMPLE、GROUP_CONCAT)でのロング・リテラルのサポートが有効になります。
RDFリテラルの正規化
デフォルトでは、SPARQLファンクションから返されるRDFリテラルと、値割当て文(BIND、SELECT式、GROUP BY式)で使用される定数RDFリテラルは正規化されます。この動作は、SPARQL 1.1の「D-Entailment Regime」と一致しています。
正規化を無効にするにはPROJ_EXACT_VALUES=T
問合せオプションを使用します。
セマンティク・データをモデルにロードするには、次の1つ以上のオプションを使用します。
RDFトリプル(およびオプションで名前付きグラフ)の3つの構成要素(主語、述語、目的語)を含む行を持つステージング表からセマンティク・データ・ストアにデータをバルク・ロードまたは追加します。詳細は、「ステージング表を使用したセマンティク・データのバルク・ロード」を参照してください。
このオプションは、大量のデータをロードする場合の最も高速な方法ですが、4000バイトを超える目的語の値を含むトリプルは処理できません。
バッチ・ロード: Javaクライアント・インタフェースを使用してN-Triple形式のファイルのデータをセマンティク・データ・ストアにロードまたは追加します(「Java APIを使用したN-Triple形式のセマンティク・データのバッチ・ロード」を参照)。
このオプションは、バルク・ロードより低速ですが、4000バイトを超える目的語の値を含むトリプルも処理できます。ただし、このオプションでは名前付きグラフは処理されません。
SDO_RDF_TRIPLE_SコンストラクタをコールするSQL INSERT文を使用してアプリケーション表にロードし、対応するRDFトリプル(状況によりグラフ名も含む)のセマンティク・データ・ストアに挿入します(「INSERT文を使用したセマンティク・データのロード」を参照)。
このオプションは、小規模なデータをロードする場合に便利です。
セマンティク・データをエクスポートする、言い換えると、セマンティク・データをステージング表に格納できるN-Triple形式またはN-Quad形式でOracle Databaseから取り出すには、「セマンティク・データのエクスポート」で説明されているSQL問合せを使用します。
注意:
Oracle Databaseリリース12.1では、「Oracle Data Pumpを使用したセマンティク・ネットワークのエクスポートまたはインポート」の説明にあるとおり、Oracle Data Pumpユーティリティの全てのデータベース・エクスポートおよびインポートの機能を使用して、セマンティク・ネットワークのエクスポートとインポートを行うことができます。
ステージング表を使用して、セマンティク・データ(およびオプションでセマンティク・データ以外の関連データ)をバルク・ロードできます。SEM_APIS.LOAD_INTO_STAGING_TABLEプロシージャ(「SEM_APISパッケージ・サブプログラム」を参照)をコールしてデータをロードします(ロード操作中に構文の正確性をチェックできます)。その後、SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャをコールして、データをステージング表からセマンティク・ストアにロードできます。(データがステージング表へのロード操作中に解析されていない場合は、SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャをコールするときにflags
パラメータにPARSE
キーワードを指定する必要があります。)
次の例では、すべての必須列とそれらの列の必須名(およびロードする1つ以上のRDFトリプルにグラフ名が含まれる場合は、含まれる必要のあるオプションのRDF$STC_graph列)を含むステージング表の書式を示します。
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, RDF$STC_graph varchar2(4000) );
非セマンティク・データもロードする場合は、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, RDF$STC_graph varchar2(4000) );
注意:
いずれの形式のCREATE TABLE文でも、表を圧縮するためにCOMPRESS句を追加できます。このオプションにより、必要なディスク領域が減少し、バルク・ロードのパフォーマンスが向上する可能性があります。
起動側とMDSYSユーザーは、両方ともステージング表に対するSELECT権限と、アプリケーション表に対するINSERT権限を持っている必要があります。
次の項も参照してください。
セマンティク・ストアへのロードの準備として、複数の方法でセマンティク・データをステージング表にロードできます。一般的な方法は次のとおりです。
「SQL*Loaderを使用してN-Triple形式データをステージング表にロードする方法」の説明に従い、Oracle SQL*Loaderを使ってステージング表をロード
「外部表を使用してN-Quad形式データをステージング表にロードする方法」の説明に従い、外部表を使ってステージング表をロード
SQL*Loaderユーティリティを使用して、セマンティク・データを解析し、ステージング表にロードします。Oracle Database Examplesメディアからデモ・ファイルをインストールしている場合(『Oracle Database Examplesインストレーション・ガイド』を参照)、サンプルの制御ファイル$ORACLE_HOME/md/demo/network/rdf_demos/bulkload.ctl
を使用できます。入力データがN-Triple形式の場合、このファイルを変更して使用できます。
4000バイトを超える目的語はロードできません。サンプルのSQL*Loader制御ファイルを使用する場合、このような長い値を含むトリプル(行)は、自動的に拒否され、SQL*Loaderの不良ファイルに格納されます。ただし、これらの拒否された行は、SQL INSERT文を使用してアプリケーション表に挿入することによってロードできます(「INSERT文を使用したセマンティク・データのロード」を参照)。
次の方法によって、Oracle外部表を使用してステージング表にN-Quad形式のデータ(4つの構成要素を持つ拡張トリプル)をロードできます。
例1-82 外部表を使用してステージング表をロードする方法
-- Create a source external table (note: table names are case sensitive) BEGIN sem_apis.create_source_external_table( source_table => 'stage_table_source' ,def_directory => 'DATA_DIR' ,bad_file => 'CLOBrows.bad' ); END; / grant SELECT on "stage_table_source" to MDSYS; -- Use ALTER TABLE to target the appropriate file(s) alter table "stage_table_source" location ('demo_datafile.nt'); -- Load the staging table (note: table names are case sensitive) BEGIN sem_apis.load_into_staging_table( staging_table => 'STAGE_TABLE' ,source_table => 'stage_table_source' ,input_format => 'N-QUAD'); END; /
オブジェクトとグラフURI (結合)の長さが4000バイトを超える行は、拒否されて不良ファイルに格納されます。ただし、これらの拒否された行は、SQL INSERT文を使用してアプリケーション表に挿入することによってロードできます(「INSERT文を使用したセマンティク・データのロード」を参照)。
例1-82は、外部表を使用してステージング表をロードする方法を示します。
起動側のスキーマに表RDF$ET_TABが存在し、この表に対するINSERT権限とUPDATE権限が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, UPDATE on RDF$ET_TAB to MDSYS;
注意:
この項で説明するJavaクラスoracle.spatial.rdf.client.BatchLoader
は非推奨になり、N-Quadデータのロードをサポートしていません。
かわりに、「RDF Semantic Graph Support for Apache Jenaを使用したバルク・ロード」で説明する、RDF Semantic Graph Support for Apache Jenaのバルク・ロード機能の使用をお薦めします。
N-Triple形式のセマンティク・データのバッチ(バルク)・ロード操作を実行するには、<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 and Graphとともにインストールされており、パーティショニング機能が有効であること。
セマンティク・テクノロジ・ネットワーク、アプリケーション表、および対応するセマンティク・モデルがデータベースに作成されていること。
CLASSPATH定義にojdbc6.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/ojdbc6.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\ojdbc6.jar oracle.spatial.rdf.client.BatchLoader <N-TripleFile> <tablename> <tablespaceName> <modelName>
-Ddb.user
と-Ddb.password
の値は、モデル<modelName>
の所有者またはDBAユーザーに一致している必要があります。
デフォルトでは、BatchLoader
は、少なくともNUMBER型のIDおよびSDO_RDF_TRIPLE_S型のTRIPLEをそれぞれ名前に持つ2列がユーザーのアプリケーション表にあることを前提としています。ただし、デフォルトの名前をJVMプロパティの-DidColumn=<idColumnName>
および-DtripleColumn=<tripleColumnName>
をオーバーライドして変更できます。ID列は必要ありません。BatchLoader
が順序風の識別子を各トリプルのID列のかわりに生成しないように、追加のJVMプロパティで-DjustTriple=true
と指定します。
アプリケーション表が空ではなく、アペンド・モードでバッチ・ロードを実行する場合には、追加のJVMプロパティで-Dappend=true
と指定します。さらにアペンド・モードで、ユーザーのアプリケーション表のID列に異なる開始値を指定する場合には、コマンドラインからJVMプロパティ-DstartID=<startingIntegerValue>
を追加します。デフォルトでは、ID列は1から始まり、新しいトリプルがアプリケーション表に挿入されると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コンストラクタを使用します(「トリプルを挿入するためのコンストラクタ」を参照)。アプリケーション表に対するINSERT権限を持っている必要があります。
注意:
URIが< >
で、リテラルが" "
で囲まれていなくても、文はそのまま処理されます。ただし、VALUE_TYPE値の判定に余分な処理が必要とされるため、文によるロードに時間がかかります。
次の例には、URI、空白ノード、リテラル、言語タグ付きのリテラルおよび型付きリテラルを使用した文が含まれます。
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>')); 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-j/
)をダウンロードし、そのインストール指示に従います。編集したバージョンのrss2insert.xsl
ファイルを使用してセマンティク・データXMLファイルをINSERT文に変換するには、次の形式のコマンドを使用します。
java org.apache.xalan.xslt.Process –in input.rdf -xsl rss2insert.xsl –out output.nt
INSERT文を使用してnull以外のグラフ名を含むRDFトリプルをロードするには、次の例に示すように、モデル名とコロン(:
)区切り文字の後に、グラフ名を山カッコ(< >
)で囲んで追加する必要があります。
INSERT INTO articles_rdf_data VALUES (99,
SDO_RDF_TRIPLE_S ('articles:<http://examples.com/ns#Graph1>',
'<http://nature.example.com/Article101>',
'<http://purl.org/dc/elements/1.1/creator>',
'"John Smith"'));
この項には、セマンティク・データのエクスポート(つまり、セマンティク・データをステージング表に格納できるN-Triple形式またはN-Quad形式でOracle Databaseから取り出す)に関連する、次のトピックがあります。
例1-83に示すように、セマンティク・データは、SDO_RDF_TRIPLE_Sのメンバー・ファンクションを使用してアプリケーション表から取得できます。
例1-83 アプリケーション表からのセマンティク・データの取得
--
-- Retrieves model-graph, subject, predicate, and object
--
SQL> SELECT a.triple.GET_MODEL() AS model_graph, a.triple.GET_SUBJECT() AS sub, a.triple.GET_PROPERTY() pred, a.triple.GET_OBJECT() obj FROM articles_rdf_data a where id in (2,99);
MODEL_GRAPH
------------------------------------------------------------
SUB
------------------------------------------------------------
PRED
------------------------------------------------------------
OBJ
------------------------------------------------------------
ARTICLES
<http://nature.example.com/Article1>
<http://purl.org/dc/elements/1.1/creator>
"Jane Smith"
ARTICLES:<http://examples.com/ns#Graph1>
<http://nature.example.com/Article101>
<http://purl.org/dc/elements/1.1/creator>
"John Smith"
--
-- Retrieves graph, subject, predicate, and object
--
SQL> select (case sep_pos when 0 then NULL else substr(model_graph,sep_pos+1) end) graph, sub, pred, obj from (SELECT instr(a.triple.GET_MODEL(),':') AS sep_pos, a.triple.GET_MODEL() AS model_graph, a.triple.GET_SUBJECT() AS sub, a.triple.GET_PROPERTY() pred, a.triple.GET_OBJECT() obj FROM articles_rdf_data a where id in (2,99));
GRAPH
--------------------------------------------------------------------------------
SUB
------------------------------------------------------------
PRED
------------------------------------------------------------
OBJ
------------------------------------------------------------
<http://nature.example.com/Article1>
<http://purl.org/dc/elements/1.1/creator>
"Jane Smith"
<http://examples.com/ns#Graph1>
<http://nature.example.com/Article101>
<http://purl.org/dc/elements/1.1/creator>
"John Smith"
例1-84に示すように、SEM_MATCH表関数(「SEM_MATCH表関数を使用したセマンティク・データの問合せ」を参照)を使用して、セマンティク・データをRDFモデルから取得できます。
例1-84 RDFモデルからのセマンティク・データの取得
-- -- Retrieves graph, subject, predicate, and object -- SQL> select to_char(g$rdfterm) graph, to_char(x$rdfterm) sub, to_char(p$rdfterm) pred, y$rdfterm obj from table(sem_match('Select ?g ?x ?p ?y FROM NAMED <http://examples.com/ns#Graph1> {GRAPH ?g {?x ?p ?y}}',sem_models('articles'),null,null,null,null,' GRAPH_MATCH_UNNAMED=T PLUS_RDFT=T ')); GRAPH ------------------------------------------------------------ SUB ------------------------------------------------------------ PRED ------------------------------------------------------------ OBJ --------------------------------------------------------------------------- <http://examples.com/ns#Graph1> _:m99g3C687474703A2F2F6578616D706C65732E636F6D2F6E73234772617068313Egmb2 <http://purl.org/dc/elements/1.1/creator> _:m99g3C687474703A2F2F6578616D706C65732E636F6D2F6E73234772617068313Egmb1 <http://examples.com/ns#Graph1> <http://nature.example.com/Article102> <http://purl.org/dc/elements/1.1/creator> _:m99g3C687474703A2F2F6578616D706C65732E636F6D2F6E73234772617068313Egmb1 <http://examples.com/ns#Graph1> <http://nature.example.com/Article101> <http://purl.org/dc/elements/1.1/creator> "John Smith" <http://nature.example.com/Article1> <http://purl.org/dc/elements/1.1/creator> "Jane Smith"
セマンティク・データの取得中に取得された空白ノード識別子は、例1-85のコード抜粋に示す変換を使用してモデルとグラフ情報を削除するようにトリミング可能であり、それぞれVARCHAR2 (主語コンポーネントなど)およびCLOB (目的語コンポーネントなど)データに適用できます。
例1-86に、「RDFモデルからのセマンティク・データの取得」に説明されているセマンティク・データ取得問合せを使用して、それぞれsub
列とobj
列に対して例1-85の2つの変換を使用した後に取得された結果を示します。
例1-85 アプリケーション表からのセマンティク・データの取得
-- -- Transformation on column "sub VARCHAR2" -- holding blank node identifier values -- Select (case substr(sub,1,2) when '_:' then '_:' || substr(sub,instr(sub,'m',1,2)+1) else sub end) from … -- -- Transformation on column "obj CLOB" -- holding blank node identifier values -- Select (case dbms_lob.substr(obj,2,1) when '_:' then to_clob('_:' || substr(obj,instr(obj,'m',1,2)+1)) else obj end) from …
例1-86 例1-85の変換の適用による結果
-- -- Results obtained by applying transformations on the sub and pred cols -- SQL> select (case substr(sub,1,2) when '_:' then '_:' || substr(sub,instr(sub,'m',1,2)+1) else sub end) sub, pred, (case dbms_lob.substr(obj,2,1) when '_:' then to_clob('_:' || substr(obj,instr(obj,'m',1,2)+1)) else obj end) obj from (select to_char(g$rdfterm) graph, to_char(x$rdfterm) sub, to_char(p$rdfterm) pred, y$rdfterm obj from table(sem_match('Select ?g ?x ?p ?y FROM NAMED <http://examples.com/ns#Graph1> {GRAPH ?g {?x ?p ?y}}',sem_models('articles'),null,null,null,null,' GRAPH_MATCH_UNNAMED=T PLUS_RDFT=T '))); SUB ------------------------------------------------------------ PRED ------------------------------------------------------------ OBJ --------------------------------------------------------------------------- _:b2 <http://purl.org/dc/elements/1.1/creator> _:b1 <http://nature.example.com/Article102> <http://purl.org/dc/elements/1.1/creator> _:b1
Oracle Databaseリリース12.1では、Oracle Data Pumpユーティリティの全データベース・エクスポートおよびインポートの機能を使用して、セマンティク・ネットワークをエクスポートおよびインポートできます。ネットワークは、全データベース・エクスポートまたはインポートの一部として移動し、データベース全体がOracleのダンプ・ファイル(.dmp
)で表現されます。
データ・ポンプを使用したセマンティク・ネットワークのエクスポートまたはインポートには、次の使用上の注意があります。
インポートのターゲット・データベースには、RDFセマンティク・グラフのソフトウェアがインストールされ、既存のセマンティク・ネットワークが存在していないことが必要です。
ファイングレイン・アクセス制御を使用するセマンティク・ネットワーク(トリプルレベルまたはリソースレベルのOLSまたはVPD)は、エクスポートまたはインポートできません。
Workspace Managerを使用する、バージョン対応のセマンティク・ネットワークは、エクスポートまたはインポートできません。
SEM_CONTAINS (MDSYS.SEMCONTEXT索引タイプ)のセマンティク・ドキュメント索引と、SEM_RELATED (MDSYS.SEM_INDEXTYPE索引タイプ)のセマンティク索引は、エクスポートの前に削除し、インポート後に再作成する必要があります。
エクスポートおよびインポート中は、セマンティク・ネットワーク・オブジェクトに対するデフォルトの(オブジェクトの作成直後に存在する)権限のみが保持されます。たとえばユーザーAがセマンティク・モデルM
を作成し、MDSYS.RDFM_Mに対するSELECTをユーザーBに付与した場合、インポート後に残るのは、MDSYS.RDFM_Mに対するユーザーAのSELECT権限のみです。インポート後、ユーザーBには、MDSYS.RDFM_Mに対するSELECT権限がありません。かわりにユーザーBのSELECT権限が再度付与されます。
セマンティク・ネットワーク・データのエクスポートまたはインポート時には、データ・ポンプのコマンドライン・オプションtransform=oid:n
を使用する必要があります。たとえば、次の形式のコマンドを使用します。
impdp system/<password-for-system> directory=dpump_dir dumpfile=rdf.dmp full=YES version=12 transform=oid:n
データ・ポンプの使用方法に関する情報および例については、『Oracle Databaseユーティリティ』を参照してください。
時間の経過に伴うトリプルの削除によって、RDF_VALUE$表の値のサブセットは、現在セマンティク・ネットワークに含まれるどのRDFトリプルまたはルールでも使用されなくなる可能性があります。このような使用されていない値の数が多くなり、RDF_VALUE$表の大部分を占めるようになった場合、SEM_APIS.PURGE_UNUSED_VALUESサブプログラムを使用して未使用値をパージできます。
パージする前に、MDSYSに、すべてのRDFモデルのアプリケーション表に対するSELECT権限を付与する必要があります。これを行うには、GRANTコマンドを直接使用するか、SEM_APIS.PRIVILEGE_ON_APP_TABLESサブプログラムを使用します。
パージ操作中に実行されたタスクのイベント・トレースは、RDF$ET_TAB表が起動側のスキーマに存在する場合、そこに記録できます(「バルク・ロード中のイベント・トレースの記録」を参照)。
次の例では、RDF_VALUE$表から使用されていない値をパージします。例では、名前付きグラフまたはCLOBを考慮しません。「例: 雑誌記事の情報」の例のデータがロードされていることも前提としています。
例1-87 未使用値のパージ
-- Purging unused values set numwidth 20 -- Create view to show the values actually used in the RDF model CREATE VIEW values_used_in_model (value_id) as SELECT a.triple.rdf_s_id FROM articles_rdf_data a UNION SELECT a.triple.rdf_p_id FROM articles_rdf_data a UNION SELECT a.triple.rdf_c_id FROM articles_rdf_data a UNION SELECT a.triple.rdf_o_id FROM articles_rdf_data a; View created. -- Create views to show triples in the model CREATE VIEW triples_in_app_table as SELECT a.triple.GET_SUBJECT() AS s, a.triple.GET_PROPERTY() AS p, a.triple.GET_OBJ_VALUE() AS o FROM articles_rdf_data a; View created. CREATE VIEW triples_in_rdf_model as SELECT s, p, o FROM TABLE ( SEM_MATCH('{?s ?p ?o}', SEM_MODELS('articles'), null, null, null )); View created. -- -- Content before deletion -- -- Values in mdsys.RDF_VALUE$ CREATE TABLE values_before_deletion as select value_id from mdsys.rdf_value$; Table created. -- Values used in the RDF model CREATE TABLE used_values_before_deletion as SELECT * FROM values_used_in_model; Table created. -- Content of RDF model CREATE TABLE atab_triples_before_deletion as select * from triples_in_app_table; Table created. CREATE TABLE model_triples_before_deletion as select * from triples_in_rdf_model; Table created. -- Delete some triples so that some of the values become unused DELETE FROM articles_rdf_data a WHERE a.triple.GET_PROPERTY() = '<http://purl.org/dc/elements/1.1/title>' OR a.triple.GET_SUBJECT() = '<http://nature.example.com/Article1>'; 5 rows deleted. -- Content of RDF model after deletion CREATE TABLE atab_triples_after_deletion as select * from triples_in_app_table; Table created. CREATE TABLE model_triples_after_deletion as select * from triples_in_rdf_model; Table created. -- Values that became unused in the RDF model SELECT * from used_values_before_deletion MINUS SELECT * FROM values_used_in_model; VALUE_ID -------------------- 1399113999628774496 4597469165946334122 6345024408674005890 7299961478807817799 7995347759607176041 -- RDF_VALUE$ content, however, is unchanged SELECT value_id from values_before_deletion MINUS select value_id from mdsys.rdf_value$; no rows selected -- Now purge the values from RDF_VALUE$ (requires that MDSYS has -- SELECT privilege on *all* the app tables in the semantic network) EXECUTE sem_apis.privilege_on_app_tables; PL/SQL procedure successfully completed. EXECUTE sem_apis.purge_unused_values; PL/SQL procedure successfully completed. -- RDF_VALUE$ content is NOW changed due to the purge of unused values SELECT value_id from values_before_deletion MINUS select value_id from mdsys.rdf_value$; VALUE_ID -------------------- 1399113999628774496 4597469165946334122 6345024408674005890 7299961478807817799 7995347759607176041 -- Content of RDF model after purge CREATE TABLE atab_triples_after_purge as select * from triples_in_app_table; Table created. CREATE TABLE model_triples_after_purge as select * from triples_in_rdf_model; Table created. -- Compare triples present before purging of values and after purging SELECT * from atab_triples_after_deletion MINUS SELECT * FROM atab_triples_after_purge; no rows selected SELECT * from model_triples_after_deletion MINUS SELECT * FROM model_triples_after_purge; no rows selected
セマンティク・ネットワーク索引は、一意でないBツリー索引です(セマンティク・ネットワーク索引を追加、変更および削除して、セマンティク・ネットワーク内のモデルや伴意とともに使用できます)。このような索引を使用すると、ネットワーク内のモデルや伴意に対するSEM_MATCH問合せのパフォーマンスを調整できます。任意の索引と同様に、セマンティク・ネットワーク索引によって、問合せワークロードに適合する索引ベースのアクセスが可能になります。これによって、次の例のシナリオのようにパフォーマンスが大幅に向上する可能性があります。
グラフ・パターンが'{<John> ?p <Mary>}'
の場合は、1つ以上のターゲット・モデルに対して、対応する伴意で(問合せで使用される場合)、便利な'CSP
'または'SCP'
索引を使用できます。
グラフ・パターンが'{?x <talksTo> ?y . ?z ?p ?y}'
の場合は、C
を主要なキーとして使用して('C'
や'CPS'
など)、関連する1つ以上のモデルおよび伴意に便利なセマンティク・ネットワーク索引を用意できます。
ただし、セマンティク・ネットワーク索引を使用すると、DML、ロードおよび推論操作に必要な時間が増加して、パフォーマンス全体が影響を受ける可能性があります。
セマンティク・ネットワーク索引は、次のサブプログラムを使用して作成および管理できます。
これらのサブプログラムはすべてindex_code
パラメータを持ち、このパラメータには、P
、C
、S
、G
、M
を任意の順序(繰返しなし)で含めることができます。index_code内で使用されたこれらの文字は、ビューSEMM_*およびSEMI_*の列P_VALUE_ID、CANON_END_NODE_ID、START_NODE_ID、G_IDおよびMODEL_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, G_ID, MODEL_ID>を使用してPSCGM
索引を作成しています。
EXECUTE SEM_APIS.ADD_SEM_INDEX('PSCGM');
セマンティク・ネットワーク索引を作成すると、それぞれ対応する一意ではないBツリー索引がUNUSABLEステータスになります。これは、この検索の使用による長時間の処理や大量のリソース消費、さらにはそれらに伴って発生する索引のメンテナンス操作により望ましくないパフォーマンス・コストが発生する可能性があるからです。SEM_APIS.ALTER_SEM_INDEX_ON_MODELおよびSEM_APIS.ALTER_SEM_INDEX_ON_ENTAILMENTプロシージャをコールしたときにcommand
パラメータとして'REBUILD'
または'UNUSABLE'
を指定することで、所有する特定のモデルや伴意でセマンティク・ネットワーク索引を使用または不使用に設定できます。セマンティク・ネットワーク索引を使用または不使用にして、パフォーマンスに違いが出るか確認できます。たとえば、次の文はPSCGM
索引をFAMILY
モデルで使用できるように設定します。
EXECUTE SEM_APIS.ALTER_SEM_INDEX_ON_MODEL('FAMILY','PSCGM','REBUILD');
また、次の点にも注意してください。
自分で作成したセマンティク・ネットワーク索引とは無関係に、セマンティク・ネットワークが作成されると自動的に作成される索引の1つに、この項に示したサブプログラムをコールするときにindex_code
を'PSCGM'
と指定することで管理できる索引があります。
新規のモデルまたは新規の伴意を作成すると、セマンティク・ネットワーク索引ごとに一意でない新規のBツリー索引が作成されますが、このようなBツリー索引はいずれも、USABLEステータスになります。
(index_code
値に'M'を含めることにより)セマンティク・ネットワーク索引キーにMODEL_ID列を含めると、問合せのパフォーマンスが向上することがあります。特に、仮想モデルを使用する場合はこの操作が有効です。
モデルおよび伴意のすべてのネットワーク索引に関する情報は、MDSYS.SEM_NETWORK_INDEX_INFOビューに保持されます。表1-16に、このビューの列(一部のリスト)を示します(1つの行が1つのネットワーク索引に対応します)。
表1-16 MDSYS.SEM_NETWORK_INDEX_INFOビューの列(一部のリスト)
列名 | データ型 | 説明 |
---|---|---|
NAME |
VARCHAR2(30) |
RDFモデルまたは伴意の名前 |
TYPE |
VARCHAR2(10) |
索引が構築されるオブジェクトのタイプ: |
ID |
NUMBER |
モデルまたは伴意のID番号、またはネットワークに対する索引の場合は0 (ゼロ) |
INDEX_CODE |
VARCHAR2(25) |
索引のコード(たとえば |
INDEX_NAME |
VARCHAR2(30) |
索引の名前(たとえば、 |
LAST_REFRESH |
TIMESTAMP(6)WITH TIME ZONE |
このコンテンツがリフレッシュされた最終時刻のタイムスタンプ |
表1-16に示した列の他に、MDSYS.SEM_NETWORK_INDEX_INFOビューには、ALL_INDEXESおよびALL_IND_PARTITIONSビュー(どちらも『Oracle Databaseリファレンス』を参照)から得られる次の列を含みます。
ALL_INDEXESビュー: UNIQUENESS、COMPRESSION、PREFIX_LENGTH
ALL_IND_PARTITIONSビュー: STATUS、TABLESPACE_NAME、BLEVEL、LEAF_BLOCKS、NUM_ROWS、DISTINCT_KEYS、AVG_LEAF_BLOCKS_PER_KEY、AVG_DATA_BLOCKS_PER_KEY、CLUSTERING_FACTOR、SAMPLE_SIZE、LAST_ANALYZED
MDSYS.SEM_NETWORK_INDEX_INFOビューの情報は失効している場合があることに注意してください。この情報をリフレッシュするには、SEM_APIS.REFRESH_SEM_NETWORK_INDEX_INFOプロシージャを使用します。
データ型索引は、セマンティク・ネットワークに格納される型付きリテラルの値の索引です。この索引を使用すると、特定のタイプのFILTER式を含むSEM_MATCH問合せのパフォーマンスが大幅に向上する場合があります。たとえば、xsd:dateTime
リテラルのデータ型索引によって、フィルタ(?x < "1929-11-16T13:45:00Z"^^xsd:dateTime)
の評価の速度が向上する場合があります。索引を作成できるいくつかのデータ型を、表1-17に示します。
表1-17 データ型索引が可能なデータ型
データ型URI | Oracleタイプ | 索引タイプ |
---|---|---|
http://www.w3.org/2001/XMLSchema#decimal |
NUMBER |
一意でないBツリー( |
http://www.w3.org/2001/XMLSchema#string |
VARCHAR2 |
一意ではないBツリー( |
http://www.w3.org/2001/XMLSchema#time |
TIMESTAMP WITH TIMEZONE |
一意でないBツリー |
http://www.w3.org/2001/XMLSchema#date |
TIMESTAMP WITH TIMEZONE |
一意でないBツリー |
http://www.w3.org/2001/XMLSchema#dateTime |
TIMESTAMP WITH TIMEZONE |
一意でないBツリー |
http://xmlns.oracle.com/rdf/text |
(該当なし) |
CTXSYS.CONTEXT |
http://xmlns.oracle.com/rdf/geo/WKTLiteral |
SDO_GEOMETRY |
MDSYS.SPATIAL_INDEX |
http://www.opengis.net/geosparql#wktLiteral |
SDO_GEOMETRY |
MDSYS.SPATIAL_INDEX |
データ型索引が適切かどうかは、問合せのワークロードに応じて異なります。xsd
データ型でのデータ型索引は、変数を定数値と比較するフィルタに使用可能であり、特に、非常に選択的なフィルタ条件を持つ選択的でないグラフ・パターンが問合せに含まれる場合に役立ちます。適切なデータ型索引は、空間フィルタまたはテキスト・フィルタを使用する問合せに必要です。
データ型索引によって問合せパフォーマンスは向上しますが、徐々に増加する索引のメンテナンスによって、セマンティク・ネットワークに対するDMLおよびバルク・ロード操作のパフォーマンスが低下する可能性があります。バルク・ロード操作では、通常、データ型索引を削除し、バルク・ロードを実行してからデータ型索引を再作成する方が高速です。
以下のプロシージャを使ってデータ型索引を追加、変更、削除することができます。これらのプロシージャの説明は、「SEM_APISパッケージのサブプログラム」に記載されています。
既存のデータ型索引に関する情報は、MDSYS.SEM_DTYPE_INDEX_INFOビューに保持されます。表1-18に、このビューの列を示します(1つの行が1つのルール索引に対応します)。
表1-18 MDSYS.SEM_DTYPE_INDEX_INFOビューの列
列名 | データ型 | 説明 |
---|---|---|
DATATYPE |
VARCHAR2(51) |
データ型URI |
INDEX_NAME |
VARCHAR2(30) |
索引の名前 |
STATUS |
VARCHAR2(8) |
索引のステータス: |
TABLESPACE_NAME |
VARCHAR2(30) |
索引の表領域 |
例1-88に示すとおり、誕生日が1929年11月16日より前のすべての祖父を見つける問合せの評価中にデータ型索引が使用されるよう、HINT0
ヒントを使用できます。
例1-88 HINT0を使用してデータ型索引が使用されるようにする方法
SELECT x, y
FROM TABLE(SEM_MATCH(
'{?x :grandParentOf ?y . ?x rdf:type :Male . ?x :birthDate ?bd
FILTER (?bd <= "1929-11-15T23:59:59Z"^^xsd:dateTime) }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null, null,
'HINT0={ LEADING(?bd) INDEX(?bd rdf_v$dateTime_idx) }
FAST_DATE_FILTER=T' ));
統計は、Oracle Databaseに格納されているセマンティク・データに対するSPARQL問合せおよびOWL推論のパフォーマンスに重要な意味を持ちます。Oracle Databaseリリース11gでは、セマンティク・データを分析して、統計を最新に保持するために、SEM_APIS.ANALYZE_MODEL、SEM_APIS.ANALYZE_ENTAILMENTおよびSEM_PERF.GATHER_STATSが導入されています。これらのAPIは使用しやすく、表およびパーティション統計の内部的な詳細に関心がない一般ユーザーを対象としています。
次のサブプログラムを使用して、モデルおよび伴意の統計をエクスポート、インポート、設定および削除したり、ネットワーク統計をエクスポート、インポートおよび削除することができます。
この項では、セマンティク・モデルとセマンティク・ネットワークの統計の管理に関連する、次の内容について説明します。
既存のモデルに対する問合せおよび推論が効率的に実行された場合、モデルの所有者として、既存のモデルの統計を保存できます。
-- Login as the model owner (for example, SCOTT) -- Create a stats table. This is required. execute dbms_stats.create_stat_table('scott','rdf_stat_tab'); -- You must grant access to MDSYS SQL> grant select, insert, delete, update on scott.rdf_stat_tab to MDSYS; -- Now export the statistics of model TEST execute sdo_rdf.export_model_stats('TEST','rdf_stat_tab', 'model_stat_saved_on_AUG_10', true, 'SCOTT', 'OBJECT_STATS');
また、SEM_APIS.EXPORT_ENTAILMENT_STATS を使用して、伴意の統計(伴意グラフ)を保存できます。
execute sem_apis.create_entailment('test_inf',sem_models('test'),sem_rulebases('owl2rl'),0,null); PL/SQL procedure successfully completed. execute sem_apis.export_entailment_stats('TEST_INF','rdf_stat_tab', 'inf_stat_saved_on_AUG_10', true, 'SCOTT', 'OBJECT_STATS');
モデルの所有者として、以前にSEM_APIS.EXPORT_MODEL_STATS に保存した統計をリストアできます。これは、このモデルに更新が割り当てられ、統計が再収集された場合に必要となることがあります。統計に変更があると既存のSPARQL問合せの計画変更が生じることがあり、このような計画変更を望まない場合には、古いセットの統計をリストアできます。
execute sem_apis.import_model_stats('TEST','rdf_stat_tab', 'model_stat_saved_on_AUG_10', true, 'SCOTT', false, true, 'OBJECT_STATS');
また、SEM_APIS.IMPORT_ENTAILMENT_STATS を使用して、伴意の統計(伴意グラフ)をリストアできます。
execute sem_apis.import_entailment_stats('TEST','rdf_stat_tab', 'inf_stat_saved_on_AUG_10', true, 'SCOTT', false, true, 'OBJECT_STATS');
統計はネットワーク・レベルで保存できます。
-- First, create a user RDF_ADMIN and assign access to package SEM_PERF to RDF_ADMIN -- -- As SYS -- create user RDF_ADMIN identified by RDF_ADMIN; grant connect, resource, unlimited tablespace to RDF_ADMIN; grant execute on sem_perf to RDF_ADMIN; conn RDF_ADMIN/<password> execute dbms_stats.create_stat_table('RDF_ADMIN','rdf_stat_tab'); grant select, insert, delete, update on RDF_ADMIN.rdf_stat_tab to MDSYS; -- -- This API call will save the statistics of both MDSYS.RDF_VALUE$ table -- and MDSYS.RDF_LINK$ -- execute sem_perf.export_network_stats('rdf_stat_tab', 'NETWORK_ALL_saved_on_Aug_10', true, 'RDF_ADMIN', 'OBJECT_STATS'); -- -- Alternatively, you can save statistics of the MDSYS.RDF_VALUE$ table -- execute sem_perf.export_network_stats('rdf_stat_tab', 'NETWORK_VALUE_TAB_saved_on_Aug_10', true, 'RDF_ADMIN', 'OBJECT_STATS', options=> mdsys.sdo_rdf.VALUE_TAB_ONLY); -- -- Or, you can save statistics of the MDSYS.RDF_LINK$ table -- execute sem_perf.export_network_stats('rdf_stat_tab', 'NETWORK_LINK_TAB_saved_on_Aug_10', true, 'RDF_ADMIN', 'OBJECT_STATS', options=> mdsys.sdo_rdf.LINK_TAB_ONLY);
「ネットワーク・レベルでの統計の保存」の特権ユーザーは、SEM_PERF.IMPORT_NETWORK_STATSを使用して、ネットワーク・レベル統計をリストアできます。
conn RDF_ADMIN/<password>
execute sem_perf.import_network_stats('rdf_stat_tab', 'NETWORK_ALL_saved_on_Aug_10', true, 'RDF_ADMIN', false, true, 'OBJECT_STATS');
モデルの所有者として、このモデルの統計を手動で調整できます。(ただし、統計を調整する前に、統計を必要に応じてリストアできるように先に保存しておく必要があります。)次の例では、モデルの行数とブロック数の2つのメトリックを設定します。
execute sem_apis.set_model_stats('TEST', numrows=>10, numblks=>1,no_invalidate=>false);
また、SEM_APIS.SET_ENTAILMENT_STATS を使用して、伴意の統計を設定できます。
execute sem_apis.set_entailment_stats('TEST_INF', numrows=>10, numblks=>1,no_invalidate=>false);
統計の削除も実行計画に影響を及ぼすことがあります。モデルの所有者として、モデルの統計を削除できます。
execute sem_apis.delete_model_stats('TEST', no_invalidate=> false);
また、SEM_APIS.DELETE_ENTAILMENT_STATSを使用して、伴意の統計を削除できます。(ただし、モデルまたは伴意の統計を削除する前に、統計を必要に応じてリストアできるように先に保存しておく必要があります。)
execute sem_apis.delete_entailment_stats('TEST_INF', no_invalidate=> false);
Oracle Databaseのセマンティク・データを操作するには、次の一般的な手順に従います。
モデルを作成した後は、表にトリプルを挿入できます(「セマンティク・データの例(PL/SQLおよびJava)」を参照)。
この項には、次のPL/SQLの例が含まれます。
このガイドで示されている例の他に、http://www.oracle.com/technetwork/indexes/samplecode/semantic-sample-522114.html
のサンプル・コードを参照してください。
この項では、雑誌記事に関する文のモデルに対応する簡単なPL/SQLの例を示します。例1-89では、説明のためのコメントとともに、この章で説明されている各概念が参照され、「SEM_APISパッケージ・サブプログラム」で述べられている関数とプロシージャが使用されています。
例1-89 雑誌記事の情報に関するモデルの使用
-- Basic steps: -- After you have connected as a privileged user and called -- SEM_APIS.CREATE_SEM_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_SEM_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 articles_rdf_data (id NUMBER, triple SDO_RDF_TRIPLE_S); -- Create the model. EXECUTE SEM_APIS.CREATE_SEM_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-89では、説明のためのコメントとともに、この章で説明されている各概念が参照され、「SEM_APISパッケージ・サブプログラム」で述べられている関数とプロシージャが使用されています。
この例の家族関係は、図1-3のファミリ・ツリーを反映しています。また、この図では、例における一部の情報(CathyはJackの姉妹、JackとTomは男性、Cindyは女性)が直接言明されています。
例1-90 家系の情報に関するモデルの使用
-- Basic steps: -- After you have connected as a privileged user and called -- SEM_APIS.CREATE_SEM_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_SEM_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_sem_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_ENTAILMENT( '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 -- entailment, drop the preceding entailment and then re-create it. EXECUTE SEM_APIS.DROP_ENTAILMENT ('rdfs_rix_family'); -- Re-create the entailment. BEGIN SEM_APIS.CREATE_ENTAILMENT( '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 entailment, -- and then re-create it. EXECUTE SEM_APIS.DROP_ENTAILMENT ('rdfs_rix_family'); -- Re-create the entailment. BEGIN SEM_APIS.CREATE_ENTAILMENT( 'rdfs_rix_family', SEM_Models('family'), SEM_Rulebases('RDFS','family_rb')); END; / -- Find the entailment that was just created (that is, the -- one based on the specified model and rulebases). SELECT SEM_APIS.LOOKUP_ENTAILMENT(SEM_MODELS('family'), SEM_RULEBASES('RDFS','family_rb')) AS lookup_entailment 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 Databaseリリース11.1では、セマンティク・データのサポートが元のRDFの対象範囲を超えて拡張されているため、多くのソフトウェア・オブジェクト(PL/SQLパッケージ、ファンクションおよびプロシージャ、システム表およびビューなど)の名前が変更されています。ほとんどの場合、この変更で文字列RDFがSEMに置換されていますが、SDO_RDFがSEMに置換されている場合もあります。
リリース11.1より前の名前を使用しているすべての有効なコードは、引き続き動作します。既存のアプリケーションに障害は発生しません。ただし、古いアプリケーションは変更して新しいオブジェクト名を使用することをお薦めします。新規アプリケーションでは新しい名前を使用してください。このマニュアルでは、新しい名前のみを記載しています。
表1-19に、セマンティク・テクノロジのサポートに関連する一部のオブジェクトの旧名と新規名を、旧名のアルファベット順に示します。
表1-19 セマンティク・テクノロジのソフトウェア・オブジェクト: 旧名と新規名
古い名前 | 新しい名前 |
---|---|
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 |
RDFセマンティク・グラフのサポートの詳細および関連トピックについては、次のリソースが役立つ場合があります。
「Oracle Spatial and Graph RDFセマンティク・グラフ」ページ(OTN) (ダウンロード、技術やビジネスに関するホワイト・ペーパー、ディスカッション・フォーラム、その他の情報源のリンクが含まれる): http://www.oracle.com/technetwork/database/options/spatialandgraph/overview/rdfsemantic-graph-1902016.html
World Wide Web Consortium (W3C)の「RDF Primer」: http://www.w3.org/TR/rdf-primer/
World Wide Web Consortium (W3C)の「OWL Web Ontology Language Reference」: http://www.w3.org/TR/owl-ref/