• 検索結果がありません。

OracleのRDFサポート

N/A
N/A
Protected

Academic year: 2021

シェア "OracleのRDFサポート"

Copied!
15
0
0

読み込み中.... (全文を見る)

全文

(1)

Oracle の RDF サポート

1. 概要

Resource Description Framework(RDF)は、Universal Resource Identifier(URI)を使用して識別可能な情 報を表示するための標準です。この標準は、特に Web リソース[1]に関するメタデータの表現を目的と しています。RDF は、ライフ・サイエンス、デジタル・ライブラリ、GIS、インテリジェンス、電子商 取引、個人情報管理など、多数のアプリケーション領域にデータを表示するために使用されます。RDF は、セマンティック Web [2]をサポートするための基本的な構成要素を提供します。この構造は単純で あるため、アプリケーション間の相互運用性が促進され、マシンが理解可能な RDF 形式によって Web リソース[3]の自動処理を支援します。

RDF でデータを表現するために、各文は<subject, predicate, object>トリプルに分割されます。このトリプ ルは、指定されたグラフとして効率的にモデル化されます。トリプルの subject と object はノードとして モデル化され、predicate(またはプロパティ)はノード間の関係を説明するための有向リンクとしてモ デル化されます。リンクの方向は、常にオブジェクトをポイントします(図 1)。

図 1: 有向グラフ・データ・モデル内の RDF トリプル

このホワイト・ペーパーでは、Oracle の RDF データ管理方法について説明します。ここでは、RDF デー タを格納するための新しい Oracle オブジェクトの型を紹介します。RDF データ・ストアは、Oracle Spatial Network Data Model(NDM)の上に構築されています。NDM は、データベース内のネットワークやグ ラフの格納、管理、分析を行うための Oracle のソリューションです。したがって、RDF が方向を示すグ ラフの構造は、NDM 内で有向論理ネットワークとして効率的にモデル化されます。 RDF データは、Oracle 内の中央スキーマに格納されます。データベース内のすべての RDF データには 単一のユニバースがあり、問合せや更新に対してユーザーレベルのアクセス機能やコンストラクタが提 供されます。RDF トリプルは、RDF ストアのエントリとしてシステムで解析され格納されます。RDF ネットワーク内のノードは一意に格納され、着信トリプルで発見されると再利用されます。RDF モデル に対応するトリプルを格納するには、ユーザー定義によるアプリケーション表が必要です。これらの ユーザー定義アプリケーション表には、中央の RDF データ・ストアに格納された実際のトリプルをポ イントするための参照のみが格納されます。この RDF データの中央ストレージにより、データベース 内のすべての RDF アプリケーション表(モデル)にわたる分析や選択したアプリケーション表(モデ ル)の分析ができるようになります。

(2)

2. Oracle Database 10g における RDF の利点

Oracle Spatial 10g Release 2 では、業界初のオープンでスケーラブルかつセキュアで信頼性の高い、RDF ベースのアプリケーション用データ管理プラットフォームが導入されました。Oracle の RDF データを管 理するために、新しいオブジェクト型も定義されました。RDF トリプルは、他のオブジェクト関連デー タ型と同様に、グラフ・データ・モデルをベースとして永続化され、索引付けされ、問合せが実行され ます。Oracle Database 10g の RDF データベースでは、アプリケーション開発者が Oracle データベース のスケーラビリティという利点を活用して、スケーラブルなセマンティック・ベースの基幹業務アプリ ケーションをデプロイできます。さらに、Oracle Database 10g のすべての機能を利用できる RDF データ・ モデルも便利です。

RDF アプリケーション領域

• Web メタデータ: Web メタデータを使用する Web リソースとシステムに関する情報を提供しま

す(コンテンツ評価、機能、プライバシー)。 • ライフ・サイエンス・アプリケーション: 単純な分類学から完全に成熟した本体論まで、多様な ナレッジ・ベースをクエリーします。 • 社会的ネットワーク・アプリケーション: Friend of a Friend アプリケーション、セキュリティ・ア プリケーションやインテリジェンス・アプリケーションに共通の社会的ネットワークの追跡やナ ビゲーション。 • セマンティック情報の統合: 共有する中央ビジネス情報モデルを定義することにより、アプリ ケーション間での情報の共有をサポートします。 • セマンティック Web: ソフトウェア・エージェントによる Web 情報の自動処理を可能にします。 • ポータルおよび電子店舗アプリケーション: 大量のメタデータのクエリーが可能な機能です。 RDF 固有の機能 • RDF 文および RDF スキーマを完全にサポート • グラフ・パターンを使用した SQL 検索と RDF モデルの取得の実行 • すべての RDF データ型(URI、空白ノード、プレーン・リテラル、型付きリテラル、ロング・ リテラル、コレクション型)のサポート • RDF スキーマの推論の組込み • グラフ・パターンを使用した、データの出所(起源)を含む RDF モデルの検索 • 推論トリプルを含めることによる RDF モデルの検索 • アサーション(文)の具体化 • グラフ・パターン内のエイリアス・ベースの URI • ユーザー定義ルールを指定する構文 • データ・アクセス: SQL および Java API • 包含: subClassOf と subPropertyOf のサポート

(3)

• ユーザー定義による推論ルールのフレームワーク • RDF データの論理グラフ・ビューを表現するための可視化ツール 関連する Oracle データベースの機能 • クラスタ化されたデータベース・サーバー • パーティション化: 非常に大きなグラフをサポートする Oracle の表のパーティション化 • 並列性: 非常に大きなグラフ・モデルのロード、索引付けおよびクエリーをサポートする Oracle の並列技術

• データのロード: Oracle の SQL Loader ユーティリティを使用した、トリプル形式(例: N-triple)

によるデータのインポートとエクスポート • 位置情報の空間分析 • 一時分析(時系列、タイムスタンプ) • バージョニング • テキスト検索 • 非構造化データ型のサポート(例: XML、空間、イメージ、GeoRaster イメージ、音声、ビデオ、 テキスト) • XML ツール

• ミドルウェア: Oracle Application Server テクノロジーとの密接な統合(BPEL、XSLT、UDDI、ポー

タル)

3. RDF の概要

RDF言語の概要、抽象構文、セマンティックなどの詳細な説明は、Webサイト(http://www.w3.org/RDF/) を参照してください。このセクションでは、このホワイト・ペーパーで取り上げるRDFの概要(トリプ ル、グラフ、コンテナおよび具体化)を概説します。 リソースが記述された各 RDF 文は、トリプルを使用して表現されます。トリプルのセットは RDFグラ フまたはモデルと呼ばれます。トリプルのコンポーネントは、URI または空白ノードによって表される サブジェクト、URI によって表される条件またはプロパティ、および URI、空白ノード、またはリテラ ルよって表されるオブジェクトです。

URI(例: http://www.w3.org/1999/02/22-rdf-syntax-ns#subject)は、Uniform Resource Locator(URL)

のより一般的な形式です。これにより、特定のネットワーク・アドレスを使用しなくても、リソー スの情報が記録されます。 • 空白ノードは、サブジェクトまたはオブジェクト・ノードが不明な場合に使用されます。またサ ブジェクトとオブジェクト・ノード間の関係が n-ary(RDF コンテナのケースと同様)の場合に も使用されます。空白ノードには、接頭辞として識別子「_:」が付けられて、_:anyname001 とい う形式になります。 • 基本的にリテラルは、オプションの言語タグが付いた文字列です。これは、名前、日付、数字な どの値を表すために使用されます。

(4)

• 型付きリテラル(例: “25”^^http://www.w3.org-/2001/XMLSchema#int)は、データ型と組み合わせ た文字列です。このデータ型は、常に URI です。 RDF 内にあるもののグループを記述する場合は(たとえば、クラスの生徒数を表すなど)、コンテナと 呼ばれるリソースを使用します。コンテナの参加者はメンバーと呼ばれます。通常、コンテナとそのメ ンバーを表す場合には、コンテナに空白ノードが生成され、各メンバーはトリプルのオブジェクトとし てそのノードに添付されます。 具体化は、RDF ボキャブラリを使用したトリプルの説明です。具体化ボキャブラリは、具体化クワッド を構成する 4 つの文からなります。たとえば、リソース R によって具体化されたトリプル<S,P,O>は、 次の 4 つのトリプルによって表されます。 • <R, rdf:type, rdf:Statement> • <R, rdf:subject, S> • <R, rdf:property, P> • <R, rdf:object, O> 次に R を使用して、トリプル<S,P,O>のアサーションが作成されます。たとえば、<N, ora:said, R>のよう になります。このように、具体化を使用すると、トリプルを他のトリプルのプロパティとして添付でき ます。

4. Oracle のデータ・ストレージ

Oracle の RDF ストアは、Oracle Spatial Network Data Model(NDM)の上に構築されており、この中に、 ネットワークまたはグラフが接続性を使用して取得したオブジェクト間の関係を格納します。RDF グラ フは、NDM 内の有向論理ネットワークとしてモデル化されます。このネットワークでは、トリプルの サブジェクトとオブジェクトがノードにマッピングされ、条件(またはプロパティ)はサブジェクト開 始ノードとオブジェクト終端ノードを持つリンクにマッピングされます。したがって、リンクは完全な RDF トリプルを表します。Oracle における RDF ストレージの重要な機能は、ノードがトリプルに参加 した数に関係なく、1 回のみ格納されるということです。ただし、新しいトリプルが挿入されるたびに 常に新しいリンクが作成されます。図 2 に、3 つの RDF トリプル<S1, P1, O1>、<S1, P2, O2>、<S2, P2, O2> の RDF グラフがモデル化される様子を示します。トリプルがデータベースから削除されると、対応す るリンクは削除されます。ただし、他に接続されたリンクがある場合は、このリンクに添付されたノー ドは削除されません。

(5)

図 2: Oracle 内の RDF グラフ RDF トリプルは、Oracle 内で解析されて中央スキーマ下のグローバル表に格納されます。データベース 内にあるすべての RDF グラフ(またはモデル)のすべてのトリプルは、このスキーマ下に格納されま す。これらのトリプルへの参照(ID)のみが、ユーザー定義のアプリケーション表に格納されます。こ の表には、このトリプルに関連する他の属性が含まれている場合があります。また必要に応じて、実際 のトリプルを取得するための関数も提供されます。RDF データ・ストレージに必要な表は、 RDF_MODEL$、RDF_VALUE$、RDF_NODE$、RDF_LINK$および RDF_BLANK_NODE$です。 RDF_NODE$表および RDF_LINK$表です。 4.1 RDF データ・ストアへのトリプルの挿入 ユーザーがトリプルを挿入しようとすると、まず RDF_MODEL$表に RDF グラフが存在しているか確認 されます。次に、トリプルの各部分(サブジェクト、条件、オブジェクト)のテキスト値がすでにデー タベース内にあるかどうかを判別するために RDF_VALUE$表がチェックされます。すでに存在してい る場合は、それらの VALUE_ID が取得されます。次に、指定されたグラフ内にトリプルがすでに存在 しているかどうかを確認するために、RDF_LINK$表がチェックされます。指定されたグラフ内にそのト リプルがすでに存在している場合は、以前に挿入されたトリプルの ID が返され、そのデータ・ストア には新しい挿入は実行されません。 そのトリプルのテキスト値が RDF_VALUE$表にない場合は、そのテキスト値が挿入され、新しい VALUE_ID が割り当てられます。このトリプルのサブジェクトとオブジェクトに対応する VALUE_ID は、RDF_NODE$表に挿入されます。次に、RDF_LINK$表で、トリプルの新しい LINK_ID が生成され ます。RDF_LINK$表内におけるトリプルの条件の VALUE_ID は P_VALUE_ID になり、このトリプルの サブジェクトとオブジェクトの VALUE_ID は、それぞれ START_NODE_ID と END_NODE_ID になりま す。グラフに新しいトリプルが挿入されるごとに、新しいレコードが RDF_LINK$表に挿入されます。 挿入されたトリプルには、サブジェクトまたはオブジェクトとして空白ノードが含まれることがありま す。空白ノードが発見されると、_:ORABNuniqueID の形式で Oracle システムが生成した、グローバル で一意な空白ノード名に自動的に変更されます。デフォルトでは、システムは空白ノードを再利用しま せん。ただし、ユーザーは着信トリプルが特定の空白ノードを再利用できるかどうかを指定できます。 このような場合、空白ノードのオリジナルの名前、Oracle システムが生成した名前、および VALUE_ID が、RDF_BLANK_NODE$表に格納されます。その後に同一名で同一の RDF グラフに所属する空白ノー ドが着信すると、データベース内の既存の空白ノードが再利用されます。コンテナのロードには、空白 ノードを再利用する必要があります。RDF_BLANK_NODE$表内のエントリは、再利用の必要がなくな ると安全に削除できます。

(6)

4.2 RDF オブジェクトの型

Oracle の RDF データを管理するために、SDO_RDF_TRIPLE と SDO_RDF- _TRIPLE_S の 2 つの新しい オブジェクト型が定義されました。SDO_RDF_TRIPLE オブジェクトは、RDF データ<subject, predicate, object>のトリプル表現として定義されました。SDO_RDF_TRIPLE_S(RDF トリプル・ストレージ)オ ブジェクトは、データベース内に永続的な RDF データを格納するために定義されました。RDF トリプ ル・ストレージ・オブジェクトには、中央スキーマ内で管理されるトリプルをポイントする ID のみが 含まれます。このストレージ・オブジェクトには、いくつかのコンストラクタとメンバー関数が用意さ れています。SDO_RDF_TRIPLE 型は、データのトリプル・ビューを提供し、SDO_RDF_TRIPLE_S 型は トリプルの ID を格納します。格納される ID は、次のとおりです。

• RDF_T_ID: 一意のトリプル ID で、RDF_LINK$表内の LINK_ID です。

• RDF_M_ID: グラフの MODEL_ID で、RDF_LINK$表内の MODEL_ID です。

• RDF_S_ID: サブジェクトの VALUE_ID で、RDF_LINK$表内の START_NODE_ID です。

• RDF_P_ID: 条件の VALUE_ID で、RDF_LINK$表内の P_VALUE_ID です。

• RDF_O_ID: オブジェクトの VALUE_ID で、RDF_LINK$表内の END_NODE_ID です。

メンバー関数 GET_TRIPLE()は、SDO_RDF_TRIPLE 型のトリプルのサブジェクト、条件、オブジェクト を返します。メンバー関数 GET_SUBJECT()、GET_PROPERTY()、GET_OBJECT()は、それぞれサブジェ クト、条件およびオブジェクトを返します。GET_OBJECT()関数は CLOB 型を返します。これは、返さ れたオブジェクトがロング・リテラルの場合があるためです。

5. RDF の使用例

Oracle データベースで RDF データを取り扱う場合は、次の手順が必要です。RDF データ・ストアは大 きくなりやすいため、すべての RDF 表に別個の表領域を使用することをお薦めします。ユーザーは、 作成可能な権限を持つユーザーとして表領域に接続する必要があります。次の例では、RDF_TBLSPACE という名前の表領域を作成します。

CREATE TABLESPACE rdf_tblspace

DATAFILE '/oradata/orcl/rdf_tblspace.dat' SIZE 1024M REUSE AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED

SEGMENT SPACE MANAGEMENT AUTO;

1. RDF ネットワークの作成: RDF ネットワークを作成すると、Oracle データベース内の RDF スト アが有効になります。RDF ネットワークを作成できるのは、DBA 権限を持つユーザーのみです。 Oracle データベース・インスタンスには、ネットワークを 1 回だけ作成します。次の例では、 RDF_TBLSPACE(既存していることが必要)という名前の表領域を使用して、RDF ネットワー クを作成します。 EXECUTE SDO_RDF.CREATE_RDF_NETWORK('rdf_tblspace');

(7)

もし、データベース・ユーザーの scott で RDF アプリケーション表と RDF モデルを作成する場合には、scott にこの 権限を付与する必要があります。そのため、DBA ユーザーで接続して以下のように権限を付与してください。 GRANT EXECUTE ON MDSYS.RDF_APIS_INTERNAL TO SCOTT;

2. RDF データの参照を格納する表の作成: この手順では、ユーザーに DBA 権限は必要ありません。 この表には、単一の RDF モデルに関連するすべてのデータの参照を含む、SDO_RDF_TRIPLE_S 型の列が含まれていることが必要です。この表には、型が NUMBER で名前が ID の列と、型が SDO_RDF_TRIPLE_S(Oracle がこの列に提供するデフォルトのローダー)で名前が TRIPLE の 列を含めることをお薦めます。次の例では、FAMILY_RDF_DATA という名前の表を作成します。 CREATE TABLE FAMILY_RDF_DATA (id NUMBER, triple SDO_RDF_TRIPLE_S);

3. RDF モデルの作成: RDF モデルを作成するには、モデル名、モデルの RDF データへの参照が格 納された表の名前と、その表内にある SDO_RDF_TRIPLE_S 型の列を指定します。次のコマンド は、前の手順で作成した表を使用する FAMILY という名前のモデルを作成します。

EXECUTE SDO_RDF.CREATE_RDF_MODEL('FAMILY', 'FAMILY_RDF_DATA', 'TRIPLE');

5.1 例: RDF 内のファミリー・ツリー

このセクションでは、ファミリー・ツリー(家系)に関する文の RDF モデルの簡単な例を示します。 ここでファミリーの関係は、図 4 に示すツリーを反映しています。また、直接提示する情報の一部も示 されています。Cathy は Jack の兄弟で、Jack と Tom はともに男性、Cindy は女性です。

図 3: ファミリー・ツリー

FAMILY_RDF_DATA 表に挿入された行には(付録 A 1 を参照)、次の情報が含まれています。John と Janice には、Suzie と Matt という 2 人の子供がいます。Matt は Martha と結婚し、彼らには Tom(男性、 身長 5.75)と Cindy(女性、身長 06.00)という 2 人の子供がいます。Suzie は Sammy と結婚し、Cathy (身長 5.8)と Jack(男性、身長 6)という 2 人の子供がいます。FAMILY_RDF_DATA 表へのデータの

(8)

-- Select all males from the family model SELECT m MALES FROM TABLE(SDO_RDF_MATCH( '(?m rdf:type :Male)', SDO_RDF_Models('family'), null, SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.example.org/family/')), null)); MALES --- http://www.example.org/family/Jack http://www.example.org/family/Tom

-- Select all grandfathers and their grandchildren from the family model, -- No rows will be returned as “grandParentOf” relationship is not explicitly -- defined in the data

SELECT x grandParent, y grandChild FROM TABLE(SDO_RDF_MATCH(

'(?x :grandParentOf ?y) (?x rdf:type :Male)', SDO_RDF_Models('family'), null,

SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.example.org/family/')), null));

no rows selected

Oracle の RDF データ・ストアは、リテラル値の複数の表現をストレージできます。たとえば、付録 A1 の SQL INSERT 文では、最後の 3 つの文で Jack、Tom および Cindy の身長をアサーションしています。

Jack と Cindy の身長はいずれも 6 フィートですが、値は別個に入力されたため、字句的には彼らは異なっ

ているように見えます。この値が RDF ストアに格納されると、両方とも汎用表現を使用して同等の値 として扱われますが、同時に元の値も保存されます。次のクエリーでは、単一のクエリーで Jack と Cindy 両方の身長を問い合わせる方法を示します。またこの例では、RDF クエリーでリテラル定数を使用する 方法を示します。

SELECT p Person, h Height

FROM TABLE(SDO_RDF_MATCH(

'(?p :height "06.00"^^xsd:decimal) (?p :height ?h)', SDO_RDF_Models('family'), null, SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.example.org/family/')), null)); PERSON --- HEIGHT --- http://www.example.org/family/Jack 6 http://www.example.org/family/Cindy 06.00

(9)

5.2 RDF スキーマ

RDF は、特定のアプリケーション・ドメインに関する予測やドメインのセマンティックの定義は行いま せん。たとえば、このファミリー・モデルでは、男性のみが「fatherOf」関係のオブジェクトになるとい うドメイン固有の制約はありません。RDF スキーマを使用すると、アプリケーションのドメインを定義 できます。この情報は、クラス、プロパティおよび属性の概念を使用して表現されます。

ファミリーの例では、Person というクラスには、Male と Female という 2 つのサブクラスがあります。 parentOf プロパティには、fatherOf と motherOf という 2 つのサブプロパティがあります。また、siblingOf プロパティには、brotherOf と sisterOf という 2 つのサブプロパティがあります。fatherOf と brotherOf と いうプロパティには属性 Male があり、motherOf と sisterOf というプロパティには属性 Female がありま す。付録 A2 では、RDFS ルールを利用して FAMILY RDF モデルに挿入されたトリプルを示します。 ルールの索引の作成 所定のセットの RDF モデルで RDFS ルールを有効にすると、RDFS 推論ルールを RDF クエリーの応答 に使用できます。ルールの索引は RDF モデルのセットに対して作成できます。ユーザーはクエリーの 実行時に RDF クエリーの応答で使用する RDFS ルールを指定できます。ルールの索引は、RDFS ルール の使用が推測されるすべてのトリプルを事前に生成(前方連鎖)します。この事前生成プロセスは、次 の例に示すようにルールの索引を作成することで実行されます。

-- RDFS inferencing in the family model BEGIN SDO_RDF_INFERENCE.CREATE_RULES_INDEX( 'rdfs_rix_family', SDO_RDF_Models('family'), SDO_RDF_Rulebases('RDFS')); END; / このルールの索引を作成後、クエリーの応答に RDFS 推論を使用するかどうかを選択することにより、 ファミリー・モデルからすべての男性を検索する推論クエリーが実行されます。

-- Select all males from the family model, with RDFS inferencing. SELECT m MALES FROM TABLE(SDO_RDF_MATCH( '(?m rdf:type :Male)', SDO_RDF_Models('family'), SDO_RDF_Rulebases('RDFS'), SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.example.org/family/')), null)); MALES ---http://www.example.org/family/John http://www.example.org/family/Matt http://www.example.org/family/Sammy http://www.example.org/family/Jack http://www.example.org/family/Tom

(10)

ルール・ベースの作成

RDFS のルール・ベースだけでなく独自のルール・ベースのセットを作成して、それをクエリーの推論 に使用できます。たとえば、ファミリーの RDF モデルでは、「grandParentOf」ルールを定義すると、祖 父母のプロパティを定義できます。これにより、ルールの索引が作成され、このルールを推論クエリー で使用できるようになります。次の例では、ユーザー定義ルールと、対応するルールの索引の定義方法 を示します。ここでは、RDFS と FAMILY_RB の両方に対して、RULES INDEX が作成されています。

EXECUTE SDO_RDF_INFERENCE.CREATE_RULEBASE('family_rb');

INSERT INTO mdsys.rdfr_family_rb VALUES( 'grandparent_rule',

'(?x :parentOf ?y) (?y :parentOf ?z)', NULL,

'(?x :grandParentOf ?z)',

SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.example.org/family/')));

EXECUTE SDO_RDF_INFERENCE.DROP_RULES_INDEX ('rdfs_rix_family');

BEGIN SDO_RDF_INFERENCE.CREATE_RULES_INDEX( 'rdfs_rix_family', SDO_RDF_Models('family'), SDO_RDF_Rulebases('RDFS', 'family_rb')); END; /

-- Select all grandfathers and their grandchildren from the family model. -- Use inferencing from both the RDFS and family_rb rulebases.

SELECT x grandParent, y grandChild FROM TABLE(SDO_RDF_MATCH(

'(?x :grandParentOf ?y) (?x rdf:type :Male)', SDO_RDF_Models('family'), SDO_RDF_Rulebases('RDFS','family_rb'), SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.example.org/family/')), null)); GRANDPARENT --- GRANDCHILD --- http://www.example.org/family/John http://www.example.org/family/Cindy http://www.example.org/family/John http://www.example.org/family/Tom http://www.example.org/family/John http://www.example.org/family/Cathy http://www.example.org/family/John http://www.example.org/family/Jack また、フィルタ条件のあるルール・ベースも作成できます。たとえば、上記の GRANDPARENT_RULE は、身長が 6 フィートより高い子供の祖父母のみを検索するように変更できます。次の例では、このケー スの SQL を示します。

(11)

UPDATE mdsys.rdfr_family_rb SET

antecedents = '(?x :parentOf ?y) (?y :parentOf ?z) (?z :height ?h)', filter = 'h >= 6',

aliases = SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.example.org/family/')) WHERE rule_name = 'GRANDPARENT_RULE';

-- See the result of the update.

SELECT index_name, status FROM MDSYS.RDF_RULES_INDEX_INFO;

INDEX_NAME STATUS

--- --- RDFS_RIX_FAMILY INVALID

-- Because the rulebase has been updated, drop the preceding rules index, -- and then re-create it.

EXECUTE SDO_RDF_INFERENCE.DROP_RULES_INDEX ('rdfs_rix_family');

-- Re-create the rules index. BEGIN SDO_RDF_INFERENCE.CREATE_RULES_INDEX( 'rdfs_rix_family', SDO_RDF_Models('family'), SDO_RDF_Rulebases('RDFS','family_rb')); END; /

-- Find the rules index that was just created (that is, the -- one based on the specified model and rulebases).

SELECT SDO_RDF_INFERENCE.LOOKUP_RULES_INDEX(SDO_RDF_MODELS('family'), SDO_RDF_RULEBASES('RDFS','family_rb')) AS lookup_rules_index FROM DUAL;

LOOKUP_RULES_INDEX

--- RDFS_RIX_FAMILY

-- Select grandfathers of tall (>= 6) grandchildren, and their -- tall grandchildren.

SELECT x grandParent, y TallGrandChild FROM TABLE(SDO_RDF_MATCH(

'(?x :grandParentOf ?y) (?x rdf:type :Male)', SDO_RDF_Models('family'), SDO_RDF_RuleBases('RDFS','family_rb'), SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.example.org/family/')), null)); GRANDPARENT --- TALLGRANDCHILD --- http://www.example.org/family/John http://www.example.org/family/Cindy http://www.example.org/family/John http://www.example.org/family/Jack

(12)

付録 A 1

-- 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',

(13)

-- 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'));

-- 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',

(14)

付録 A 2

-- 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',

(15)

-- 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'));

参考文献

[1] W3C、RDF Primer、http://www.w3.org/TR/rdf-primer/(2005 年 2 月 24 日現在) [2] W3C、Semantic Web、http://www.w3.org/2001/sw/(2005 年 2 月 24 日現在)

[3] W3C、Frequently Asked Questions about RDF、http://www.w3.org/RDF/FAQ2003(2005 年 2 月 24 日現 在)。

[4] Kowari、http://www.kowari.org/(2005 年 2 月 24 日現在) [5] Sesame、http://www.openrdf.org/(2005 年 2 月 24 日現在)

[6] N. Alexander、X. Lopez、S. Ravada、S. Stephens、および J. Wang、『RDF Data Model in Oracle. in W3C

Workshop on Semantic Web for Life Sciences 2004』Cambridge、Massachusetts、USA

[7] Oracle Corporation、『Application Developer's Guide – Object-Relational Features. 10g Release 1 (10.1)』、 2003 年編集

[8] Oracle Corporation、『Topology and Network Data Models. 10g Release 1 (10.1)』、2003 年編集 [9] S. Powers、『Practical RDF』、初版 2003 年、O'Reilly & Associates, Inc. 331

[10] J. Carroll、I. Dickinson、C. Dollin、D. Reynolds、A. Seaborne、および K. Wilkinson、『Jena: Implementing

the Semantic Web Recommendations. in World Wide Web Conference 2004』、New York、New York、USA

図 1:  有向グラフ・データ・モデル内の RDF トリプル
図 2: Oracle 内の RDF グラフ  RDF トリプルは、Oracle 内で解析されて中央スキーマ下のグローバル表に格納されます。データベース 内にあるすべての RDF グラフ(またはモデル)のすべてのトリプルは、このスキーマ下に格納されま す。これらのトリプルへの参照(ID)のみが、ユーザー定義のアプリケーション表に格納されます。こ の表には、このトリプルに関連する他の属性が含まれている場合があります。また必要に応じて、実際 のトリプルを取得するための関数も提供されます。RDF データ・ストレー
図 3:  ファミリー・ツリー

参照

関連したドキュメント

The main purpose of this paper is to establish new inequalities like those given in Theorems A, B and C, but now for the classes of m-convex functions (Section 2) and (α,

The main problem upon which most of the geometric topology is based is that of classifying and comparing the various supplementary structures that can be imposed on a

the log scheme obtained by equipping the diagonal divisor X ⊆ X 2 (which is the restriction of the (1-)morphism M g,[r]+1 → M g,[r]+2 obtained by gluing the tautological family

We show that the values of Yokota type invariants are independent of the way to expand an edge at the more than 3-valent vertices.. It is enough to see the

Starting from a dualisable, strongly irregular algebra M, we may use the general theory of P lonka sums to produce a version of Theorem 2.3 that preserves the type of M ∞

The orthogonality test using S t−1 (Table 14), M ER t−2 (Table 15), P P I t−1 (Table 16), IP I t−2 (Table 17) and all the variables (Table 18) shows that we cannot reject the

As already discussed before the statement of the Proposition above, the fact that R is not a power partial isometry says that it is impossible to view the covariant representation

In our opinion, the financial statements referred to above present fairly, in all material respects, the consolidated financial position of The Tokyo Electric Power