Oracle® Database

セマンティク・テクノロジ開発者ガイド

11gリリース2 (11.2)

E52974-01(原本部品番号:E25609-06)

2014年1月

このガイドでは、Oracle Databaseによるセマンティク・テクノロジのサポートに関する使用方法およびリファレンス情報について説明します(これらのセマンティク・テクノロジには、Resource Description Framework (RDF)、RDF Schema (RDFS)およびWeb Ontology Language (OWL)に基づくデータとオントロジの格納、推論および問合せ機能が含まれます)。

Oracle Databaseセマンティク・テクノロジ開発者ガイド 11gリリース2 (11.2)

E52974-01

Copyright © 2005, 2014, Oracle and/or its affiliates.All rights reserved.

原本著者:  Chuck Murray

原本協力者:  Eugene Inseok Chong, Souri Das, Vladimir Kolovski, Matt Perry, Karl Rieb, Jags Srinivasan, Seema Sundara, Zhe (Alan) Wu, Aravind Yalamanchi

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracleおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

IntelおよびIntel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴおよびAMD Opteronロゴは、Advanced Micro Devicesの商標または登録商標です。UNIXはThe Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

目次

例一覧

図一覧

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

セマンティク・テクノロジの新機能

- リリース11.2の機能

- リリース11.1の機能

第I部 概念および使用情報

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

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

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

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

- 1.3.1 モデルのメタデータ

- 1.3.2 文

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

- 1.3.3 主語と目的語

- 1.3.4 空白ノード

- 1.3.5 プロパティ

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

- 1.3.7 伴意(ルール索引)

- 1.3.8 仮想モデル

- 1.3.9 名前付きグラフ

- 1.3.9.1 名前付きグラフのサポートに関連するデータ形式

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

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

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

- 1.5.1 トリプル挿入用のコンストラクタ

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

- 1.6.1 不完全な伴意または無効な伴意を使用した問合せの実行

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

- 1.6.2.1 GRAPHキーワードのサポート

- 1.6.3 グラフ・パターン: SPARQL SELECT構文のサポート

- 1.6.4 インライン問合せオプティマイザ・ヒント

- 1.6.5 全文検索

- 1.6.6 空間のサポート

- 1.6.6.1 RDFでの空間データの表現

- 1.6.6.2 空間データの索引付け

- 1.6.6.3 空間データの問合せ

- 1.6.7 問合せパフォーマンスのベスト・プラクティス

- 1.6.7.1 xsd:dateTime、xsd:dateおよびxsd:timeを含むFILTER構成要素

- 1.6.7.2 型付きリテラルを含むFILTER構成要素のファンクション・ベース索引

- 1.6.7.3 関係式を含むFILTER構成要素

- 1.6.7.4 オプティマイザ統計と動的サンプリング

- 1.6.7.5 複数パーティションの問合せ

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

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

- 1.7.1.1 ステージング表のロード

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

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

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

- 1.7.3.1 INSERT文を使用した名前付きグラフへのデータのロード

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

- 1.7.4.1 アプリケーション表からのセマンティク・データの取得

- 1.7.4.2 RDFモデルからのセマンティク・データの取得

- 1.7.4.3 取得した空白ノード識別子からのモデルおよびグラフ情報の削除

- 1.7.5 未使用値のパージ

- 1.8 セマンティク・ネットワーク索引の使用

- 1.8.1 MDSYS.SEM_NETWORK_INDEX_INFOビュー

- 1.9 データ型索引の使用

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

- 1.11 セマンティク・データの例(PL/SQLおよびJava)

- 1.11.1 例: 雑誌記事の情報

- 1.11.2 例: 家系の情報

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

- 1.13 セマンティク・テクノロジの詳細情報

2 OWLの概要

- 2.1 オントロジ

- 2.1.1 例: がんのオントロジ

- 2.1.2 サポートされるOWLサブセット

- 2.2 OWL推論の使用方法

- 2.2.1 単純なOWLオントロジの作成

- 2.2.2 ネイティブOWL推論の実行

- 2.2.3 OWLおよびユーザー定義のルールによる推論の実行

- 2.2.4 OWL推論の証明の生成

- 2.2.5 OWLモデルおよび伴意の検証

- 2.2.6 RDFS推論のためのSEM_APIS.CREATE_ENTAILMENTの使用

- 2.2.7 推論パフォーマンスの向上

- 2.2.8 owl:sameAs推論の最適化

- 2.2.8.1 owl:sameAsで統合された推論グラフの問合せ

- 2.2.9 増分推論の実行

- 2.2.10 パラレル推論の使用

- 2.2.11 名前付きグラフ・ベースの推論(グローバルおよびローカル)の使用

- 2.2.11.1 名前付きグラフ・ベースのグローバル推論(NGGI)

- 2.2.11.2 名前付きグラフ・ベースのローカル推論(NGLI)

- 2.2.11.3 NGGIとNGLIの併用

- 2.2.12 選択的推論の実行(高度な情報)

- 2.3 セマンティク演算子を使用したリレーショナル・データの問合せ

- 2.3.1 SEM_RELATED演算子の使用

- 2.3.2 SEM_DISTANCE補助演算子の使用

- 2.3.2.1 距離情報の計算

- 2.3.3 MDSYS.SEM_INDEXTYPEタイプのセマンティク索引の作成

- 2.3.4 索引付けされた列が最初のパラメータではない場合のSEM_RELATEDおよびSEM_DISTANCEの使用

- 2.3.5 値がURIとして格納されない場合のURIPREFIXの使用

3 Simple Knowledge Organization System (SKOS)のサポート

- 3.1 サポート対象およびサポート対象外のSKOSセマンティク

- 3.1.1 サポートされるSKOSセマンティク

- 3.1.2 サポートされないSKOSセマンティク

- 3.2 SKOSモデルでの推論の実行

- 3.2.1 SKOSモデルおよび伴意の検証

- 3.2.2 プロパティ・チェーンの処理

4 ドキュメントのセマンティク索引付け

- 4.1 ドキュメントのセマンティク索引付け用の情報エクストラクタ

- 4.2 エクストラクタ・ポリシー

- 4.3 ドキュメントのセマンティク索引付け

- 4.4 SEM_CONTAINSおよび補助演算子

- 4.4.1 SEM_CONTAINS_SELECT補助演算子

- 4.4.2 SEM_CONTAINS_COUNT補助演算子

- 4.5 SPARQL問合せパターンを使用したドキュメントの検索

- 4.6 ドキュメントの一致サブグラフでのSPARQL変数のバインディング(SEM_CONTAINS_SELECT補助演算子)

- 4.7 ドキュメント検索操作の品質の向上

- 4.8 外部ドキュメントの索引付け

- 4.9 Calaisエクストラクタ・タイプの構成

- 4.10 General Architecture for Text Engineering (GATE)の使用

- 4.11 新しいエクストラクタ・タイプの作成

- 4.12 レンジ・パーティション表でのローカル・セマンティク索引の作成

- 4.13 セマンティク索引の変更

- 4.13.1 セマンティク索引におけるすべての既存ポリシーの内容の再構築

- 4.13.2 セマンティク索引に新しいポリシーの内容を追加するための再構築

- 4.13.3 セマンティク索引からの既存ポリシーの内容の再構築

- 4.13.4 セマンティク索引から既存ポリシーの内容を削除するための再構築

- 4.14 CREATE INDEXおよびALTER INDEXでのエクストラクタ固有のパラメータの受渡し

- 4.15 ドキュメント中心の推論の実行

- 4.16 セマンティク索引付けのメタデータ・ビュー

- 4.16.1 MDSYS.RDFCTX_POLICIESビュー

- 4.16.2 RDFCTX_INDEX_POLICIESビュー

- 4.16.3 RDFCTX_INDEX_EXCEPTIONSビュー

- 4.17 GATEエクストラクタ出力のデフォルトのスタイル・シート

5 RDFデータのファイングレイン・アクセス制御

- 5.1 RDFデータの仮想プライベート・データベース(VPD)

- 5.1.1 RDFデータのVPDポリシー

- 5.1.2 VPDポリシーを実施するためのRDFメタデータ

- 5.1.3 データ・アクセス制約

- 5.1.4 RDFVPD_POLICIESビュー

- 5.1.5 RDFVPD_MODELSビュー

- 5.1.6 RDFVPD_POLICY_CONSTRAINTSビュー

- 5.1.7 RDFVPD_PREDICATE_MDATAビュー

- 5.1.8 RDFVPD_RESOURCE_RELビュー

- 5.2 RDFデータのOracle Label Security (OLS)

- 5.2.1 トリプルレベル・セキュリティ

- 5.2.2 リソースレベル・セキュリティ

- 5.2.2.1 RDFの主語の保護

- 5.2.2.2 RDFの述語の保護

- 5.2.2.3 RDFの目的語の保護

- 5.2.2.4 推論されたトリプルのラベルの生成

- 5.2.2.5 アプリケーション・ロジックに基づくラベルの使用

- 5.2.2.6 RDFOLS_SECURE_RESOURCEビュー

6 RDFデータに対するWorkspace Managerサポート

- 6.1 RDFデータに対するWorkspace Managerサポートの有効化

- 6.1.1 RDFデータに対するWorkspace Managerサポートの削除

- 6.2 RDFモデルのバージョニングの有効化

- 6.3 バージョン対応RDFモデルからの推論

- 6.4 バージョン対応RDFモデルでのワークスペースのマージおよびリフレッシュ

- 6.5 RDFデータに対してWorkspace Managerサポートを使用する場合の特別な考慮事項

- 6.6 使用フローの例: セマンティク・モデルのバージョニング

7 Jena Adapter for Oracle Database

- 7.1 ソフトウェア環境の設定

- 7.2 SPARQLサービスの設定

- 7.2.1 WebLogic Serverを使用した必要なデータ・ソースの作成

- 7.2.2 SPARQLサービスの構成

- 7.2.2.1 クライアント識別子

- 7.2.2.2 アプリケーション表およびステージング表に対するOLTP圧縮の使用

- 7.2.3 長時間にわたるSPARQL問合せの終了

- 7.2.4 非ASCII文字のN-Tripleエンコーディング

- 7.3 セマンティク・テクノロジ環境の設定

- 7.4 SEM_MATCHとJena Adapter問合せの比較

- 7.5 SPARQL問合せ処理の最適化

- 7.5.1 単一のSEM_MATCHコールへのSPARQL問合せのコンパイル

- 7.5.2 プロパティ・パスの処理の最適化

- 7.6 他の機能をサポートするためのSPARQL構文への追加

- 7.6.1 SQLヒント

- 7.6.2 SPARQL問合せでのバインド変数の使用

- 7.6.3 追加のWHERE句述語

- 7.6.4 追加の問合せオプション

- 7.6.4.1 JOINオプションとフェデレーテッド問合せ

- 7.6.4.2 S2Sオプションの利点と使用方法の情報

- 7.6.5 中間層リソース・キャッシング

- 7.7 Jena Adapterを介してSPARQL問合せでサポートされるファンクション

- 7.7.1 ARQファンクション・ライブラリのファンクション

- 7.7.2 投影変数に関するOracle Databaseのネイティブ・ファンクション

- 7.7.3 ユーザー定義ファンクション

- 7.8 SPARQLの更新のサポート

- 7.9 RDFデータの解析ファンクション

- 7.9.1 グラフ内のパスに関する文脈情報の生成

- 7.10 サーバー側APIのサポート

- 7.10.1 仮想モデルのサポート

- 7.10.2 接続プーリングのサポート

- 7.10.3 セマンティク・モデルのPL/SQLインタフェース

- 7.10.4 推論オプション

- 7.10.5 非推奨となったPelletInfGraphクラスのサポート

- 7.11 Jena Adapterを使用したバルク・ロード

- 7.11.1 パラレル(マルチスレッド)・モードでのprepareBulkの使用

- 7.11.2 データ・ロード中の無効な構文の処理

- 7.12 自動的な変数の名前変更

- 7.13 JavaScript Object Notation (JSON)形式のサポート

- 7.14 その他の推奨事項とガイドライン

- 7.14.1 EXISTSやNOT EXISTSにかわるBOUNDや!BOUNDの使用

- 7.14.2 SPARQL 1.1のSELECT表現

- 7.14.3 bnode (空白ノード)を含む構文

- 7.14.4 SERVICE句の制限

- 7.14.5 OracleGraphWrapperForOntModelクラスによるパフォーマンス向上

- 7.15 Jena Adapterを使用した問合せ例

- 7.15.1 Test.java: 家族関係の問合せ

- 7.15.2 Test6.java: OWLオントロジのロードとOWLPrime推論の実行

- 7.15.3 Test7.java: OWLオントロジのバルク・ロードとOWLPrime推論の実行

- 7.15.4 Test8.java: SPARQL OPTIONAL問合せ

- 7.15.5 Test9.java: LIMITおよびOFFSETを使用するSPARQL問合せ

- 7.15.6 Test10.java: TIMEOUTおよびDOPを使用するSPARQL問合せ

- 7.15.7 Test11.java: 名前付きグラフを含む問合せ

- 7.15.8 Test12.java: SPARQL ASK問合せ

- 7.15.9 Test13.java: SPARQL DESCRIBE問合せ

- 7.15.10 Test14.java: SPARQL CONSTRUCT問合せ

- 7.15.11 Test15.java: 複数のモデルの問合せと重複の許可の指定

- 7.15.12 Test16.java: SPARQLの更新

- 7.15.13 Test17.java: ARQ組込みファンクションを使用するSPARQL問合せ

- 7.15.14 Test18.java: SELECTキャスト問合せ

- 7.15.15 Test19.java: OracleConnectionを使用したOracle Databaseのインスタンス化

- 7.15.16 Test20.java: Oracle Database接続プーリング

- 7.16 SPARQL Gatewayとセマンティク・データ

- 7.16.1 SPARQL Gatewayの機能および利点の概要

- 7.16.2 SPARQL Gatewayのインストールおよび構成

- 7.16.2.1 Jena Adapterの.zipファイルのダウンロード(まだ実行していない場合)

- 7.16.2.2 WebLogic ServerでのSPARQL Gatewayのデプロイ

- 7.16.2.3 プロキシ設定の変更(必要な場合)

- 7.16.2.4 OracleSGDSデータ・ソースの構成(必要な場合)

- 7.16.2.5 SparqlGatewayAdminGroupグループの追加と構成(必要な場合)

- 7.16.3 SPARQL Gatewayでのセマンティク・データの使用

- 7.16.3.1 SPARQL問合せとXSL変換の格納

- 7.16.3.2 タイムアウト値の指定

- 7.16.3.3 ベスト・エフォート型問合せ実行の指定

- 7.16.3.4 text/xml以外のコンテンツ・タイプの指定

- 7.16.4 デフォルトのXSLTファイルのカスタマイズ

- 7.16.5 SPARQL GatewayのJava APIの使用

- 7.16.6 SPARQL GatewayのグラフィカルなWebインタフェースの使用

- 7.16.6.1 メイン・ぺージ(index.html)

- 7.16.6.2 ナビゲーションとブラウジングのページ(browse.jsp)

- 7.16.6.3 XSLTの管理ページ(xslt.jsp)

- 7.16.6.4 SPARQLの管理ページ(sparql.jsp)

- 7.16.7 OBIEEへのXMLデータ・ソースとしてのSPARQL Gatewayの使用

8 Sesame Adapter for Oracle Database

- 8.1 Sesame Adapterの概要

- 8.2 Sesame Adapterの設定と構成

- 8.2.1 ソフトウェア環境の設定

- 8.2.2 SPARQLサービスの設定

- 8.2.2.1 WebLogic Serverを使用した必要なデータ・ソースの作成

- 8.2.2.2 SPARQLサービスの構成

- 8.2.2.3 長時間にわたるSPARQL問合せの終了

- 8.2.3 セマンティク・テクノロジ環境の設定

- 8.3 SEM_MATCHとSesame Adapter問合せの比較

- 8.4 SPARQL問合せ処理の最適化

- 8.4.1 単一のSEM_MATCHコールへのSPARQL問合せのコンパイル

- 8.5 最適なパフォーマンスのための推奨事項

- 8.5.1 文の格納とSesame Adapter問合せに対する影響

- 8.6 他の機能をサポートするためのSPARQL構文への追加

- 8.6.1 SQLヒント

- 8.6.2 追加のWHERE句述語

- 8.6.3 追加の問合せオプション

- 8.7 サーバー側APIのサポート

- 8.7.1 仮想モデルのサポート

- 8.7.2 接続プーリングのサポート

- 8.7.3 セマンティク・モデルのPL/SQLインタフェース

- 8.7.4 推論オプション

- 8.8 Sesame APIに対するOracle固有の拡張機能

- 8.8.1 文の一意性

- 8.8.2 索引とJena Adapterとの相互運用性

- 8.8.3 推論

- 8.8.4 分析操作の実行

- 8.9 Sesame AdapterでのSesame Consoleの使用

- 8.10 Sesame Adapterを使用した問合せ例

- 8.10.1 Example1.java: 基本操作

- 8.10.2 Example2.java: データ・ファイルの追加(TriG形式)

- 8.10.3 Example3.java: 単純な問合せ

- 8.10.4 Example4.java: 単純なバルク・ロード

- 8.10.5 Example5.java: RDF/XMLのバルク・ロードとアプリケーション表の索引のメンテナンス

- 8.10.6 Example6.java: 不良データのあるロードを処理するためのStatusListenerによるバルク・ロード

- 8.10.7 Example7.java: SesameストアからOracle Databaseへのデータのロード

- 8.10.8 Example8.java: SPARQL ASK問合せ

- 8.10.9 Example9.java: SPARQL CONSTRUCTおよびSPARQL DESCRIBE

- 8.10.10 Example10.java: 推論

- 8.10.11 Example11.java: 名前付きグラフ問合せ

- 8.10.12 Example12.java: アプリケーション表の索引[高度]

- 8.10.13 Example13.java: アプリケーション表の一意性制約[高度]

- 8.10.14 Example14.java: 問合せタイムアウトとパラレル実行[高度]

- 8.10.15 Example15.java: 一致件数の取得[高度]

- 8.10.16 Example16.java: 問合せパターンの定数に対するバインド変数の指定[高度]

- 8.10.17 Example17.java: 問合せパターンの異なる位置の定数に対するバインド変数の指定[高度]

- 8.10.18 Example18.java: 内部の数値IDからのURIの構築[高度]

第II部 リファレンスおよび補足情報

9 SEM_APISパッケージのサブプログラム

- SEM_APIS.ADD_DATATYPE_INDEX

- SEM_APIS.ADD_SEM_INDEX

- SEM_APIS.ALTER_DATATYPE_INDEX

- SEM_APIS.ALTER_ENTAILMENT

- SEM_APIS.ALTER_MODEL

- SEM_APIS.ALTER_SEM_INDEX_ON_ENTAILMENT

- SEM_APIS.ALTER_SEM_INDEX_ON_MODEL

- SEM_APIS.ANALYZE_ENTAILMENT

- SEM_APIS.ANALYZE_MODEL

- SEM_APIS.BULK_LOAD_FROM_STAGING_TABLE

- SEM_APIS.CLEANUP_FAILED

- SEM_APIS.COMPOSE_RDF_TERM

- SEM_APIS.CREATE_ENTAILMENT

- SEM_APIS.CREATE_RULEBASE

- SEM_APIS.CREATE_SEM_MODEL

- SEM_APIS.CREATE_SEM_NETWORK

- SEM_APIS.CREATE_SOURCE_EXTERNAL_TABLE

- SEM_APIS.CREATE_VIRTUAL_MODEL

- SEM_APIS.DISABLE_CHANGE_TRACKING

- SEM_APIS.DISABLE_INC_INFERENCE

- SEM_APIS.DROP_DATATYPE_INDEX

- SEM_APIS.DROP_ENTAILMENT

- SEM_APIS.DROP_RULEBASE

- SEM_APIS.DROP_SEM_INDEX

- SEM_APIS.DROP_SEM_MODEL

- SEM_APIS.DROP_SEM_NETWORK

- SEM_APIS.DROP_USER_INFERENCE_OBJS

- SEM_APIS.DROP_VIRTUAL_MODEL

- SEM_APIS.ENABLE_CHANGE_TRACKING

- SEM_APIS.ENABLE_INC_INFERENCE

- SEM_APIS.ESCAPE_CLOB_TERM

- SEM_APIS.ESCAPE_CLOB_VALUE

- SEM_APIS.ESCAPE_RDF_TERM

- SEM_APIS.ESCAPE_RDF_VALUE

- SEM_APIS.GET_CHANGE_TRACKING_INFO

- SEM_APIS.GET_INC_INF_INFO

- SEM_APIS.GET_MODEL_ID

- SEM_APIS.GET_MODEL_NAME

- SEM_APIS.GET_TRIPLE_ID

- SEM_APIS.GETV$DATETIMETZVAL

- SEM_APIS.GETV$DATETZVAL

- SEM_APIS.GETV$NUMERICVAL

- SEM_APIS.GETV$STRINGVAL

- SEM_APIS.GETV$TIMETZVAL

- SEM_APIS.IS_TRIPLE

- SEM_APIS.LOAD_INTO_STAGING_TABLE

- SEM_APIS.LOOKUP_ENTAILMENT

- SEM_APIS.MERGE_MODELS

- SEM_APIS.PRIVILEGE_ON_APP_TABLES

- SEM_APIS.PURGE_UNUSED_VALUES

- SEM_APIS.REFRESH_SEM_NETWORK_INDEX_INFO

- SEM_APIS.REMOVE_DUPLICATES

- SEM_APIS.RENAME_ENTAILMENT

- SEM_APIS.RENAME_MODEL

- SEM_APIS.SWAP_NAMES

- SEM_APIS.UNESCAPE_CLOB_TERM

- SEM_APIS.UNESCAPE_CLOB_VALUE

- SEM_APIS.UNESCAPE_RDF_TERM

- SEM_APIS.UNESCAPE_RDF_VALUE

- SEM_APIS.VALIDATE_ENTAILMENT

- SEM_APIS.VALIDATE_MODEL

- SEM_APIS.VALUE_NAME_PREFIX

- SEM_APIS.VALUE_NAME_SUFFIX

10 SEM_OLSパッケージのサブプログラム

- SEM_OLS.APPLY_POLICY_TO_APP_TAB

- SEM_OLS.REMOVE_POLICY_FROM_APP_TAB

11 SEM_PERFパッケージのサブプログラム

- SEM_PERF.GATHER_STATS

12 SEM_RDFCTXパッケージのサブプログラム

- SEM_RDFCTX.ADD_DEPENDENT_POLICY

- SEM_RDFCTX.CREATE_POLICY

- SEM_RDFCTX.DROP_POLICY

- SEM_RDFCTX.MAINTAIN_TRIPLES

- SEM_RDFCTX.SET_DEFAULT_POLICY

- SEM_RDFCTX.SET_EXTRACTOR_PARAM

13 SEM_RDFSAパッケージのサブプログラム

- SEM_RDFSA.ADD_VPD_CONSTRAINT

- SEM_RDFSA.APPLY_OLS_POLICY

- SEM_RDFSA.APPLY_VPD_POLICY

- SEM_RDFSA.CREATE_VPD_POLICY

- SEM_RDFSA.DELETE_VPD_CONSTRAINT

- SEM_RDFSA.DISABLE_OLS_POLICY

- SEM_RDFSA.DROP_VPD_POLICY

- SEM_RDFSA.ENABLE_OLS_POLICY

- SEM_RDFSA.MAINT_VPD_METADATA

- SEM_RDFSA.REMOVE_OLS_POLICY

- SEM_RDFSA.REMOVE_VPD_POLICY

- SEM_RDFSA.RESET_MODEL_LABELS

- SEM_RDFSA.SET_PREDICATE_LABEL

- SEM_RDFSA.SET_RDFS_LABEL

- SEM_RDFSA.SET_RESOURCE_LABEL

- SEM_RDFSA.SET_RULE_LABEL

A セマンティク・テクノロジ・サポートの有効化、ダウングレードまたは削除

- A.1 セマンティク・テクノロジ・サポートの有効化

- A.1.1 新規データベース・インストールでのセマンティク・テクノロジ・サポートの有効化

- A.1.2 リリース11.1からのセマンティク・テクノロジ・サポートのアップグレード

- A.1.2.1 空のRDFリテラルの処理

- A.1.3 リリース10.2からのセマンティク・テクノロジ・サポートのアップグレード

- A.1.4 リリース11.2.0.2: セマンティク・テクノロジのインストールが無効になっている場合の必要なアクション

- A.1.5 SpatialおよびPartitioningの要件

- A.2 以前のリリースへのセマンティク・テクノロジ・サポートのダウングレード

- A.2.1 リリース11.1のセマンティク・テクノロジ・サポートへのダウングレード

- A.2.2 リリース10.2のセマンティク・テクノロジ・サポートへのダウングレード

- A.3 セマンティク・テクノロジ・サポートの削除

B 空間問合せのSEM_MATCHサポート

- orageo:area

- orageo:buffer

- orageo:centroid

- orageo:convexHull

- orageo:difference

- orageo:distance

- orageo:intersection

- orageo:length

- orageo:mbr

- orageo:nearestNeighbor

- orageo:relate

- orageo:union

- orageo:withinDistance

- orageo:xor

用語集

索引

例一覧

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

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

- 1-3 伴意の作成

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

- 1-5 TriG形式でエンコードされたRDFデータ

- 1-6 N-QUADS形式の表現

- 1-7 SDO_RDF_TRIPLE_Sのメソッド

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

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

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

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

- 1-12 中カッコの構文

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

- 1-14 中カッコの構文および複数パターンのOPTIONAL構成要素

- 1-15 中カッコの構文およびネストしたOPTIONAL構成要素

- 1-16 中カッコの構文およびパラレルのOPTIONAL構成要素

- 1-17 中カッコの構文およびFILTER構成要素

- 1-18 中カッコの構文とREGEXおよびSTR組込みファンクションを使用したFILTER構成要素

- 1-19 中カッコの構文とUNIONおよびFILTER構成要素

- 1-20 名前付きグラフの構成要素

- 1-21 named_graphsパラメータの使用

- 1-22 graphsパラメータの使用

- 1-23 SPARQL PREFIX、SELECTおよびWHERE句

- 1-24 SPARQL SELECT * (トリプル・パターンのすべての変数)

- 1-25 SPARQL SELECT DISTINCT

- 1-26 FROMおよびFROM NAMEDを使用したRDFデータセットの指定

- 1-27 SPARQL ORDER BY

- 1-28 SPARQL LIMIT

- 1-29 SPARQL OFFSET

- 1-30 インライン問合せオプティマイザ・ヒント

- 1-31 全文検索

- 1-32 orageo:WKTLiteralとして表現された点の空間ジオメトリ

- 1-33 orageo:WKTLiteralの値を使用してエンコードされた空間データ

- 1-34 RDFデータへの空間データ型索引の追加

- 1-35 動的サンプリングのSQLヒント

- 1-36 外部表を使用したステージング表へのロード

- 1-37 アプリケーション表からのセマンティク・データの取得

- 1-38 RDFモデルからのセマンティク・データの取得

- 1-39 アプリケーション表からのセマンティク・データの取得

- 1-40 例1-39の変換の適用による結果

- 1-41 未使用値のパージ

- 1-42 データ型索引を使用するためのHINT0の使用

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

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

- 2-1 単純なOWLオントロジの作成

- 2-2 ネイティブOWL推論の実行

- 2-3 OWLおよびユーザー定義のルールによる推論の実行

- 2-4 証明情報の表示

- 2-5 伴意の検証

- 2-6 名前付きグラフ・ベースのグローバル推論

- 2-7 名前付きグラフ・ベースのローカル推論

- 2-8 選択的推論の実行

- 2-9 SEM_RELATED演算子

- 2-10 SEM_DISTANCE補助演算子

- 2-11 SEM_DISTANCEを使用した返却行数の制限

- 2-12 セマンティク索引の作成

- 2-13 モデルおよびルールベースを指定するセマンティク索引の作成

- 2-14 統計情報の生成が効果的な問合せ

- 2-15 セマンティク索引作成時のURI接頭辞の指定

- 3-1 電子機器スキームのSKOS定義

- 3-2 SKOS伴意の検証

- 3-3 S55を実装するためのプロパティ・チェーンの挿入

- 4-1 RDFCTX_EXTRACTOR抽象タイプの定義

- 4-2 ドキュメント中心の推論の使用

- 5-1 カスタム・ラベル・ジェネレータ・タイプの作成

- 6-1 セマンティク・モデルのバージョニング

- 7-1 単純なSPARQLの更新

- 7-2 挿入と削除の操作によるSPARQLの更新

- 7-3 RDFデータでの解析ファンクションの実行

- 7-4 セマンティク・データでのNDM nearestNeighborsファンクションの実装

- 7-5 文脈情報によるDOTファイルの生成

- 7-6 推論オプションの指定

- 7-7 ステージング表へのデータのロード(prepareBulk)

- 7-8 ステージング表からセマンティク・ネットワークへのデータのロード(completeBulk)

- 7-9 prepareBulkでのRDFaの使用

- 7-10 DatasetGraphへのクワッドのロード

- 7-11 prepareBulkでのiMaxThreadsの使用

- 7-12 無効な構文によるトリプルのスキップ

- 7-13 OntModelとOracle Databaseに格納されたオントロジの使用

- 7-14 カスタム・インメモリー・グラフの使用

- 7-15 家族関係の問合せ

- 7-16 OWLオントロジのロードとOWLPrime推論の実行

- 7-17 OWLオントロジのバルク・ロードとOWLPrime推論の実行

- 7-18 SPARQL OPTIONAL問合せ

- 7-19 LIMITおよびOFFSETを使用するSPARQL問合せ

- 7-20 TIMEOUTおよびDOPを使用するSPARQL問合せ

- 7-21 名前付きグラフ・ベースの問合せ

- 7-22 SPARQL ASK問合せ

- 7-23 SPARQL DESCRIBE問合せ

- 7-24 SPARQL CONSTRUCT問合せ

- 7-25 複数のモデルの問合せと重複の許可の指定

- 7-26 SPARQLの更新

- 7-27 ARQ組込みファンクションを使用するSPARQL問合せ

- 7-28 SELECTキャスト問合せ

- 7-29 OracleConnectionを使用したOracle Databaseのインスタンス化

- 7-30 Oracle Database接続プーリング

- 7-31 SPARQL問合せとXSL変換の格納

- 7-32 問合せの変更

- 7-33 XSL変換の取得および出力

- 8-1 Sesame Adapterの使用フローの例

- 8-2 Jena AdapterモデルとSesame Adapterモデル間の移行

- 8-3 Sesame Consoleの使用

- 8-4 基本操作

- 8-5 データ・ファイルの追加(TriG形式)

- 8-6 単純な問合せ

- 8-7 単純なバルク・ロード

- 8-8 RDF/XMLのバルク・ロードとアプリケーション表の索引のメンテナンス

- 8-9 不良データのあるロードを処理するためのStatusListenerによるバルク・ロード

- 8-10 SesameストアからOracle Databaseへのデータのロード

- 8-11 SPARQL ASK問合せ

- 8-12 SPARQL CONSTRUCTおよびSPARQL DESCRIBE

- 8-13 推論

- 8-14 名前付きグラフ問合せ

- 8-15 アプリケーション表の索引[高度]

- 8-16 アプリケーション表の一意性制約[高度]

- 8-17 問合せタイムアウトとパラレル実行[高度]

- 8-18 一致件数の取得[高度]

- 8-19 問合せパターンの定数に対するバインド変数の指定[高度]

- 8-20 問合せパターンの異なる位置の定数に対するバインド変数の指定[高度]

- 8-21 内部の数値IDからのURIの構築[高度]

図一覧

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

- 1-2 推論

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

- 2-1 がんのオントロジの例

- 6-1 伴意(ルール索引)の物理的なバージョニング

- 7-1 解析ファンクション出力のビジュアル表示

- 7-2 グラフィカル・インタフェースのメイン・ぺージ(index.html)

- 7-3 SPARQL問合せメイン・ぺージのレスポンス

- 7-4 グラフィカル・インタフェースによるナビゲーションとブラウジングのページ(browse.jsp)

- 7-5 ブラウジングとナビゲーションのページ: レスポンス

- 7-6 URIリンクのクリックによる問合せとレスポンス

- 7-7 XSLTの管理ページ

- 7-8 SPARQLの管理ページ

- 7-9 「メタデータのインポート」 - 「データ・ソースの選択」

- 7-10 「メタデータのインポート」 - 「メタデータ型の選択」

- 7-11 「メタデータのインポート」 - 「メタデータ・オブジェクトの選択」

表一覧

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

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

- 1-3 MDSYS.RDF_VALUE$表の列

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

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

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

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

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

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

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

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

- 1-12 FILTER句で使用できる組込みファンクション

- 1-13 SEM_MATCHのgraphsとnamed_graphsの値、および結果のデータセット構成

- 1-14 MDSYS.SEM_NETWORK_INDEX_INFOビューの列(部分リスト)

- 1-15 データ型索引のデータ型

- 1-16 MDSYS.SEM_DTYPE_INDEX_INFOビューの列

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

- 2-1 PATIENTS表のデータの例

- 2-2 サポートされる各ルールベースに含まれるRDFS/OWLボキャブラリ構成要素

- 2-3 MDSYS.SEMCL_entailment_nameビューの列

- 4-1 MDSYS.RDFCTX_POLICIESビューの列

- 4-2 MDSYS.RDFCTX_INDEX_POLICIESビューの列

- 4-3 MDSYS.RDFCTX_INDEX_EXCEPTIONSビューの列

- 5-1 MDSYS.RDFVPD_POLICIESビューの列

- 5-2 MDSYS.RDFVPD_MODELSビューの列

- 5-3 MDSYS.RDFVPD_POLICY_CONSTRAINTSビューの列

- 5-4 MDSYS.RDFVPD_PREDICATE_MDATAビューの列

- 5-5 MDSYS.RDFVPD_RESOURCE_RELビューの列

- 5-6 MDSYS.RDFOLS_SECURE_RESOURCEビューの列

- 7-1 my_strlenのファンクションと戻り値の例

- 7-2 PL/SQLサブプログラムと、対応するJena AdapterのJavaクラスおよびメソッド

- 8-1 PL/SQLサブプログラムと、対応するSesame AdapterのJavaクラスおよびメソッド

- 9-1 inf_components_inパラメータの推論キーワード

- 9-2 label_genパラメータのSEM_RDFSAパッケージ定数

- 13-1 rdfsa_optionsパラメータのSEM_RDFSAパッケージ定数

はじめに

『Oracle Databaseセマンティク・テクノロジ開発者ガイド』では、Resource Description Framework (RDF)、RDF Schema (RDFS)およびWeb Ontology Language (OWL)に基づくデータとオントロジの格納、推論および問合せ機能など、Oracle Database Enterprise Editionによるセマンティク・テクノロジのサポートに関する使用方法およびリファレンス情報について説明します。セマンティク・テクノロジ機能は、Oracle Database Enterprise EditionへのOracle Spatialオプションによってライセンスが付与され、Oracle Database Enterprise EditionへのOracle Partitioningオプションが必要になります。

注意:
Oracleセマンティク・テクノロジ・サポートに関連するタイプ、シノニムまたはPL/SQLパッケージを使用するには、特定のアクションを実行し、前提条件を満たしておく必要があります。これらのアクションおよび前提条件の詳細は、A.1項を参照してください。

対象読者

このガイドは、セマンティク・テクノロジを使用してセマンティク・データをデータベースに格納し、管理および問合せを行う必要のあるユーザーを対象としています。

このガイドの読者は、少なくともResource Description Framework (RDF)およびWeb Ontology Language (OWL)の主要な概念と技術についてよく理解している必要があります。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害のあるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

関連ドキュメント

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」を参照してください。

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

セマンティク・テクノロジの新機能

この項では、Oracle Databaseリリース11の新規および変更されたセマンティク・テクノロジ機能について説明します。

リリース11.2の機能

この項では、Oracle Database 11gリリース2 (11.2)の新規および変更された機能について説明します。

このリリースには、リリース11.1.0.7.0用の個別パッチ7600122で提供された機能も含まれます(「リリース11.1.0.7用に追加された機能(2008年11月)」のリストを参照)。

リリース11.2.0.2: セマンティク・テクノロジ・インストールが無効である場合に必要なアクション:
リリース11.2.0.2.0へのアップグレード後にセマンティク・テクノロジ・インストールが無効である場合、追加アクションが必要になることがあります。詳細は、A.1.4項を参照してください。

リリース11.2.0.3.0用の個別パッチの新規および変更された機能

次に、Oracle Databaseリリース11.2.0.3.0用の個別パッチの新規および変更された機能を示します(プレースホルダ・バグ16679453)。

- SEM_MATCHのDO_UNESCAPE=Tオプション

- RDF_VALUE$表の未使用値のパージ

- リリース11.2.0.4の新しいSEM_APISサブプログラム

- リリース11.2.0.4の変更されたSEM_APISサブプログラム

SEM_MATCHのDO_UNESCAPE=Tオプション

SEM_MATCHテーブル・ファンクションのoptionsパラメータの新しいDO_UNESCAPE=Tオプションによって、返却列の文字は、W3CのN-Triples仕様に従ってエスケープされません(1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照)。

RDF_VALUE$表の未使用値のパージ

時間の経過に伴うトリプルの削除によって、RDF_VALUE$表の値のサブセットは、現在セマンティク・ネットワークに含まれるどのRDFトリプルまたはルールでも使用されなくなる可能性があります。このような使用されていない値の数が多くなり、RDF_VALUE$表の大部分を占めるようになった場合、SEM_APIS.PURGE_UNUSED_VALUESサブプログラムを使用して未使用値をパージできます(1.7.5項「未使用値のパージ」を参照)。

リリース11.2.0.4の新しいSEM_APISサブプログラム

次に、SEM_APIS PL/SQLパッケージの新しいサブプログラムを示します。

- SEM_APIS.ESCAPE_CLOB_TERM

- SEM_APIS.ESCAPE_CLOB_VALUE

- SEM_APIS.ESCAPE_RDF_TERM

- SEM_APIS.ESCAPE_RDF_VALUE

- SEM_APIS.PRIVILEGE_ON_APP_TABLES

- SEM_APIS.PURGE_UNUSED_VALUES

- SEM_APIS.UNESCAPE_CLOB_TERM

- SEM_APIS.UNESCAPE_CLOB_VALUE

- SEM_APIS.UNESCAPE_RDF_TERM

- SEM_APIS.UNESCAPE_RDF_VALUE

リリース11.2.0.4の変更されたSEM_APISサブプログラム

SEM_APIS PL/SQLパッケージの既存のサブプログラムに次の重要な変更が加えられました。

- SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEには、新しいCOLLECT_PRELOAD_STATS=<scope>オプションおよび複数の<stats_scope>_<stats_param>=<number>オプションが含まれます。PARALLEL_CREATE_INDEXオプションは削除されました。

Jena Adapter for Oracle Database (2011年11月更新)

2011年11月に利用可能になった更新済のJena Adapterキットには、次の機能が含まれます。

- Jena 2.6.4、ARQ 2.8.8およびJoseki 3.4.4のサポートが追加されました(7.2項を参照)。

- Java APIおよびJoseki Webサービス・エンドポイント用の名前付きグラフのサポートが追加されました(7.8項「SPARQLの更新のサポート」、7.10.4項「推論オプションの指定」、7.11項「Jena Adapterを使用したバルク・ロード」および7.15.7項「Test11.java: 名前付きグラフを含む問合せ」を参照)。

- SPARQL Update 1.1のサポートが追加されました(7.8項を参照)。

- Attachment、GraphOracleSemまたはDatasetGraphOracleSemクラスのsetInferenceOption(String options)プロシージャを使用して伴意コールにオプションを追加できます(7.10.4項を参照)。

- SPARQL問合せのレスポンス用にJavaScript Object Notation (JSON)形式のサポートが追加されました(7.13項を参照)。

- S2S (SPARQL to pure SQL)問合せオプションは、現在、すべてのSPARQL問合せに対してデフォルトで有効化されています(7.6.4項を参照)。

- 新しいOracleGraphWrapperForOntModelクラスによって、Oracle Databaseに格納されたモデルとともにJena OntModelクラスを使用する場合に、優れたパフォーマンスが発揮されます(7.14.5項を参照)。

- 述語oracle:virtualModelNameを使用することで、SPARQL問合せに応答するためのフォルトのモデルとして仮想モデルを指定できます(7.2.2項を参照)。

Jena Adapter for Oracle Databaseは、既知のJenaグラフおよびJenaモデルのAPIを実装することで、Oracleセマンティク・テクノロジへのJavaベースのインタフェースを提供します。Jena Adapterのダウンロードおよび使用の詳細は、第7章を参照してください。

注意:
Jena Adapterの更新は、その初期リリースから使用可能になっています。更新の新しい機能の詳細は、ダウンロード.zipファイルに含まれるREADMEファイルを参照してください。

名前付きグラフのサポートの拡張(2011年5月のパッチ9825019で追加、リリース11.2.0.3に含まれる)

パッチ9825019 (SEMANTIC TECHNOLOGIES 11G R2 FIX BUNDLE 3)によって、名前付きグラフ・データの次の操作をサポートする機能が追加されました。

- ロード

- 問合せ

- 推論

1.3.9項で、名前付きグラフのサポートの概要を示します。この項には、名前付きグラフ・データの特定の操作の実行に関する項へのリンクも含まれます。

空間のサポート(2011年5月のパッチ9825019で追加、リリース11.2.0.3に含まれる)

パッチ9825019 (SEMANTIC TECHNOLOGIES 11G R2 FIX BUNDLE 3)によって、Oracle Databaseセマンティク・テクノロジでは、orageo:WKTLiteral型付きリテラルとしてエンコードされた空間ジオメトリ・データの格納がサポートされ、空間操作用の問合せ機能のセットが提供されます。

RDFの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

データ型の索引付け(2011年5月のパッチ9825019で追加、リリース11.2.0.3に含まれる)

パッチ9825019 (SEMANTIC TECHNOLOGIES 11G R2 FIX BUNDLE 3)によって、データ型索引(セマンティク・ネットワークに格納された型付きリテラルの値に対する索引)は、特定のタイプのFILTER式を含むSEM_MATCH問合せのパフォーマンスを大幅に向上する可能性があります。

1.9項に、データ型索引の使用方法の説明と、データ型索引を作成、変更および削除する新しいプロシージャに関するリファレンス情報へのリンクがあります。

Jena Adapter SPARQL Gatewayのサポート(2011年9月更新)

SPARQL Gateway (7.16項「SPARQL Gatewayとセマンティク・データ」を参照)が、2011年9月のJena Adapterの更新で追加されました。(Jena Adapterの以前のバージョンを使用中で、SPARQL Gatewayを使用しない場合、2011年9月の更新をダウンロードしてインストールする必要はありません。)

SEM_MATCHでの拡張オプティマイザ・ヒントのサポート(11.2.0.2)

(リリース11.2.0.2で有効) SEM_MATCHのSPARQLコメントを使用してインラインHINT0問合せオプティマイザ・ヒントを埋め込むことが可能で、SPARQL問合せの非ルートBGPにオプティマイザ・ヒントを関連付けることができます。また、BGP間の結合に影響を与える新しいヒントが導入されました。詳細は、1.6.4項「インライン問合せオプティマイザ・ヒント」を参照してください。

RDF用語の全文索引付けおよび検索(11.2.0.2)

(リリース11.2.0.2で有効) MDSYS.RDF_VALUE$表にOracle Text索引を作成し、orardf:textContains SPARQL FILTERファンクションを使用してセマンティク問合せで効率的な全文検索を実行できます。詳細は、1.6.5項「全文検索」を参照してください。

OLSトリプルレベル・セキュリティ(2010年6月のパッチ9819833で追加)

RDFデータのOracle Label Security (OLS)によって、以前から使用可能であったリソースレベル・セキュリティに加え、トリプルレベル・セキュリティ・オプションが提供されます。トリプルレベルによって、パフォーマンスと使いやすさが向上します(5.2.1項「トリプルレベル・セキュリティ」を参照)。

OWL 2 RLのサポート(2010年6月のパッチ9819833で追加)

OWL 2 RLプロファイルが、システム定義のルールベースOWL2RLの追加によってサポートされます(2.1.2項「サポートされるOWLサブセット」を参照)。

リリース11.2に対するパッチで追加された機能(2010年3月リリース)

次の機能は、2010年3月にOracle Technology Network (OTN)で利用可能になったリリース11.2のセマンティク・テクノロジ・パッチに含まれます。これらの機能を使用するには、このパッチを適用する必要があります。

- 1.6.7.1項「xsd:dateTime、xsd:dateおよびxsd:timeを含むFILTER構成要素」および1.6.7.2項「型付きリテラルを含むFILTER構成要素のファンクション・ベース索引」の推奨ベスト・プラクティス

- 第9章「SEM_APISパッケージのサブプログラム」のSEM_APIS.GETV$...形式の名前を持つファンクション

また、A.1.2項「リリース11.1からのセマンティク・テクノロジ・サポートのアップグレード」がA.1.2.1項「空のRDFリテラルの処理」を含むように拡張されました。

Sesame Adapter for Oracle Database

Sesame Adapter for Oracle Databaseは、一般的なSesame Java APIをOracleセマンティク・テクノロジ・サポートに統合します。Sesame Adapterのダウンロードおよび使用の詳細は、第8章を参照してください。

注意:
Sesame Adapterのサポートは、2010年1月にOracle Technology Network (OTN)で使用可能になったパッチで提供され、2010年3月または4月に使用可能になったパッチで更新されました。

ドキュメントのセマンティク索引付け

セマンティク索引付けを使用して、構造化されていないドキュメントから抽出された情報に対して問合せを実行できます。セマンティクに索引付けされたドキュメントは、標準のSQL問合せ内でSEM_CONTAINS演算子を使用して検索できます。セマンティク索引付けの使用方法の詳細は、第4章を参照してください。

SEM_RDFCTX PL/SQLパッケージには、ドキュメントに作成されるエクストラクタ・ポリシーおよびセマンティク索引を管理するサブプログラムが含まれます。このパッケージの詳細は、第12章を参照してください。

仮想プライベート・データベース(VPD)とOracle Label Security (OLS)のサポート

Oracle Databaseの仮想プライベート・データベース(VPD)またはOracle Label Security (OLS)機能を使用して、RDFデータのファイングレイン・アクセス制御メカニズムを実施できます(第5章を参照)。

RDFデータに対するWorkspace Managerサポート

Oracle Workspace Managerを使用して、セマンティク・データ・ストアのRDFデータをバージョン対応にできます(第6章を参照)。

セマンティク・テクノロジ・サポートを有効化、ダウングレードおよび削除するための新しいプロシージャ

データベースでセマンティク・テクノロジ・サポートを有効化、ダウングレードおよび削除するためのプロシージャが再設計されました。これらのプロシージャの詳細は、付録Aを参照してください。

Oracleセマンティク・テクノロジ・サポートに関連するタイプ、シノニムまたはPL/SQLパッケージを使用するには、特定のアクションを実行し、前提条件を満たしておく必要があります。これらのアクションおよび前提条件の詳細は、A.1項を参照してください。

最適化されたowl:sameAs推論

owl:sameAs推論のパフォーマンスを最適化できます(2.2.8項を参照)。

コンパクトな構造を通じた伴意パフォーマンスの最適化

SEM_APIS.CREATE_ENTAILMENTプロシージャのoptionsパラメータにRAW8=Tを指定することで、推論プロセス中に作成された多くの中間表にNUMBERのかわりにRAW8データ型を使用できます。このオプションによって、状況によっては最大で30%伴意パフォーマンスが向上する可能性があります。

増分推論

増分推論を使用して、トリプルの追加後に効率的に伴意(ルール索引)を更新できます(2.2.9項を参照)。

パラレル推論

パラレル推論を使用すると、マルチコアまたはマルチCPUアーキテクチャの機能を利用して、推論パフォーマンスを向上できます(2.2.10項を参照)。

SEM_MATCHの中カッコ構文でのFILTERおよびUNIONのサポート

SEM_MATCHテーブル・ファンクションでサポートされる中カッコ構文に、キーワードのOPTIONALに加え、FILTERまたはUNION (あるいはその両方)を指定できるようになりました。これらのキーワードの詳細は、1.6.2項を参照してください。

Simple Knowledge Organization System (SKOS)のサポート

Simple Knowledge Organization System (SKOS)データ・モデルのコア・サブセットに基づいて推論を実行できます(第3章を参照)。

OWLPrimeを超えた推論

owl:intersectionOfやowl:unionOfなどのOWL構成要素を網羅する追加の推論コンポーネントを指定できます(第9章のSEM_APIS.CREATE_ENTAILMENTプロシージャの「使用方法」にある表9-1「inf_components_inパラメータの推論キーワード」を参照)。

Systematized Nomenclature of Medicine - Clinical Terms (SNOMED CT)のサポート

現在のリリースには、Systematized Nomenclature of Medicine - Clinical Terms (SNOMED CT)の用語の表現をサポートする組込みのルールベースが含まれます。このサポートを含めるには、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールでinf_components_inパラメータにSNOMEDキーワードを指定します。

新しいSEM_APISパッケージのサブプログラム

次のサブプログラムがSEM_APIS PL/SQLパッケージに追加されました(第9章を参照)。

- SEM_APIS.ADD_DATATYPE_INDEX

- SEM_APIS.ALTER_DATATYPE_INDEX

- SEM_APIS.ALTER_ENTAILMENT

- SEM_APIS.ALTER_MODEL

- SEM_APIS.ALTER_SEM_INDEX_ON_ENTAILMENT

- SEM_APIS.ALTER_SEM_INDEX_ON_MODEL

- SEM_APIS.BULK_LOAD_FROM_STAGING_TABLE

- SEM_APIS.COMPOSE_RDF_TERM

- SEM_APIS.CREATE_SOURCE_EXTERNAL_TABLE

- SEM_APIS.DISABLE_CHANGE_TRACKING

- SEM_APIS.DISABLE_INC_INFERENCE

- SEM_APIS.DROP_DATATYPE_INDEX

- SEM_APIS.ENABLE_CHANGE_TRACKING

- SEM_APIS.ENABLE_INC_INFERENCE

- SEM_APIS.GET_CHANGE_TRACKING_INFO

- SEM_APIS.GET_INC_INF_INFO

- SEM_APIS.LOAD_INTO_STAGING_TABLE

- SEM_APIS.MERGE_MODELS

- SEM_APIS.REMOVE_DUPLICATES

- SEM_APIS.RENAME_ENTAILMENT

- SEM_APIS.RENAME_MODEL

- SEM_APIS.SWAP_NAMES

SEM_PERF.GATHER_STATISTICSのパラメータ

SEM_PERF.GATHER_STATSプロシージャは、現在、just_on_values_tableとparallelという2つのパラメータ(両方ともオプション)を受け入れます。このプロシージャの詳細は、第11章を参照してください。

非推奨になったSEM_APIS.*_RULES_INDEXサブプログラム

SEM_APIS PL/SQLパッケージで、名前に_RULES_INDEXが含まれるサブプログラムは非推奨になり、このマニュアルから削除されました。かわりに、名前に_ENTAILMENTが含まれるサブプログラムを使用する必要があります。

- SEM_APIS.ALTER_SEM_INDEX_ON_RULES_INDEXのかわりに、SEM_APIS.ALTER_SEM_INDEX_ON_ENTAILMENTを使用します。

- SEM_APIS.ANALYZE_RULES_INDEXのかわりに、SEM_APIS.ANALYZE_ENTAILMENTを使用します。

- SEM_APIS.CREATE_RULES_INDEXのかわりに、SEM_APIS.CREATE_ENTAILMENTを使用します。

- SEM_APIS.DROP_RULES_INDEXのかわりに、SEM_APIS.DROP_ENTAILMENTを使用します。

- SEM_APIS.LOOKUP_RULES_INDEXのかわりに、SEM_APIS.LOOKUP_ENTAILMENTを使用します。

古い*_RULES_INDEX形式は引き続き動作しますが、*_ENTAILMENTサブプログラムの使用に切り替えることをお薦めします。

いくつかのメタデータ・ビューには、現在も名前にRULES_INDEXが含まれることに注意してください。

伴意とルール索引という用語は、このマニュアルでは同じ意味ですが、主に伴意が使用されます。

リリース11.1の機能

次に、Oracle Database 11gリリース1 (11.1)の新規および変更された機能について説明します。

リリース11.1.0.7用に追加された機能(2008年11月)

この項では、2008年11月にMy Oracle Supportで利用可能になったリリース11.1.0.7.0用の個別パッチ7600122に含まれる機能について説明します。

- 仮想モデルのサポート(1.3.8項を参照)

- OPTIONAL構成要素のサポートを含むSEM_MATCHグラフ・パターンの中カッコの構文(1.6.2項を参照)

- SEM_MATCH問合せでのHINT0 (ヒント・ゼロ)の使用(1.6項を参照)

- SEM_MATCHから戻される新しい列: id、_prefix、_suffix (1.6項を参照)

- モデルおよびルール索引にセマンティク・ネットワーク索引を作成して管理する機能(1.8項を参照)

- SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャ: flagsパラメータの新しいオプション(タスクIZC、MBVおよびMBT用のjoin_hintとparallel=n)

- ステージング表の定義(列の減少)および権限要件の簡略化(1.7.1項を参照)

- バルク・ロード中のイベント・トレースの簡略化(1.7.1.2項の新しいRDF$ET_TAB表に関する情報を参照)

記憶域モデルの拡張と移行

記憶域モデルは、OWL推論をサポートするように拡張されました(いくつかの内部データ構造および索引が変更、追加および削除されました)。これらの変更の結果、パフォーマンスも向上しています。

これらの変更の範囲に含まれるため、以前のリリースで使用していたセマンティク・データがある場合、このリリースの新しい機能を使用するには、そのデータをアップグレードして新しい形式に移行する必要があります。詳細は、付録A「セマンティク・テクノロジ・サポートの有効化、ダウングレードまたは削除」を参照してください。

OWL推論のサポート

Web Ontology Language (OWL)ベースのオントロジの格納、検証および問合せを支援するためのサポートが追加されました。サポートは、OWL DL言語のサブセットに提供されます。

オントロジ・データを問い合せるには、セマンティク関係を調査するテーブル・ファンクションおよび演算子(SEM_MATCH、SEM_RELATED、SEM_DISTANCEなど)を使用します。

パフォーマンス向上のための新しいバルク・ロード・インタフェース

ステージング表の使用とSEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャのコールを通じて、セマンティク・データをバルク・ロードする際のパフォーマンスを向上できます。詳細は、1.7.1項を参照してください。

リレーショナル・データのオントロジ支援問合せ

オントロジをデータに関連付け、新しいSEM_RELATED演算子(およびオプションでそのSEM_DISTANCE補助演算子)を使用することで、構文的な一致を超えて、リレーショナル・データのセマンティク関係ベースの問合せを実行できます。新しいSEM_INDEXTYPE索引タイプによって、セマンティク問合せのパフォーマンスが向上します。

セマンティク・テクノロジ・サポートを使用する場合の必須手順

Oracleセマンティク・テクノロジ・サポートに関連するタイプ、シノニムまたはPL/SQLパッケージを使用するには、セマンティク・テクノロジのサポートを有効にする必要があります。詳細は、付録A「セマンティク・テクノロジ・サポートの有効化、ダウングレードまたは削除」を参照してください。

第I部

概念および使用情報

このマニュアルは、次のように構成されています。

- 第I部では、Oracleセマンティク・テクノロジの概念および使用方法について説明します。

- 第II部では、Oracleセマンティク・テクノロジのサブプログラムに関するリファレンス情報を示し、付録および用語集で補足情報を示します。

第I部には、次の章が含まれます。

- 第1章「Oracle Databaseセマンティク・テクノロジの概要」

- 第2章「OWLの概要」

- 第3章「Simple Knowledge Organization System (SKOS)のサポート」

- 第4章「ドキュメントのセマンティク索引付け」

- 第5章「RDFデータのファイングレイン・アクセス制御」

- 第6章「RDFデータに対するWorkspace Managerサポート」

- 第7章「Jena Adapter for Oracle Database」

- 第8章「Sesame Adapter for Oracle Database」

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

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

- RDFの概念に関する優れた解説は、http://www.w3.org/TR/rdf-primer/にあるWorld Wide Web Consortium (W3C)の「RDF Primer」を参照してください。

- OWLの詳細は、http://www.w3.org/TR/owl-ref/にある「OWL Web Ontology Language Reference」を参照してください。

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

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

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

- 1.1項「Oracleセマンティク・テクノロジの概要」

- 1.2項「セマンティク・データのモデル化」

- 1.3項「データベースのセマンティク・データ」

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

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

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

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

- 1.8項「セマンティク・ネットワーク索引の使用」

- 1.9項「データ型索引の使用」

- 1.10項「セマンティク・データを使用するためのクイック・スタート」

- 1.11項「セマンティク・データの例(PL/SQLとJava)」

- 1.12項「セマンティク・テクノロジ用のソフトウェアの名前変更」

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

セマンティク・テクノロジ・サポートを有効化するために必要なアクション:
このガイドに記載されている操作を実行する前に、データベースでセマンティク・テクノロジ・サポートを有効化し、他の前提条件を満たす必要があります(A.1項「セマンティク・テクノロジ・サポートの有効化」を参照)。

リリース11.2.0.2: セマンティク・テクノロジ・インストールが無効である場合に必要なアクション:
リリース11.2.0.2.0へのアップグレード後にセマンティク・テクノロジ・インストールが無効である場合、追加アクションが必要になることがあります。詳細は、A.1.4項を参照してください。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 主語は、URIまたは空白ノードである必要があります。

- プロパティは、URIである必要があります。

- 目的語は、URI、空白ノードまたはリテラルのいずれのタイプでもかまいません。(ただし、NULL値およびNULL文字列はサポートされません。)

1.3.1 モデルのメタデータ

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

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

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

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

列名

データ型

説明

OWNER

VARCHAR2(30)

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

MODEL_ID

NUMBER

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

MODEL_NAME

VARCHAR2(25)

モデルの名前。

TABLE_NAME

VARCHAR2(30)

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

COLUMN_NAME

VARCHAR2(30)

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

MODEL_TABLESPACE_NAME

VARCHAR2(30)

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

モデルを作成すると、そのモデルに関連付けられたトリプルのビューもMDSYSスキーマに作成されます。このビューは、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はデフォルト・グラフを示します(1.3.9項「名前付きグラフ」を参照)。

LINK_ID

VARCHAR2(71)

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

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

1.3.2 文

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

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

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

表1-3 MDSYS.RDF_VALUE$表の列

列名

データ型

説明

VALUE_ID

NUMBER

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

VALUE_TYPE

VARCHAR2(10)

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

VNAME_PREFIX

VARCHAR2(4000)

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

VNAME_SUFFIX

VARCHAR2(512)

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

LITERAL_TYPE

VARCHAR2(4000)

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

LANGUAGE_TYPE

VARCHAR2(80)

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

CANON_ID

NUMBER

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

COLLISION_EXT

VARCHAR2(64)

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

CANON_COLLISION_EXT

VARCHAR2(64)

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

LONG_VALUE

CLOB

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

VALUE_NAME

VARCHAR2(4000)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.3.3 主語と目的語

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

1.3.4 空白ノード

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

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

1.3.5 プロパティ

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

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

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

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

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

図1-2 推論

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

- 前件に対応する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データ型の詳細は、1.6項を参照。)

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

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

列名

データ型

説明

OWNER

VARCHAR2(30)

ルールベースの所有者

RULEBASE_NAME

VARCHAR2(25)

ルールベースの名前

RULEBASE_VIEW_NAME

VARCHAR2(30)

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

STATUS

VARCHAR2(30)

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

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

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

EXECUTE SEM_APIS.CREATE_RULEBASE('family_rb');

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

例1-1に示されている祖父母ルールの種類は、OWL 2プロパティ・チェーン構成要素を使用して実装できることに注意してください。プロパティ・チェーンの処理の詳細は、3.2.2項を参照してください。

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

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

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

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

1.3.7 伴意(ルール索引)

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

伴意を作成するには、SEM_APIS.CREATE_ENTAILMENTプロシージャを使用します。伴意を削除するには、SEM_APIS.DROP_ENTAILMENTプロシージャを使用します。

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

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

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

列名

データ型

説明

OWNER

VARCHAR2(30)

伴意の所有者

INDEX_NAME

VARCHAR2(25)

伴意の名前

INDEX_VIEW_NAME

VARCHAR2(30)

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

STATUS

VARCHAR2(30)

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

MODEL_COUNT

NUMBER

伴意に含まれるモデルの数

RULEBASE_COUNT

NUMBER

伴意に含まれるルールベースの数

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

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

列名

データ型

説明

INDEX_NAME

VARCHAR2(25)

伴意の名前

DATA_TYPE

VARCHAR2(8)

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

DATA_NAME

VARCHAR2(25)

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

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

例1-3 伴意の作成

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

1.3.8 仮想モデル

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

仮想モデルを使用する場合の利点は次のとおりです。

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

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

- 仮想モデルを問い合せることは、SEM_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データのサポートの詳細は、第6章を参照してください。)

仮想モデルは、ビューを使用し(この項の後の部分を参照)、いくつかのメタデータ・エントリを追加しますが、システム記憶域要件はそれほど増大しません。

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

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

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

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

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

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

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

列名

データ型

説明

OWNER

VARCHAR2(30)

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

MODEL_ID

NUMBER

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

MODEL_NAME

VARCHAR2(25)

仮想モデルの名前。

TABLE_NAME

VARCHAR2(30)

仮想モデルの場合はNULL。

COLUMN_NAME

VARCHAR2(30)

仮想モデルの場合はNULL。

MODEL_TABLESPACE_NAME

VARCHAR2(30)

仮想モデルの場合はNULL。

すべての仮想モデルに関する情報は、MDSYS.SEM_VMODEL_INFOビューに保持されます(表1-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)

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

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)

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

DATA_NAME

VARCHAR2(25)

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

1.3.9 名前付きグラフ

Oracle Databaseセマンティク・テクノロジでは、名前付きグラフの使用がサポートされます(詳細は、http://www.w3.org/TR/rdf-sparql-query/#rdfDatasetにあるW3C勧告「SPARQL Query Language for RDF」の「RDF Dataset」を参照してください)。

このサポートは、従来の主語、述語、目的語で構成される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オブジェクト型(1.5項を参照)の名前付きグラフをサポートするため、モデル-グラフ(モデルとグラフ(存在する場合)の組合せ)を指定するための新しい構文が用意され、RDF_M_ID属性はモデル-グラフの識別子(グラフ(存在する場合)のモデルIDと値IDの組合せ)を保持します。モデル-グラフの名前は、model_nameと、(グラフが存在する場合)それに続くコロン(:)区切り文字およびグラフ名(URIを山カッコ< >内に配置)で指定されます。

たとえば、医療データセットでは、各RDFトリプルの名前付きグラフの構成要素は患者の識別子に基づくURIになるため、一意の患者と同じ数の名前付きグラフが存在することになります(それぞれの名前付きグラフは特定の患者のデータで構成されます)。

名前付きグラフに特定の操作を実行する方法の詳細は、次の項を参照してください。

- コンストラクタとメソッドの使用: 1.5項「セマンティク・データの型、コンストラクタおよびメソッド」

- ロード: 1.7.1.1.2項「外部表を使用したステージング表へのN-Quad形式のデータのロード」および1.7.3.1項「INSERT文を使用した名前付きグラフへのデータのロード」

- 問合せ: 1.6.2.1項「GRAPHキーワードのサポート」および1.6.3項「グラフ・パターン: SPARQL SELECT構文のサポート」

- 推論: 2.2.11項「名前付きグラフ・ベースの推論(グローバルおよびローカル)の使用」

1.3.9.1 名前付きグラフのサポートに関連するデータ形式

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からDatasetGraphOracleSemオブジェクトにTriGファイルをロードすると(たとえば、7.11項「Jena Adapterを使用したバルク・ロード」の例7-10の定数"N-QUADS"を"TRIG"に置き換えて使用する場合など)、デフォルト・グラフのトリプルはNULLのグラフ名を持つトリプルとしてOracle Databaseにロードされ、名前付きグラフのトリプルは指定されたグラフ名でOracle Databaseにロードされます。

N-QUADS形式は、オプションの4番目の列(グラフ名またはコンテキスト)を追加することで既存のN-TRIPLES形式を単純に拡張したものです。例1-6に、例1-5に基づくTriGファイルのN-QUADS形式の表現を示します。

例1-6 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>

DatasetGraphOracleSemオブジェクトにN-QUADSファイルをロードすると(例7-10を参照)、4番目の列を含まない行はNULLのグラフ名を持つトリプルとしてOracle Databaseにロードされ、4番目の列を含む行は指定されたグラフ名でOracle Databaseにロードされます。

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

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

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

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

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

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

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

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

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

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

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

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

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

名前

含まれる情報

参照先

RDF_VALUE$

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

1.3.2項

RDFOLS_SECURE_RESOURCE

Oracle Label Security (OLS)ポリシーで保護されたリソースと、それらのリソースに関連付けられた機密性ラベル

5.2.2.6項

RDFVPD_MODELS

RDFモデルとそれらに関連付けられたVPDポリシー

5.1.5項

RDFVPD_POLICIES

スキーマに定義されているすべてのVPDポリシーまたはユーザーが完全なアクセス権を持っているポリシー

5.1.4項

RDFVPD_POLICY_CONSTRAINTS

現在のユーザーがアクセスできるVPDポリシーに定義された制約

5.1.6項

RDFVPD_PREDICATE_MDATA

VPDポリシーに関連付けられた述語メタデータ

5.1.7項

RDFVPD_RESOURCE_REL

VPDポリシーのリソース間に定義されているサブクラス、サブプロパティおよび等価プロパティの関係

5.1.8項

SEM_DTYPE_INDEX_INFO

ネットワークのすべてのデータ型索引

1.9項

SEM_MODEL$

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

1.3.1項

SEM_NETWORK_INDEX_INFO$

セマンティク・ネットワーク索引

1.8.1項

SEM_RULEBASE_INFO

ルールベース

1.3.6項

SEM_RULES_INDEX_DATASETS

伴意で使用されるデータベース・オブジェクト

1.3.7項

SEM_RULES_INDEX_INFO

伴意(ルール索引)

1.3.7項

SEM_VMODEL_INFO

仮想モデル

1.3.8項

SEM_VMODEL_DATASETS

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

1.3.8項

SEMCL_entailment-name

owl:sameAsクリーク・メンバーおよび正規形表現

2.2.8項

SEMI_entailment-name

指定した伴意のトリプル

1.3.7項

SEMM_model-name

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

1.3.1項

SEMR_rulebase-name

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

1.3.6項

SEMU_virtual-model-name

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

1.3.8項

SEMV_virtual-model-name

仮想モデル内のトリプル

1.3.8項

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

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

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

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

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

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

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

SDO_RDF_TRIPLE_S (
RDF_C_ID  NUMBER,  -- Canonical object value ID
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>

1.5.1 トリプル挿入用のコンストラクタ

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

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

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

GET_OBJ_VALUE() RETURN VARCHAR2;

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

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

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

SEM_MATCH(
query        VARCHAR2,
models       SEM_MODELS,
rulebases    SEM_RULEBASES,
aliases      SEM_ALIASES,
filter       VARCHAR2,
index_status VARCHAR2,
options      VARCHAR2,
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です。仮想モデルを問い合せる場合、他のモデル名は指定せず、その仮想モデルの名前のみを指定します。(仮想モデルの詳細は、1.3.8項を参照してください。)

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

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

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

('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キーワードを使用することをお薦めします(1.6.2項を参照)。FILTERキーワードを使用すると、内部の最適化によってパフォーマンスが向上する可能性が高まります。ただし、filter引数は、FILTERキーワードで表現できないSQL構文を必要とする場合に役立ちます。

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

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

- ALL_BGP_HASHおよびALL_BGP_NLは、すべてのBGP間結合(ルートBGPとOPTIONAL BGP間の結合など)で、指定した結合タイプを使用するように指定するグローバル問合せオプティマイザ・ヒントです。(BGPとは、基本グラフ・パターンを意味します。W3C勧告の「SPARQL Query Language for RDF」の解説: 「SPARQLグラフ・パターンの一致は、基本グラフ・パターンの一致結果の組合せに基づいて定義されます。フィルタによって割り込まれた一連のトリプル・パターンは、単一の基本グラフ・パターンで構成されます。任意のグラフ・パターンによって、基本グラフ・パターンは終了します。」
例1-14に、SEM_MATCH問合せで使用されるALL_BGP_HASHオプションを示します。

- ALL_LINK_HASHおよびALL_LINK_NLは、すべてのLINK$結合(BGP内のトリプル・パターン間のすべての結合)の結合タイプを指定するグローバル問合せオプティマイザ・ヒントです。ALL_LINK_HASHまたはALL_LINK_NLがHINT0ヒントで使用される場合、HINT0ヒントによってALL_ORDEREDヒントはオーバーライドされます。

- ALL_ORDEREDは、問合せの各BGPのトリプル・パターンを順番に評価するように指定するグローバル問合せオプティマイザ・ヒントです。ALL_ORDEREDがHINT0ヒントで使用される場合、HINT0ヒントによってALL_ORDEREDヒントはオーバーライドされます。
例1-14に、SEM_MATCH問合せで使用されるALL_ORDEREDオプションを示します。

- ALLOW_DUP=Tは、セマンティク・モデルと推論データ(適用可能な場合)のUNIONではなくUNION ALLを実行する、基礎となるSQL文を生成します。このオプションを使用した場合、結果セットに追加の行(重複するトリプル)が生成されるために、それに応じてアプリケーション・ロジックを調整する必要があることがあります。このオプションを指定しない場合、すべてのモデルと推論データにわたって、重複するトリプルは自動的に削除され、マージされたRDFグラフの設定済セマンティクが保持されます。ただし、重複するトリプルを削除すると、問合せの処理時間が長くなります。一般に、1つのSEM_MATCH問合せに複数のセマンティク・モデルが関連している場合、'ALLOW_DUP=T'を指定することで、パフォーマンスが大幅に向上します。
仮想モデルを問い合せる場合、ALLOW_DUP=Tを指定すると、SEMV_vm_nameビューが問合せされます。指定しない場合、SEMU_vm_nameビューが問合せされます。

- 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.UNESCAPE_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句内で一致させることができます。つまり、2つのトリプルは、それらのグラフが等しい場合、またはグラフの一方または双方がNULLの場合、グラフ結合条件を満たします。このオプションは、データセットに名前のない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オプションを示します。

- INF_ONLY=Tは、指定したモデルおよびルールベースの伴意グラフのみを問い合せます。

- PLUS_RDFT=Tは、予測される問合せ変数ごとに追加でvar$RDFTERM CLOB列を戻すため、SPARQL SELECT構文(1.6.3項「グラフ・パターン: SPARQL SELECT構文のサポート」を参照)とともに使用できます。この列の値は、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になります。

- STRICT_DEFAULT=Tは、データセット情報が指定されていない場合、デフォルト・グラフを名前なしトリプルに制限します。

graphs属性は、SEM_MACH問合せのデフォルト・グラフを構成するための名前付きグラフのセットを指定します。そのデータ型は、TABLE OF VARCHAR2(4000)という定義を持つSEM_GRAPHSです。この属性のデフォルト値はNULLです。graphsがNULLの場合、デフォルト・グラフとして、問合せモデルのセットに含まれるすべてのグラフのUNION ALLが使用されます。

named_graphs属性は、GRAPH句によって一致させることができる名前付きグラフのセットを指定します。そのデータ型は、TABLE OF VARCHAR2(4000)という定義を持つSEM_GRAPHSです。この属性のデフォルト値は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句を含む問合せの正しい結果順序を保証するために使用できます)。

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

例1-9 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-10は例1-9と同じ機能ですが、HINT0オプションが追加されています。

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

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

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

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

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_RELATED演算子を使用してOWLオントロジを問い合せる方法の詳細は、2.3項を参照してください。

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

1.6.1 不完全な伴意または無効な伴意を使用した問合せの実行

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

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

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

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

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

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

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

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

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

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

SEM_MATCHテーブル・ファンクションは、一連のトリプル・パターンを中カッコで囲むグラフ・パターンの構文を受け入れます。OPTIONAL、FILTER、UNIONまたはGRAPHキーワードが続く場合以外は、セパレータとしてピリオドが必要です。この構文では、次の操作を任意に組み合せて実行できます。

- OPTIONAL構成要素を使用して、部分一致の場合にも結果を取得できます。

- FILTER構成要素を使用して、ソリューションを問合せに制限するグラフ・パターンのフィルタ式を指定できます。

- UNION構成要素を使用して、複数の代替グラフ・パターンのいずれかを一致させることができます。

- GRAPH構成要素(1.6.2.1項を参照)を使用して、グラフ・パターンの一致範囲を名前付きグラフのセットに制限できます。

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

例1-12 中カッコの構文

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

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

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

OPTIONALグラフ・パターンに複数のトリプル・パターンが存在する場合、OPTIONALグラフ・パターンの各トリプル・パターンに一致が検出された場合にのみ、オプション変数の値が戻されます。例1-14では、各祖父とその孫の両方が参加する試合の名前(祖父と孫が一緒に参加している試合がない場合はNULL)が戻されるように、例1-13を変更しています。また、各BGP内でトリプル・パターンを順番に評価し、ルートBGPとOPTIONAL BGPを結合するためにハッシュ結合を使用するように指定するグローバル問合せオプティマイザ・ヒントも使用しています。

例1-14 中カッコの構文および複数パターンのOPTIONAL構成要素

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

単一の問合せには、ネストするかパラレルに設定できる複数のOPTIONALグラフ・パターンを含めることができます。例1-15では、ネストしたOPTIONALグラフ・パターンを使用して例1-14を変更しています。この例では、各祖父について、(1)祖父の参加する試合(いずれの試合にも参加しない場合はNULL)、および(2)祖父が試合に参加する場合は同じ試合に参加している孫の年齢(孫と一緒に参加している試合がない場合はNULL)が戻されます。例1-15では、ネストしたOPTIONALグラフ・パターンの?y :plays ?game . ?y :age ?ageに一致していなくても、?gameに値が戻されることに注意してください。

例1-15 中カッコの構文およびネストしたOPTIONAL構成要素

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-14を変更しています。この例では、各祖父について、(1)祖父の参加する試合(いずれの試合にも参加しない場合はNULL)、および(2)祖父の電子メール・アドレス(電子メール・アドレスがない場合はNULL)が戻されます。ネストしたOPTIONALグラフ・パターンとは異なり、パラレルのOPTIONALグラフ・パターンはそれぞれ個別に処理されます。つまり、電子メール・アドレスが見つかると、それは試合が見つかったかどうかにかかわらず戻され、試合が見つかると、それは電子メール・アドレスが見つかったかどうかにかかわらず戻されます。

例1-16 中カッコの構文およびパラレルの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では、NYまたはCAに居住している祖父のみの孫の情報が戻されるように、FILTER構成要素を使用して例1-12を変更しています。

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

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

FILTER句では、算術演算子(+、-、*、/)、ブール演算子、論理結合子(||、&&、!)および比較演算子(<、>、<=、>=、=、!=)に加え、複数の組込みファンクションを使用できます。表1-12に、FILTER句で使用できる組込み関数を示します。表1-12の「説明」列で、x、yおよびzは、適切な型の引数です。

表1-12 FILTER句で使用できる組込みファンクション

ファンクション

説明

BOUND(variable)

BOUND(x)は、xが結果でバインドされている(NULLではない)場合はtrueを戻し、それ以外の場合はfalseを戻します。

DATATYPE(literal)

DATATYPE(x)は、xのデータ型を表すURIを戻します。

isBLANK(RDF term)

isBLANK(x)は、xが空白ノードの場合はtrueを戻し、それ以外の場合はfalseを戻します。

isIRI(RDF term)

isIRI(x)は、xがIRIの場合はtrueを戻し、それ以外の場合はfalseを戻します。

isLITERAL(RDF term)

isLiteral(x)は、xがリテラルの場合はtrueを戻し、それ以外の場合はfalseを戻します。

isURI(RDF term)

isURI(x)は、xがURIの場合はtrueを戻し、それ以外の場合はfalseを戻します。

LANG(literal)

LANG(x)は、xの言語タグをシリアライズするプレーン・リテラルを戻します。

langMATCHES(literal, literal)

langMATCHES(x, y)は、言語タグxが言語範囲yに一致する場合はtrueを戻し、それ以外の場合はfalseを戻します。

REGEX(string, pattern)

REGEX(x,y)は、xが正規表現yに一致する場合はtrueを戻し、それ以外の場合はfalseを戻します。サポートされる正規表現の詳細は、『Oracle Database SQL言語リファレンス』の付録「Oracleの正規表現のサポート」を参照してください。

REGEX(string, pattern, flags)

REGEX(x,y,z)は、xがzに指定されたオプションを使用して正規表現yに一致する場合はtrueを戻し、それ以外の場合はfalseを戻します。使用可能なオプション: 's' - ドット任意文字モード('.'は改行文字を含むすべての文字に一致します)、'm' - 複数行モード('^'は任意の行の先頭に一致し、'$'は任意の行の末尾に一致します)、'i' - 大/小文字無視モード、'x' - 一致の前に正規表現から空白文字を削除します。

sameTERM(RDF term, RDF term)

sameTERM(x, y)は、xとyが同じRDF用語の場合はtrueを戻し、それ以外の場合はfalseを戻します。

STR(RDF term)

STR(x)は、xの文字列表現のプレーン・リテラル(二重引用符で囲まれたMDSYS.RDF_VALUE$のVALUE_NAME列に格納された内容)を戻します。

SEM_MATCHで使用できる組込み関数を理解するには、SPARQL問合せ言語仕様(http://www.w3.org/TR/rdf-sparql-query/)に定義されている組込みファンクションの説明も参照してください。

例1-18では、REGEX組込みファンクションを使用して、Oracle電子メール・アドレスを持つすべての祖父を選択しています。正規表現パターンのバックスラッシュ文字(\)は、問合せ文字列でエスケープする必要があります(たとえば、\\.とすることで\.というパターンが生成されます)。

例1-18 中カッコの構文とREGEXおよびSTR組込みファンクションを使用したFILTER構成要素

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では、祖父がNYまたはCAに居住しているか、NYまたはCAに不動産を所有している場合にのみ、あるいは両方の条件がtrueの場合(祖父がNYまたはCAに居住し、かつ不動産を所有している場合)に祖父が戻されるように、UNION構成要素を使用して例1-17を変更しています。

例1-19 中カッコの構文とUNIONおよびFILTER構成要素

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

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

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

- HINT0={<hint-string>}を使用してoptions引数に指定するヒント(1.6項を参照)は、ルートBGP内のグラフ・パターン部分に基づいてのみ構成する必要があります。たとえば、例1-13の問合せのヒント指定で使用できる有効な別名は、t0、t1、?xおよび?yのみです。インライン問合せオプティマイザ・ヒントを使用すると、グラフ・パターンの他の部分に影響を与えることができます(1.6.4項を参照)。

- FILTER構成要素は、ロング・リテラルにバインドされた変数ではサポートされません。

1.6.2.1 GRAPHキーワードのサポート

SEM_MATCH問合せは、RDFデータセットに対して実行されます。RDFデータセットは、デフォルト・グラフと呼ばれる1つの名前なしグラフと、URIによって識別される1つ以上の名前付きグラフを含む複数のグラフのコレクションです。GRAPH句内に出現するグラフ・パターンは、名前付きグラフのセットに対して照合され、GRAPH句内に出現しないグラフ・パターンは、デフォルト・グラフに対して照合されます。graphsおよびnamed_graphs SEM_MATCHパラメータを使用して、特定のSEM_MATCH問合せのデフォルト・グラフと名前付きグラフのセットを構成できます。表1-13に、使用可能なデータセット構成のサマリーを示します。

表1-13 SEM_MATCHのgraphsとnamed_graphsの値、および結果のデータセット構成

パラメータ値

デフォルト・グラフ

名前付きグラフのセット

graphs: NULL

named_graphs: NULL

すべての名前なしトリプルとすべての名前付きグラフ・トリプルのUNION ALL。(ただし、optionsパラメータにSTRICT_DEFAULT=Tが含まれる場合、デフォルト・グラフには名前なしトリプルのみが含まれます。)

すべての名前付きグラフ

graphs: NULL

named_graphs: {g1,…, gn}

空のセット

{g1,…, gn}

graphs: {g1,…, gm}

named_graphs: NULL

{g1,…, gm}のUNION ALL

空のセット

graphs: {g1,…, gm}

named_graphs: {gn,…, gz}

{g1,…, gm}のUNION ALL

{gn,…, gz}

例1-20では、GRAPH構成要素を使用して、グラフ・パターンの一致範囲を特定の名前付きグラフに制限しています。この例では、<http://www.example.org/family/Smith>という名前付きグラフのすべての人物の名前と電子メール・アドレスが検出されます。

例1-20 名前付きグラフの構成要素

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

GRAPHキーワードの後には、URI以外に変数を配置できます。例1-21では、GRAPHとともに変数?gを使用し、named_graphsパラメータを使用して?gの使用可能な値を<http://www.example.org/family/Smith>および<http://www.example.org/family/Jones>という名前付きグラフに制限しています。SEM_ALIASES引数に指定されている別名は、graphsおよびnamed_graphsパラメータで使用できます。

例1-21 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では、デフォルト・グラフを使用して、<http://www.example.org/family/Smith>と<http://www.example.org/family/Jones>の名前付きグラフのUNIONを問い合せています。

例1-22 graphsパラメータの使用

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

RDFデータセットとGRAPH構成要素の詳細は、W3C SPARQL仕様(http://www.w3.org/TR/rdf-sparql-query/#rdfDataset)も参照してください。

1.6.3 グラフ・パターン: SPARQL SELECT構文のサポート

中カッコのグラフ・パターンに加え、SEM_MATCHでは、完全に指定されたSPARQL SELECT問合せをqueryパラメータで使用できます。SPARQL SELECT構文オプションを使用する場合、SEM_MATCHでは、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問合せの結果を並べ替えることができます。

例1-23では、次のSPARQL構成要素を使用しています。

- SPARQL PREFIX句: http://www.example.org/family/およびhttp://xmlns.com/foaf/0.1/名前空間の略語を指定します。

- SPARQL SELECT句: 問合せから抽出する変数のセットを指定します。

- SPARQL WHERE句: 問合せグラフ・パターンを指定します。

例1-23 SPARQL PREFIX、SELECTおよび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-23では、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の各列が戻されます。

SPARQL SELECT句では、(A)一連の変数または式(あるいはその両方)、または(B) * (指定されたトリプル・パターンに出現するすべての変数を抽出)のいずれかを指定します。例1-24では、SPARQL SELECT句を使用して、指定されたトリプル・パターンに出現するすべての変数を選択しています。

例1-24 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));

DISTINCTキーワードをSELECTの後に使用すると、重複する結果行を削除できます。例1-25では、SELECT DISTINCTを使用して個別の名前のみを選択しています。

例1-25 SPARQL 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));

SPARQL FROMおよびFROM NAMEDは、問合せにRDFデータセットを指定するために使用します。FROM句を使用してデフォルト・グラフを構成するグラフのセットを指定し、FROM NAMED句を使用して名前付きグラフのセットを構成するグラフのセットを指定します。例1-26では、FROMおよびFROM NAMEDを使用して、<http://www.friends.com/friends>グラフと<http://www.contacts.com/contacts>グラフのUNIONから電子メール・アドレスおよび関係の友人を選択し、<http://www.example.org/family/Smith>グラフと<http://www.example.org/family/Jones>グラフから祖父母の情報を選択しています。

例1-26 FROMおよびFROM NAMEDを使用したRDFデータセットの指定

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

SPARQL ORDER BY句を使用すると、SEM_MATCH問合せの結果を並べ替えることができます。この句によって、指定された問合せの結果を並べ替えるために使用する一連のコンパレータを指定します。コンパレータは、変数、RDF用語、算術演算子(+、-、*、/)、ブール演算子、論理結合子(||、&&、!)、比較演算子(<、>、<=、>=、=、!=)、およびFILTER式で使用できる任意の関数で構成されます。

SPARQL ORDER BY句の場合:

- 単一の変数の順序付け条件には前後のカッコは不要ですが、より複雑な順序付け条件にはカッコが必要です。

- オプションのASC()またはDESC()順序修飾子を使用して、それぞれ昇順または降順となる目的の順序を指定できます。デフォルトの順序は昇順です。

- SEM_MATCHでSPARQL ORDER BYを使用する場合、取り囲んでいるSQLブロック全体を通じて目的の順序を維持するためには、格納側のSQL問合せをSEM$ROWNUMで並べ替える必要があります。

例1-27では、SPARQL ORDER BY句を使用してすべてのカメラを選択し、降順のタイプと昇順の総額(price * (1 - discount) * (1 + tax))によって順序を指定しています。

例1-27 SPARQL ORDER BY

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;

SPARQL LIMITおよびSPARQL OFFSETを使用すると、問合せソリューションの異なるサブセットを選択できます。例1-28では、SPARQL LIMITを使用して最も安い5つのカメラを選択し、例1-29では、SPARQL LIMITおよびOFFSETを使用して5番目から10番目の最も安いカメラを選択しています。

例1-28 SPARQL LIMIT

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-29 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;

SPARQL PREFIX、SELECT、SELECT DISTINCT、FROM、FROM NAMED、WHERE、ORDER BY、LIMITおよびOFFSET構成要素の詳細は、W3C SPARQL仕様(http://www.w3.org/TR/rdf-sparql-query/)も参照してください。

1.6.4 インライン問合せオプティマイザ・ヒント

SEM_MATCHでは、HINT0インライン問合せオプティマイザ・ヒントを使用できるようにSPARQLコメント構成要素がオーバーロードされています。SPARQLでは、ハッシュ文字(#)は行の残り部分がコメントであることを示します。インライン・ヒントを特定のBGPに関連付けるには、SPARQLコメント内にHINT0ヒント文字列を配置し、開始中カッコ({)とBGPの最初のトリプル・パターンの間にコメントを挿入します。インライン・ヒントによって、問合せ内の各BGPの実行計画に影響を与えることができます。例1-30に、インライン問合せオプティマイザ・ヒントを使用した問合せを示します。

例1-30 インライン問合せオプティマイザ・ヒント

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-30では、BGP_JOIN(USE_HASH)ヒントを使用して、OPTIONAL BGPとその親BGPを結合する際にハッシュ結合を使用するように指定しています。

インライン・オプティマイザ・ヒントによって、options引数を使用してSEM_MATCHに渡されるヒントはすべてオーバーライドされます。たとえば、グローバルALL_ORDEREDヒントは、インライン・オプティマイザ・ヒントの指定がない各BGPに適用されますが、インライン・ヒントのあるBGPは、ALL_ORDEREDヒントのかわりにインライン・ヒントを使用します。

1.6.5 全文検索

Oracle固有のorardf:textContains SPARQL FILTER関数では、MDSYS.RDF_VALUE$表に対して全文索引を使用します。この関数の構文は次のとおりです(orardfは<http://xmlns.oracle.com/rdf/>に展開される組込み接頭辞です)。

orardf:textContains(variable, pattern)

orardf:textContainsの第1引数はローカル変数(orardf:textContainsフィルタを含むBGPに存在する変数)に、第2引数は定数のプレーン・リテラルにする必要があります。

たとえば、xが式yに一致する場合(yはOracle TextのSQL演算子CONTAINSに対して有効な式)、orardf:textContains(x, y)はtrueを戻します。この式の詳細は、『Oracle Textリファレンス』を参照してください。

orardf:textContainsを使用する前に、RDFネットワークのOracle Text索引を作成する必要があります。この索引を作成するには、次のようにSEM_APIS.ADD_DATATYPE_INDEXプロシージャを起動します。

EXECUTE SEM_APIS.ADD_DATATYPE_INDEX('http://xmlns.oracle.com/rdf/text');

テキスト索引のあるセマンティク・ネットワークに対して大規模バルク・ロードを実行する場合、テキスト索引を削除してバルク・ロードを実行してからテキスト索引を再作成すると、ロード時間全体が短縮される可能性があります。データ型の索引付けの詳細は、1.9項を参照してください。

テキスト索引を作成すると、SEM_MATCH問合せでorardf:textContains FILTER関数を使用できます。例1-31では、orardf:textContainsを使用して、文字AまたはBで始まる名前を持つすべての祖父を検出しています。

例1-31 全文検索

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

1.6.6 空間のサポート

注意:
Oracle Databaseセマンティク・テクノロジで空間のサポートを使用する前に、Oracle Spatial Patch 11828358: ORA-7445 ON SELECT WITH SDO_RELATE IN WHERE CLAUSEが適用されていることを確認してください。

Oracle Databaseセマンティク・テクノロジでは、orageo:WKTLiteral型付きリテラルとしてエンコードされた空間ジオメトリ・データの格納がサポートされ、空間操作用の問合せ機能のセットが提供されます。(orageoは、<http://xmlns.oracle.com/rdf/geo/>に展開される組込み接頭辞です。)

この項の内容は次のとおりです。

- RDFでの空間データの表現

- 空間データの索引付け

- 空間データの問合せ

1.6.6.1 RDFでの空間データの表現

空間ジオメトリは、RDFでorageo:WKTLiteral型付きリテラルとして表現できます。例1-32に、単純な点ジオメトリのorageo:WKTLiteralエンコーディングを示します。

例1-32 orageo:WKTLiteralとして表現された点の空間ジオメトリ

"Point(-83.4 34.3)"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral>

orageo:WKTLiteralエンコーディングは、オプションの空間参照システムURIと、その後に続く、ジオメトリ値をエンコードするWell-Known Text (WKT)文字列で構成されます。空間参照システムURIとWKT文字列は、空白文字で区切る必要があります。

空間参照システムURIの形式は、<http://xmlns.oracle.com/rdf/geo/srid/{srid}>です({srid}は、Oracle Spatialの有効な空間参照システムIDです)。orageo:WKTLiteralの値に空間参照システムURIが含まれない場合、デフォルトの空間参照システムのWGS84経度/緯度(URI <http://xmlns.oracle.com/rdf/geo/srid/8307>)が使用されます。orageo:WKTLiteralの値が問合せ文字列に出現する場合も、同じデフォルトの空間参照システムが使用されます。

複数のジオメトリ・タイプ(点、連結線、ポリゴン、多面体面、三角形、TIN、複数点、複数連結線、複数ポリゴン、ジオメトリ・コレクションなど)をorageo:WKTLiteralの値として表現できます。2次元ジオメトリでは、1ジオメトリ当たり最大500,000の頂点がサポートされます。

例1-33に、orageo:WKTLiteralの値を使用してエンコードされたRDF空間データ(N-Triple形式)を示します。この例の場合、lot1の最初の2つのジオメトリではデフォルトの座標系(SRID 8307)を使用していますが、lot2の他の2つのジオメトリではSRID 8265を指定しています。

例1-33 orageo:WKTLiteralの値を使用してエンコードされた空間データ

# 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開発者ガイド』の座標系(空間参照システム)に関する章を参照してください。Open Geospatial Consortium (OGC)のSimple Featuresドキュメント(http://portal.opengeospatial.org/files/?artifact_id=25355)のWKTジオメトリ表現に関する資料も参照してください。

1.6.6.2 空間データの索引付け

任意のSPARQL拡張関数(1.6.6.3項を参照)を使用して空間データを問い合せる前に、SEM_APIS.ADD_DATATYPE_INDEXプロシージャをコールしてRDFネットワークに空間索引を作成する必要があります。

空間索引を作成する場合、次の情報を指定する必要があります。

- SRID: 空間索引を作成する空間参照システムのID。Oracle Spatialの有効な空間参照システムIDをSRID値として使用できます。

- TOLERANCE: 空間索引の許容値。許容値は、2つの点が同じ点とみなされるためにどの程度近接している必要があるかを示す正数です。この値の単位は、使用されるSRIDのデフォルト単位によって決定されます(たとえば、WGS84経度/緯度の場合はメートル)。許容値の詳細は、『Oracle Spatial開発者ガイド』を参照してください。

- DIMENSIONS: 空間索引のテキスト文字列エンコーディングの次元情報。各次元は、カンマ区切りの一連の3つの値(名前、最小値および最大値)で表現されます。各次元をカッコで囲み、それらの次元のセットを外側のカッコで囲みます。

例1-34では、WGS84経度/緯度の空間参照システム、10mの許容値、およびこの座標系を使用する空間データの索引付けに推奨される次元を指定して、RDFネットワークに空間データ型索引を追加しています。TOLERANCE、SRIDおよびDIMENSIONSキーワードは大/小文字が区別されるため注意してください。

例1-34 RDFデータへの空間データ型索引の追加

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ネットワークに格納されたorageo:WKTLiteralの値は、索引で使用される空間参照システムに自動的に正規化されるため、単一の空間索引で異なる空間参照システムのorageo:WKTLiteralの値を同時にサポートできます。この座標変換は、索引付けと空間の計算に対して透過的に行われます。orageo:WKTLiteralの値がSEM_MATCH問合せから戻される場合、変換されていない元のジオメトリが戻されます。

空間索引の詳細は、『Oracle Spatial開発者ガイド』の空間データの索引付けと問合せに関する章を参照してください。

1.6.6.3 空間データの問合せ

SEM_MATCHで空間問合せを実行するために、複数のSPARQL拡張関数を使用できます。たとえば、空間RDFデータでは、ジオメトリの領域と境界線(長さ)、2つのジオメトリ間の距離、およびジオメトリの重心と最小外接矩形を検出することや、ジオメトリ間の様々な位相関係を確認することができます。

付録Bに、次の関数のリファレンスと使用方法の情報があります。

- orageo:area

- orageo:buffer

- orageo:centroid

- orageo:convexHull

- orageo:difference

- orageo:distance

- orageo:intersection

- orageo:length

- orageo:mbr

- orageo:nearestNeighbor

- orageo:relate

- orageo:union

- orageo:withinDistance

- orageo:xor

1.6.7 問合せパフォーマンスのベスト・プラクティス

この項では、SEM_MATCHテーブル・ファンクションを使用してセマンティク・データを問い合せる場合に推奨されるプラクティスについて説明します。この項の内容は次のとおりです。

- 1.6.7.1項「xsd:dateTime、xsd:dateおよびxsd:timeを含むFILTER構成要素」

- 1.6.7.2項「型付きリテラルを含むFILTER構成要素のファンクション索引」

- 1.6.7.3項「関係式を含むFILTER構成要素」

- 1.6.7.4項「オプティマイザ統計と動的サンプリング」

- 1.6.7.5項「マルチパーティション問合せ」

1.6.7.1 xsd:dateTime、xsd:dateおよびxsd:timeを含むFILTER構成要素

デフォルトでは、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)に含まれるものと仮定されます。

ただし、(1)データセットのすべてのカレンダ値にタイムゾーンがある場合、または(2)データセットのすべてのカレンダ値にタイムゾーンがない場合、FAST_DATE_FILTER=Tを使用することで問合せの正確さが影響を受けることはありません。

1.6.7.2 型付きリテラルを含むFILTER構成要素のファンクション・ベース索引

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)の評価が高速化する可能性があります。

これらのファンクション・ベース索引の作成、変更および削除のために、便利なインタフェースが用意されています。詳細は、1.9項「データ型索引の使用」を参照してください。

ただし、MDSYS.RDF_VALUE$表にこれらのファンクション・ベース索引が存在することで、バルク・ロード操作の速度は大幅に低下する可能性があります。多くの場合、索引付きのままバルク・ロードを実行する場合と比較すると、索引を削除し、バルク・ロードを実行してから索引を再作成する方が高速です。

1.6.7.3 関係式を含むFILTER構成要素

関係式を含むFILTER構成要素には次の推奨事項が適用されます。

- FILTER句で2つの変数を比較する場合、=または!=を使用するよりsameTerm組込み関数を使用する方が効率的なため、たとえば、できるかぎり(?a = ?b)のかわりにsameTerm(?a, ?b)を、(?a != ?b)のかわりに(!sameTerm(?a, ?b))を使用してください。

- FILTER式で値を比較する場合、否定の使用を少なくすることでパフォーマンスを向上できる可能性があります。たとえば、式(!(?x > "10"^^xsd:int))を評価するより、(?x <= "10"^^xsd:int)を評価する方が効率的です。

1.6.7.4 オプティマイザ統計と動的サンプリング

問合せオプティマイザに十分な統計を確保することは、優れた問合せパフォーマンスのために非常に重要です。通常、SEM_PERF.GATHER_STATSプロシージャ(第11章を参照)を使用してセマンティク・ネットワークの基本統計を収集済であることを確認する必要があります。

RDFデータ・モデル固有の柔軟性のため、静的情報によってはSEM_MATCH問合せに最適な実行計画が生成されない可能性があります。通常、動的サンプリングの方が、より適切な問合せ実行計画を生成できます。動的サンプリングのレベルは、optimizer_dynamic_samplingパラメータを使用してセッション・レベルまたはシステム・レベルで設定するか、dynamic_sampling(level) SQL問合せヒントを使用して個々の問合せレベルで設定できます。一般的に、3から6までの動的サンプリング・レベルを試してみることをお薦めします。動的サンプリングで統計を評価する方法の詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

例1-35では、動的サンプリング・レベルが6のSQLヒントを使用しています。

例1-35 動的サンプリングの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, '' ));

1.6.7.5 複数パーティションの問合せ

複数のセマンティク・モデル、セマンティク・モデルと伴意、および仮想モデルの使用には、次の推奨事項が適用されます。

- 複数のセマンティク・モデルに対して、またはセマンティク・モデルと伴意に対してSEM_MATCH問合せを実行する場合、問合せ対象のすべてのモデルおよび伴意を含む仮想モデル(1.3.8項を参照)を作成してからその単一の仮想モデルを問い合せると、通常は問合せパフォーマンスが向上します。

- ALLOW_DUP=T問合せオプションを使用してください。このオプションを使用しない場合、RDFデータの設定済セマンティクを保持するため、問合せの処理中に(処理に関して)コストのかかる複製と削除の手順が必要になります。一方、このオプションを使用すると、複製と削除の手順は実行されず、パフォーマンスが大幅に向上します。

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

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

- RDFトリプル(およびオプションで名前付きグラフ)の3つの構成要素(主語、述語、目的語)を含む行を持つステージング表からセマンティク・データ・ストアにデータをバルク・ロードまたは追加します。詳細は、1.7.1項を参照してください。
このオプションは、大量のデータをロードする場合の最も高速な方法ですが、4000バイトを超える目的語の値を含むトリプルは処理できません。

- バッチ・ロード: Javaクライアント・インタフェースを使用してN-Triple形式のファイルのデータをセマンティク・データ・ストアにロードまたは追加します(1.7.2項を参照)。
このオプションは、バルク・ロードより低速ですが、4000バイトを超える目的語の値を含むトリプルも処理できます。ただし、このオプションでは名前付きグラフは処理されません。

- SDO_RDF_TRIPLE_SコンストラクタをコールするSQL INSERT文を使用してアプリケーション表にロードし、対応するRDFトリプル(状況によりグラフ名も含む)のセマンティク・データ・ストアに挿入します(1.7.3項を参照)。
このオプションは、小規模なデータをロードする場合に便利です。ただし、このオプションでは名前付きグラフは処理されません。

セマンティク・データをエクスポートするには、1.7.4項「セマンティク・データのエクスポート」を参照してください。

RDF_VALUE$表に存在するが、現在セマンティク・ネットワークに含まれるどのRDFトリプルまたはルールでも使用されなくなった値をパージするには、1.7.5項「未使用値のパージ」を参照してください。

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

ステージング表を使用して、セマンティク・データ(およびオプションでセマンティク・データ以外の関連データ)をバルク・ロードできます。SEM_APIS.LOAD_INTO_STAGING_TABLEプロシージャ(第9章を参照)をコールしてデータをロードします(ロード操作中に構文の正確性をチェックできます)。次に、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権限を持っている必要があります。

次の項も参照してください。

- 1.7.1.1項「ステージング表のロード」

- 1.7.1.2項「バルク・ロード中のイベント・トレースの記録」

1.7.1.1 ステージング表のロード

セマンティク・ストアへのロードの準備として、複数の方法でセマンティク・データをステージング表にロードできます。一般的な方法は次のとおりです。

- Oracle SQL*Loaderを使用したステージング表のロード(1.7.1.1.1項を参照)

- 外部表を使用したステージング表のロード(1.7.1.1.2項を参照)

1.7.1.1.1 SQL*Loaderを使用したステージング表へのN-Triple形式のデータのロード

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文を使用してアプリケーション表に挿入することでロードできます(1.7.3項を参照)。

1.7.1.1.2 外部表を使用したステージング表へのN-Quad形式のデータのロード

次の方法によって、Oracle外部表を使用してステージング表にN-Quad形式のデータ(4つの構成要素を持つ拡張トリプル)をロードできます。

1. SEM_APIS.CREATE_SOURCE_EXTERNAL_TABLEプロシージャをコールして外部表を作成し、SQL STATEMENT ALTER TABLEを使用して、関連する1つ以上の入力ファイル名を含めるように外部表を変更します。1つ以上の入力ファイルを含むフォルダに関連付けられたディレクトリ・オブジェクトに対するREAD権限とWRITE権限を持っている必要があります。

2. 外部表を作成したら、MDSYSユーザーに、表に対するSELECT権限とINSERT権限を付与します。

3. SEM_APIS.LOAD_INTO_STAGING_TABLEプロシージャをコールしてステージング表に移入します。

4. ロードが終了したら、COMMIT文を発行してトランザクションを完了します。

オブジェクトとグラフURI (結合)の長さが4000バイトを超える行は、拒否されて不良ファイルに格納されます。ただし、これらの拒否された行は、SQL INSERT文を使用してアプリケーション表に挿入することでロードできます(1.7.3項を参照)。

例1-36に、外部表を使用したステージング表へのロードを示します。

例1-36 外部表を使用したステージング表へのロード

-- 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;
/

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

起動側のスキーマに表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;

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

注意:
この項で説明されているJavaクラスのoracle.spatial.rdf.client.BatchLoaderは非推奨になったため、N-Quadデータのロードはサポートされません。
かわりに、Jena Adapterのバルク・ロード機能を使用することをお薦めします(7.11項「Jena Adapterを使用したバルク・ロード」を参照)。

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付き)がインストールされており、パーティショニング機能が有効であること。

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

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

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

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

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

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

関連項目:
7.11項「Jena Adapterを使用したバルク・ロード」

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

INSERT文を使用してセマンティク・データをロードする場合、URIは< >(山カッコ)で、空白ノードは_:(アンダースコアとコロン)で、リテラルは" "(引用符)で囲む必要があります。URIまたは空白ノードに空白文字を使用することはできません。データを挿入するには、SDO_RDF_TRIPLE_Sコンストラクタを使用します(1.5.1項を参照)。アプリケーション表に対する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/index.html)をダウンロードし、そのインストール指示に従います。編集したバージョンのrss2insert.xslファイルを使用してセマンティク・データXMLファイルをINSERT文に変換するには、次の形式のコマンドを使用します。

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

1.7.3.1 INSERT文を使用した名前付きグラフへのデータのロード

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

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

この項には、セマンティク・データのエクスポート(Oracle Databaseからのセマンティク・データの取得)に関連する次の内容が含まれます。

- アプリケーション表からのセマンティク・データの取得

- RDFモデルからのセマンティク・データの取得

- 取得した空白ノード識別子からのモデルおよびグラフ情報の削除

1.7.4.1 アプリケーション表からのセマンティク・データの取得

アプリケーション表からセマンティク・データを取得するには、例1-37のようにSDO_RDF_TRIPLE_Sのメンバー関数を使用します。

例1-37 アプリケーション表からのセマンティク・データの取得

--
-- 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.7.4.2 RDFモデルからのセマンティク・データの取得

RDFモデルからセマンティク・データを取得するには、例1-38のようにSEM_MATCHテーブル・ファンクションを使用します(1.6項を参照)。

例1-38 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.7.4.3 取得した空白ノード識別子からのモデルおよびグラフ情報の削除

セマンティク・データの取得中に取得した空白ノード識別子は、例1-39のコード部分(それぞれ、VARCHAR2(主語の構成要素など)およびCLOB(目的語の構成要素など)に適用可能)に示した変換を使用して、モデルおよびグラフ情報が出現しないように切り捨てることができます。

例1-39 アプリケーション表からのセマンティク・データの取得

--
-- 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-40に、1.7.4.2項に説明されているセマンティク・データ取得問合せを使用して、それぞれsub列とobj列に対して例1-39の2つの変換を使用した後に取得された結果を示します。

例1-40 例1-39の変換の適用による結果

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

1.7.5 未使用値のパージ

時間の経過に伴うトリプルの削除によって、RDF_VALUE$表の値のサブセットは、現在セマンティク・ネットワークに含まれるどのRDFトリプルまたはルールでも使用されなくなる可能性があります。このような使用されていない値の数が多くなり、RDF_VALUE$表の大部分を占めるようになった場合、SEM_APIS.PURGE_UNUSED_VALUESサブプログラムを使用して未使用値をパージできます。

パージする前に、MDSYSに、すべてのRDFモデルのアプリケーション表に対するSELECT権限を付与する必要があります。これを行うには、GRANTコマンドを直接使用するか、SEM_APIS.PRIVILEGE_ON_APP_TABLESサブプログラムを使用します。

パージ操作中に実行されたタスクのイベント・トレースは、RDF$ET_TAB表が起動側のスキーマに存在する場合、そこに記録できます(1.7.1.2項「バルク・ロード中のイベント・トレースの記録」を参照)。

例1-41では、RDF_VALUE$表から未使用値をパージしています。この例では、名前付きグラフまたはCLOBは考慮されていません。また、1.11.1項「例: 雑誌記事の情報」の例のデータがロードされていると仮定します。

例1-41 未使用値のパージ

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

1.8 セマンティク・ネットワーク索引の使用

セマンティク・ネットワーク索引は、一意でないBツリー索引です(セマンティク・ネットワーク索引を追加、変更および削除して、セマンティク・ネットワーク内のモデルや伴意とともに使用できます)。このような索引を使用すると、ネットワーク内のモデルや伴意に対するSEM_MATCH問合せのパフォーマンスを調整できます。任意の索引と同様に、セマンティク・ネットワーク索引によって、問合せワークロードに適合する索引ベースのアクセスが可能になります。これによって、次の例のシナリオのようにパフォーマンスが大幅に向上する可能性があります。

- グラフ・パターンが'{<John> ?p <Mary>}'の場合、問合せで使用されていれば、1つ以上のターゲット・モデルおよび対応する伴意に対して適切な'CSP'または'SCP'索引を使用できます。

- グラフ・パターンが'{?x <talksTo> ?y . ?z ?p ?y}'の場合、先行キーのCを付けて('C'または'CPS'など)、関連する1つ以上のモデルおよび伴意に対して適切なセマンティク・ネットワーク索引を使用できます。

ただし、セマンティク・ネットワーク索引を使用すると、DML、ロードおよび推論操作に必要な時間が増加して、パフォーマンス全体が影響を受ける可能性があります。

セマンティク・ネットワーク索引は、次のサブプログラムを使用して作成および管理できます。

- SEM_APIS.ADD_SEM_INDEX

- SEM_APIS.ALTER_SEM_INDEX_ON_MODEL

- SEM_APIS.ALTER_SEM_INDEX_ON_ENTAILMENT

- SEM_APIS.DROP_SEM_INDEX

これらのサブプログラムはすべて、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'を指定します。このように、様々なセマンティク・ネットワーク索引を使用可能および使用不能にして実験を重ねることにより、パフォーマンスの違いを確認できます。たとえば、次の文は、FAMILYモデルに対してPSCGM索引を使用可能にします。

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

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

- 自分で作成したセマンティク・ネットワーク索引とは無関係に、セマンティク・ネットワークが作成されると自動的に作成される索引の1つに、この項に示したサブプログラムをコールするときにindex_codeを'PSCGM'と指定することで管理できる索引があります。

- 新規のモデルまたは新規の伴意を作成すると、セマンティク・ネットワーク索引ごとに一意でない新規のBツリー索引が作成されますが、このようなBツリー索引はいずれも、USABLEステータスになります。

- (index_code値に'M'を含めることにより)セマンティク・ネットワーク索引キーにMODEL_ID列を含めると、問合せのパフォーマンスが向上することがあります。特に、仮想モデルを使用する場合はこの操作が有効です。

1.8.1 MDSYS.SEM_NETWORK_INDEX_INFOビュー

モデルと伴意のすべてのネットワーク索引に関する情報は、MDSYS.SEM_NETWORK_INDEX_INFOビューに保持されます(表1-14に、このビューの列(部分リスト)を示します(1つの行が1つのネットワーク索引に対応します))。

表1-14 MDSYS.SEM_NETWORK_INDEX_INFOビューの列(部分リスト)

列名

データ型

説明

NAME

VARCHAR2(30)

RDFモデルまたは伴意の名前

TYPE

VARCHAR2(10)

索引が作成されるオブジェクトのタイプ(MODEL、ENTAILMENTまたはNETWORK)

ID

NUMBER

モデルまたは伴意のID番号、またはネットワークに対する索引の場合は0 (ゼロ)

INDEX_CODE

VARCHAR2(25)

索引のコード(PSCGMなど)。

INDEX_NAME

VARCHAR2(30)

索引の名前(RDF_LNK_PSCGM_IDXなど)

LAST_REFRESH

TIMESTAMP(6) WITH TIME ZONE

このコンテンツがリフレッシュされた最終時刻のタイムスタンプ

表1-14に示されている列に加え、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プロシージャを使用します。

1.9 データ型索引の使用

データ型索引は、セマンティク・ネットワークに格納された型付きリテラルの値に対する索引です。これらの索引によって、特定のタイプのFILTER式を含むSEM_MATCH問合せのパフォーマンスが大幅に向上する可能性があります。たとえば、xsd:dateTimeリテラルに対するデータ型索引によって、フィルタ(?x < "1929-11-16T13:45:00Z"^^xsd:dateTime)の評価が高速化する可能性があります。表1-15に示されている複数のデータ型に対して索引を作成できます。

表1-15 データ型索引のデータ型

データ型URI

Oracle型

索引タイプ

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

NUMBER

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

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

VARCHAR2

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

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

TIMESTAMP WITH TIMEZONE

一意でないBツリー

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

TIMESTAMP WITH TIMEZONE

一意でないBツリー

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

TIMESTAMP WITH TIMEZONE

一意でないBツリー

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

(該当なし)

CTXSYS.CONTEXT

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

SDO_GEOMETRY

MDSYS.SPATIAL_INDEX

データ型索引の適合性は、問合せワークロードに応じて変化します。xsdデータ型に対するデータ型索引は、変数と定数値を比較するフィルタに使用でき、非常に選択的なフィルタ条件を持つ非選択的グラフ・パターンが問合せに含まれる場合に特に便利です。空間フィルタまたはテキスト・フィルタを持つ問合せには、適切なデータ型索引が必要です。

データ型索引によって問合せパフォーマンスは向上しますが、徐々に増加する索引のメンテナンスによって、セマンティク・ネットワークに対するDMLおよびバルク・ロード操作のパフォーマンスが低下する可能性があります。バルク・ロード操作では、通常、データ型索引を削除し、バルク・ロードを実行してからデータ型索引を再作成する方が高速です。

次のプロシージャを使用してデータ型索引を追加、変更および削除できます(第9章を参照)。

- SEM_APIS.ADD_DATATYPE_INDEX

- SEM_APIS.ALTER_DATATYPE_INDEX

- SEM_APIS.DROP_DATATYPE_INDEX

既存のデータ型索引に関する情報は、MDSYS.SEM_DTYPE_INDEX_INFOビューに保持されます(表1-16に、このビューの列を示します(1つの行が1つのデータ型索引に対応します))。

表1-16 MDSYS.SEM_DTYPE_INDEX_INFOビューの列

列名

データ型

説明

DATATYPE

VARCHAR2(51)

データ型URI

INDEX_NAME

VARCHAR2(30)

索引の名前

STATUS

VARCHAR2(8)

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

TABLESPACE_NAME

VARCHAR2(30)

索引の表領域

例1-42に示すとおり、誕生日が1929年11月16日より前のすべての祖父を見つける問合せの評価中にデータ型索引を使用するように、HINT0ヒントを使用できます。

例1-42 データ型索引を使用するための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' ));

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

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

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

CREATE TABLESPACE rdf_tblspace
DATAFILE '/oradata/orcl/rdf_tblspace.dat' SIZE 1024M REUSE
AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED
SEGMENT SPACE MANAGEMENT AUTO;

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

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

EXECUTE SEM_APIS.CREATE_SEM_NETWORK('rdf_tblspace');

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

4. セマンティク・データへの参照を格納する表を作成します。(この手順と残りの手順では、DBA権限を持つユーザーとして接続している必要はありません。)
この表には、単一のモデルに関連付けられたすべてのデータへの参照を保持するSDO_RDF_TRIPLE_S型の列が含まれる必要があります。

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

CREATE TABLE articles_rdf_data (id NUMBER, triple SDO_RDF_TRIPLE_S);

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

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

EXECUTE SEM_APIS.CREATE_SEM_MODEL('articles', 'articles_rdf_data', 'triple');

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

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

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

1.11 セマンティク・データの例(PL/SQLおよびJava)

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

- 1.11.1項「例: 雑誌記事の情報」

- 1.11.2項「例: 家系の情報」

このガイドの例に加え、http://www.oracle.com/technetwork/indexes/samplecode/semantic-sample-522114.htmlにあるサンプル・コードを参照してください。

1.11.1 例: 雑誌記事の情報

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

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

-- 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_RDF_MODEL).
-- 3. For each table to hold semantic data, insert data into the table.
-- 4. Use various subprograms and constructors.

-- Create the table to hold data for the model.
CREATE TABLE 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;

1.11.2 例: 家系の情報

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

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

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

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

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

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

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

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

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

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

旧名

新規名

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

1.13 セマンティク・テクノロジの詳細情報

Oracle Databaseセマンティク・テクノロジ・サポートと関連トピックの詳細は、次のリソースを参照してください。

- Semantic Technologies Center (OTN): ダウンロード用リンク、技術およびビジネス・ホワイト・ペーパー、ディスカッション・フォーラムおよび他の情報ソースが含まれます(http://www.oracle.com/technetwork/database/options/semantic-tech/)。

- 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/

2 OWLの概要

この章では、Web Ontology Language(OWL)のサブセットのサポートに関連する概念について説明します。この章の内容は、第1章の情報に基づいており、読者がオントロジ、プロパティ、関係などのOWLに関する主要な概念についてよく理解していることを前提とします。OWLの詳細は、http://www.w3.org/TR/owl-ref/にある「OWL Web Ontology Language Reference」を参照してください。

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

- 2.1項「オントロジ」

- 2.2項「OWL推論の使用方法」

- 2.3項「セマンティク演算子を使用したリレーショナル・データの問合せ」

2.1 オントロジ

オントロジは、特定の領域で共有される知識の概念化です。オントロジは、クラス、プロパティおよび(オプションの)インスタンスの集合で構成されます。クラスは、通常、クラス階層(サブクラスとスーパークラスの関係)によって関連付けられます。同様に、プロパティは、プロパティ階層(サブプロパティとスーパープロパティの関係)によって関連付けられます。プロパティは、対称的または推移的(あるいはその両方)です。プロパティには、それぞれ指定されたドメイン、レンジおよびカーディナリティの制約があります。

RDFSベースのオントロジでは、クラス階層、プロパティ階層、instanceOf関係、およびプロパティのドメインとレンジの指定のみが可能です。

OWLオントロジは、RDFSベースのオントロジを基盤としますが、追加でプロパティ特性を指定できます。OWLオントロジは、さらにOWL-Lite、OWL-DLおよびOWL Fullに分類されます。OWL-Liteでは、カーディナリティの最大値と最小値が0または1に制限されています。OWL-DLでは、この制限が緩和されており、最大値と最小値を指定できます。OWL Fullでは、OWL-DLやOWL-Liteオントロジとは異なり、インスタンスをクラスとしても定義できます。

セマンティク・データでサポートされる、またはサポートされないOWL機能の詳細は、2.1.2項を参照してください。

2.1.1 例: がんのオントロジ

図2-1に、がんのオントロジ(がんに関連するクラスとプロパティの記述)の一部を示します。この場合の要件は、DIAGNOSIS列を持つPATIENTSデータ表が存在することです(DIAGNOSIS列には、Diseases_and_Disorders(疾患と障害)クラス階層の値が含まれる必要があります)。

図2-1 がんのオントロジの例

図2-1のがんのオントロジでは、診断Immune_System_Disorder(免疫系障害)にAutoimmune_Disease(自己免疫疾患)およびImmunodeficiency_Syndrome(免疫不全症候群)という2つのサブクラスが含まれます。診断Autoimmune_Diseaseには、サブクラスRheumatoid_Arthritis(関節リウマチ)が含まれます。また、診断Immunodeficiency_Syndromeには、サブクラスT_Cell_Immunodeficiency(T細胞免疫不全)が含まれ、このサブクラスにはさらにサブクラスAIDSが含まれます。

PATIENTS表のデータには、表2-1に示すようなPATIENT_ID列およびDIAGNOSIS列の値が含まれます。

表2-1 PATIENTS表のデータの例

PATIENT_ID

DIAGNOSIS

1234

Rheumatoid_Arthritis

2345

Immunodeficiency_Syndrome

3456

AIDS

オントロジを問い合せるには、SEM_MATCHテーブル・ファンクション(1.6項を参照)を使用するか、SEM_RELATED演算子とその補助演算子(2.3項を参照)を使用します。

2.1.2 サポートされるOWLサブセット

この項では、サポートされるOWLボキャブラリのサブセットについて説明します。

Oracle Databaseでは、表現度の向上に従ってRDFS++、OWLSIFおよびOWLPrimeボキャブラリに加え、OWL 2 RLがサポートされます。サポートされる各ボキャブラリには、対応するルールベースがあります(ただし、これら3つのボキャブラリの基礎となる伴意ルールが内部的に実装されるため、ルールベースの内容を指定する必要はありません)。サポートされるボキャブラリは、次のとおりです。

- RDFS++: RDFSの最小限の拡張です。RDFSにowl:sameAsとowl:InverseFunctionalPropertyが追加されています。

- OWLSIF: IFセマンティクを含むOWLであり、『Completeness, decidability and complexity of entailment for RDF Schema and a semantic extension involving the OWL vocabulary』(H.J. Horst、Journal of Web Semantics 3、2(2005)、79-115)のpD*セマンティクで提案されたボキャブラリおよびセマンティクが含まれます。

- OWLPrime: 次のOWL機能が含まれます。

- 基本: クラス、サブクラス、プロパティ、サブプロパティ、ドメイン、レンジ、タイプ

- プロパティ特性: 推移的、対称的、関数的、逆関数的、逆関係

- クラス比較: 等価、排他

- プロパティ比較: 等価

- 個体比較: 同一、別個

- クラス式: 補集合

- プロパティ制約: hasValue、someValuesFrom、allValuesFrom
pD*と同様に、これらの値制約でサポートされるセマンティクは、常に内包的です(IFセマンティク)。

- OWL 2 RL: W3C勧告の「OWL 2 Web Ontology Language Profiles」のOWL 2 RLに関する項(http://www.w3.org/TR/owl-profiles/#OWL_2_RL)では、「OWL 2 RLプロファイルの対象は、表現力をそれほど犠牲にせずにスケーラブルな推論を必要とするアプリケーションです。これは、言語の完全な表現能力と引換えに効率性を獲得できるOWL 2アプリケーションと、OWL 2による追加の表現能力を必要とするRDF(S)アプリケーションの両方に対応するように設計されています」と説明されています。
システム定義のルールベースOWL2RLでは、OWL 2 RLに定義されたすべての標準のプロダクション・ルールがサポートされます。OWLPRIMEと同様に、このOWL2RLルールベースのルールをユーザーが参照することはできません。ルールベースOWL2RLは、まだ存在しない場合、自動的に作成されます。

次のコードの抜粋では、OWL2RLルールベースを使用しています。

CREATE TABLE m1_tpl (triple SDO_RDF_TRIPLE_S) COMPRESS;
EXECUTE sem_apis.create_sem_model('m1','m1_tpl','triple');
-- Insert data into model M1. Details omitted
...
-- Now run inference using the OWL2RL rulebase
EXECUTE sem_apis.create_entailment('m1_inf',sem_models('m1'),sem_rulebases('owl2rl'));

OWL2RLルールベースを使用すると、推論関連の最適化(パラレル推論やRAW8など)がすべて適用可能になります。

表2-2に、サポートされる各ルールベースに含まれるRDFSおよびOWLのボキャブラリ構成要素を示します。

表2-2 サポートされる各ルールベースに含まれるRDFS/OWLボキャブラリ構成要素

ルールベース名

含まれるRDFS/OWL構成要素

RDFS++

すべてのRDFSボキャブラリ構成要素

owl:InverseFunctionalProperty

owl:sameAs

OWLSIF

すべてのRDFSボキャブラリ構成要素

owl:FunctionalProperty

owl:InverseFunctionalProperty

owl:SymmetricProperty

owl:TransitiveProperty

owl:sameAs

owl:inverseOf

owl:equivalentClass

owl:equivalentProperty

owl:hasValue

owl:someValuesFrom

owl:allValuesFrom

OWLPrime

rdfs:subClassOf

rdfs:subPropertyOf

rdfs:domain

rdfs:range

owl:FunctionalProperty

owl:InverseFunctionalProperty

owl:SymmetricProperty

owl:TransitiveProperty

owl:sameAs

owl:inverseOf

owl:equivalentClass

owl:equivalentProperty

owl:hasValue

owl:someValuesFrom

owl:allValuesFrom

owl:differentFrom

owl:disjointWith

owl:complementOf

OWL2RL

(http://www.w3.org/TR/owl-profiles/#OWL_2_RLを参照)

2.2 OWL推論の使用方法

伴意ルールを使用してネイティブOWL推論を実行できます。この項では、単純なオントロジの作成、ネイティブ推論の実行、および追加の拡張機能について説明します。

2.2.1 単純なOWLオントロジの作成

例2-1では、単純なOWLオントロジを作成して、2つのURIが同じエンティティを示しているという内容の1つの文を挿入し、SEM_MATCHテーブル・ファンクションを使用した問合せを実行します。

例2-1 単純なOWLオントロジの作成

SQL> CREATE TABLE owltst(id number, triple sdo_rdf_triple_s);
Table created.

SQL> EXECUTE sem_apis.create_sem_model('owltst','owltst','triple');
PL/SQL procedure successfully completed.

SQL> INSERT INTO owltst VALUES (1, sdo_rdf_triple_s('owltst',
'http://example.com/name/John', 'http://www.w3.org/2002/07/owl#sameAs',
'http://example.com/name/JohnQ'));
1 row created.

SQL> commit;

SQL> -- Use SEM_MATCH to perform a simple query.
SQL> select s,p,o from table(SEM_MATCH('(?s ?p  ?o)', SEM_Models('OWLTST'),
null,  null, null ));

2.2.2 ネイティブOWL推論の実行

例2-2では、SEM_APIS.CREATE_ENTAILMENTプロシージャをコールします。OWLルールはOracleセマンティク・テクノロジ推論エンジンにすでに組み込まれているため、ルールベースを作成してそれにルールを追加する必要はありません。

例2-2 ネイティブOWL推論の実行

SQL> -- Invoke the following command to run native OWL inferencing that
SQL> -- understands the vocabulary defined in the preceding section.
SQL>
SQL>  EXECUTE sem_apis.create_entailment('owltst_idx', sem_models('owltst'), sem_rulebases('OWLPRIME'));
PL/SQL procedure successfully completed.

SQL> -- The following view is generated to represent the entailed graph (rules index).
SQL> desc mdsys.semi_owltst_idx;

SQL> -- Run the preceding query with an additional rulebase parameter to list
SQL> -- the original graph plus the inferred triples.
SQL> SELECT s,p,o FROM table(SEM_MATCH('(?s ?p  ?o)', SEM_MODELS('OWLTST'),
SEM_RULEBASES('OWLPRIME'),  null, null ));

2.2.3 OWLおよびユーザー定義のルールによる推論の実行

例2-3では、ユーザー定義のルールベースを作成して、簡略化したuncleOfルール(ある人物の父親の兄弟はその人物のおじであるという言明)を挿入し、SEM_APIS.CREATE_ENTAILMENTプロシージャをコールします。

例2-3 OWLおよびユーザー定義のルールによる推論の実行

SQL> -- First, insert the following assertions.

SQL> INSERT INTO owltst VALUES (1, sdo_rdf_triple_s('owltst',
'http://example.com/name/John', 'http://example.com/rel/fatherOf',
'http://example.com/name/Mary'));

SQL> INSERT INTO owltst VALUES (1, sdo_rdf_triple_s('owltst',
'http://example.com/name/Jack', 'http://example.com/rel/brotherOf',
'http://example.com/name/John'));

SQL> -- Create a user-defined rulebase.

SQL> EXECUTE sem_apis.create_rulebase('user_rulebase');

SQL> -- Insert a simple "uncle" rule.

SQL> INSERT INTO mdsys.semr_user_rulebase VALUES ('uncle_rule',
'(?x <http://example.com/rel/brotherOf> ?y)(?y <http://example.com/rel/fatherOf> ?z)',
NULL, '(?x <http://example.com/rel/uncleOf> ?z)', null);

SQL>  -- In the following statement, 'USER_RULES=T' is required, to
SQL> --  include the original graph plus the inferred triples.
SQL> EXECUTE sem_apis.create_entailment('owltst2_idx', sem_models('owltst'),
sem_rulebases('OWLPRIME','USER_RULEBASE'),
SEM_APIS.REACH_CLOSURE, null, 'USER_RULES=T');

SQL> -- In the result of the following query, :Jack :uncleOf :Mary is inferred.
SQL> SELECT s,p,o FROM table(SEM_MATCH('(?s ?p  ?o)',
SEM_MODELS('OWLTST'),
SEM_RULEBASES('OWLPRIME','USER_RULEBASE'),  null, null ));

2.2.4 OWL推論の証明の生成

OWL推論は複雑であり、オントロジのサイズ、使用される実際のボキャブラリ(言語構成要素のセット)、および言語構成要素間の相互作用に応じて変化します。トリプルの導出方法を検出できるように、推論中に証明の生成を使用できます。(証明の生成には、追加のCPUタイムとディスク・リソースを必要とします。)

証明に必要な情報を生成するには、次の例に示すとおり、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールでPROOF=Tを指定します。

EXECUTE sem_apis.create_entailment('owltst_idx', sem_models('owltst'), -
sem_rulebases('owlprime'), SEM_APIS.REACH_CLOSURE, 'SAM', 'PROOF=T');

PROOF=Tを指定すると、推論された各トリプルの証明を含むビューが作成されます。ビュー名は、MDSYS.SEMI_という接頭辞付きの伴意名です。このビューには、LINK_IDおよびEXPLAIN(証明)という2つの関連列があります。次の例では、生成された各トリプルのLINK_ID値と証明を表示します(LINK_ID値は説明のために短縮しています)。

SELECT link_id || ' generated by ' || explain as
triple_and_its_proof FROM mdsys.semi_owltst_idx;

TRIPLE_AND_ITS_PROOF
--------------------------------------------------------------------
8_5_5_4 generated by 4_D_5_5 : SYMM_SAMH_SYMM
8_4_5_4 generated by 8_5_5_4 4_D_5_5 : SAM_SAMH
. . .

1つの証明は、次のように1つ以上のトリプル(リンク)ID値と、それらのトリプルに適用されるルールの名前で構成されます。

link-id1 [link-id2 ... link-idn] : rule-name

証明用の主語、述語、目的語の完全なURIを取得するには、モデル・ビューおよび伴意(ルール索引)ビューを問い合せます。例2-4では、モデル・ビューMDSYS.SEMM_OWLTSTと伴意ビューMDSYS.SEMI_OWLTST_IDXを使用して、LINK_ID値および関連するトリプルの内容を表示します。

例2-4 証明情報の表示

SELECT to_char(x.triple.rdf_m_id, 'FMXXXXXXXXXXXXXXXX') ||'_'||
to_char(x.triple.rdf_s_id, 'FMXXXXXXXXXXXXXXXX') ||'_'||
to_char(x.triple.rdf_p_id, 'FMXXXXXXXXXXXXXXXX') ||'_'||
to_char(x.triple.rdf_c_id, 'FMXXXXXXXXXXXXXXXX'),
x.triple.get_triple()
FROM (
SELECT sdo_rdf_triple_s(
t.canon_end_node_id,
t.model_id,
t.start_node_id,
t.p_value_id,
t.end_node_id) triple
FROM (select * from mdsys.semm_owltst union all
select * from mdsys.semi_owltst_idx
) t
WHERE t.link_id IN ('4_D_5_5','8_5_5_4')
) x;

LINK_ID  X.TRIPLE.GET_TRIPLE()(SUBJECT, PROPERTY, OBJECT)
----------  --------------------------------------------------------------
4_D_5_5 SDO_RDF_TRIPLE('<http://example.com/name/John>', '<http://www.w3.org/2002/07/owl#sameAs>', '<http://example.com/name/JohnQ>')
8_5_5_4 SDO_RDF_TRIPLE('<http://example.com/name/JohnQ>', '<http://www.w3.org/2002/07/owl#sameAs>', '<http://example.com/name/John>')

例2-4により、LINK_ID = 8_5_5_4を持つトリプルの証明エントリ「8_5_5_4 generated by 4_D_5_5 : SYMM_SAMH_SYMM」が、owl:sameAsの対称性を使用して4_D_5_5を持つトリプルから推論されていることがわかります。

伴意ステータスがINCOMPLETEの場合、および最後の伴意が証明情報なしで生成されている場合、PROOF=Tを指定してSEM_APIS.CREATE_ENTAILMENTを起動することはできません。この場合、最初に伴意を削除し、PROOF=Tを指定して再度作成する必要があります。

2.2.5 OWLモデルおよび伴意の検証

OWLオントロジには、充足不可能なクラス、充足不可能なクラスに属するインスタンス、同じでありかつ異なると同時に表明される2つの個体など、様々なエラーが含まれる可能性があります。SEM_APIS.VALIDATE_MODELおよびSEM_APIS.VALIDATE_ENTAILMENTファンクションを使用すると、それぞれ元のデータ・モデルと伴意における非一貫性を検出できます。

例2-5では、SEM_APIS.VALIDATE_ENTAILMENTファンクションを使用します。このファンクションでは、エラーが検出されない場合はNULL値が戻され、エラーが検出された場合は文字列のVARRAYが戻されます。

例2-5 伴意の検証

SQL>  -- Insert an offending triple.
SQL>  insert into owltst values (1, sdo_rdf_triple_s('owltst',
'urn:C1', 'http://www.w3.org/2000/01/rdf-schema#subClassOf', 'http://www.w3.org/2002/07/owl#Nothing'));

SQL> -- Drop entailment first.
SQL>  exec sem_apis.drop_entailment('owltst_idx');
PL/SQL procedure successfully completed.

SQL> -- Perform OWL inferencing.
SQL> exec sem_apis.create_entailment('owltst_idx', sem_models('OWLTST'), sem_rulebases('OWLPRIME'));
PL/SQL procedure successfully completed.

SQL > set serveroutput on;
SQL > -- Now invoke validation API: sem_apis.validate_entailment
SQL >
declare
lva mdsys.rdf_longVarcharArray;
idx int;
begin
lva := sem_apis.validate_entailment(sem_models('OWLTST'), sem_rulebases('OWLPRIME')) ;

if (lva is null) then
dbms_output.put_line('No errors found.');
else
for idx in 1..lva.count loop
dbms_output.put_line('Offending entry := ' || lva(idx)) ;
end loop ;
end if;
end ;
/

SQL> -- NOTE: The LINK_ID value and the numbers in the following
SQL> -- line are shortened for simplicity in this example. --

Offending entry  := 1 10001 (4_2_4_8 2 4 8) Unsatisfiable class.

検証レポートの配列の各項目には、次の情報が含まれます。

- このエラーの原因となったトリプルの数(例2-5では1)

- エラー・コード(例2-5では10001)

- 1つ以上のトリプル(出力中のカッコ内。例2-5では(4_2_4_8 2 4 8))
これらの数字は、LINK_ID値と、主語、述語、目的語のID値です。

- 説明的なエラー・メッセージ(例2-5ではUnsatisfiable class.)

例2-5の出力から、クラスが空のクラスowl:Nothingのサブクラスであると表明している1つのトリプルを原因としてエラーが発生したことがわかります。

2.2.6 RDFS推論のためのSEM_APIS.CREATE_ENTAILMENTの使用

OWLボキャブラリを使用する以外に、SEM_APIS.CREATE_ENTAILMENTプロシージャによりRDFSルールベースを使用できます。次の例は、RDFS推論を示します(すべての標準RDFSルールは、http://www.w3.org/TR/rdf-mt/に定義されています)。

EXECUTE sem_apis.create_entailment('rdfstst_idx', sem_models('my_model'), sem_rulebases('RDFS'));

ルールRDFS4A、RDFS4B、RDFS6、RDFS8、RDFS10、RDFS13では、アプリケーション用に意味のある推論が生成されないことがあるため、これらのコンポーネントは推論の高速化のために選択解除できます。次の例では、これらのルールを選択解除します。

EXECUTE sem_apis.create_entailment('rdfstst_idx', sem_models('my_model'), sem_rulebases('RDFS'), SEM_APIS.REACH_CLOSURE, -
'RDFS4A-, RDFS4B-, RDFS6-, RDFS8-, RDFS10-, RDFS13-');

2.2.7 推論パフォーマンスの向上

この項では、推論操作のパフォーマンスを向上するための推奨事項について説明します。

- 推論の前に統計を収集します。大規模なRDF/OWLデータ・モデルをロードした後には、SEM_PERF.GATHER_STATSプロシージャを実行する必要があります。使用方法に関する重要な情報は、第11章にあるこのプロシージャの「使用方法」を参照してください。

- 推論操作用に十分な一時表領域を割り当てます。OracleのOWL推論サポートは、表結合に大きく依存するため、かなりの量の一時表領域を使用します。

- SVFHおよびAVFH推論コンポーネントの適切な実装を使用します。
SVFHおよびAVFH推論コンポーネントのデフォルト実装が最適に動作するのは、owl:someValuesFromまたはowl:allValuesFrom (あるいはその両方)で定義された制限クラスの数が少ない場合です(LUBMデータセットと同様)。ただし、Gene Ontology (http://www.geneontology.org/)のようにこれらのクラスの数が多い場合、SVFHおよびAVFHの非手続き型の実装を使用するとパフォーマンスが大幅に向上する可能性があります。

手続き型の実装を無効にしてSVFHおよびAVFHの非手続き型の実装を選択するには、SEM_APIS.CREATE_ENTAILMENTのオプションに'PROCSVFH=F'または'PROCAVFH=F' (あるいはその両方)を含めます。オントロジに適切な実装を使用すると、パフォーマンスが大幅に向上します。たとえば、NCI Thesaurusオントロジ(https://cabig.nci.nih.gov/community/concepts/EVS/)にSVFHの非手続き型の実装を選択したところ、SVFH推論コンポーネントのパフォーマンスが960%向上しました(Oracle ASMと連携する3つのSATAディスクが搭載されたデュアルコアの8GB RAMデスクトップ・システムでテスト)。

2.2.8項「owl:sameAs推論の最適化」も参照してください。

2.2.8 owl:sameAs推論の最適化

大規模なowl:sameAsクリークの推論パフォーマンスを最適化するには、OWLPrime伴意の実行時にoptionsパラメータに'OPT_SAMEAS=T'を指定します。(クリークとは、そのすべてのノードが同じグラフの他のすべてのノードに双方向に接続されているグラフです。)

OWLセマンティクに従って、owl:sameAs構成要素は同等の関係として扱われるため、それは再帰的、対称的および推移的です。その結果、推論中にowl:sameAs関連の伴意がすべて実体化し、推論されたグラフのサイズが大幅に増加する可能性があります。次のトリプル・セットの例について検討します。

:John  owl:sameAs  :John1 .
:John  owl:sameAs  :John2 .
:John2 :hasAge     "32" .

SAMコンポーネントを指定してOWLPrime推論をこのセットに適用すると、次の新しいトリプルが生成されます。

:John1  owl:sameAs  :John .
:John2  owl:sameAs  :John .
:John1  owl:sameAs  :John2 .
:John2  owl:sameAs  :John1 .
:John   owl:sameAs  :John .
:John1  owl:sameAs  :John1 .
:John2  owl:sameAs  :John2 .
:John   :hasAge     "32" .
:John1  :hasAge     "32" .

前述の例で、:John、:John1および:John2はowl:sameAs関係によって相互に接続され、それらはowl:sameAsクリークのメンバーになります。大規模なowl:sameAsクリークに最適化された推論を提供する場合、OWLPrime伴意の実行時にoptionsパラメータに'OPT_SAMEAS=T'を指定することで、正確性を犠牲にすることなく各owl:sameAsトリプルを統合できます。次に例を示します。

EXECUTE sem_apis.create_entailment('M_IDX',sem_models('M'),
sem_rulebases('OWLPRIME'),null,null,'OPT_SAMEAS=T');

このオプションを指定すると、owl:sameAsクリークごとに、クリークの1つのリソースが正規形の代表として選択され、そのクリークのすべての推論がそのリソースを中心に統合されます。前述の例で、:John1がクリークの代表の場合、統合後の推論されたグラフには次のトリプルのみが含まれます。

:John1 owl:sameAs :John1 .
:John1 :hasAge    "32" .

owl:sameAsの統合では、オーバーヘッドが発生します。推論中に、すべての表明されたモデルは、推論パーティションにコピーされ、そこで推論されたトリプルと統合されます。また、表明されたグラフが非常に大きい場合、重複トリプルの統合と削除によって大規模なランタイム・オーバーヘッドが発生するため、オントロジに多数のowl:sameAs関係が含まれ、クリーク・サイズが大きい場合にのみOPT_SAMEAS=Tオプションをお薦めします。

OPT_SAMEAS=Tオプションを伴意で使用した後は、その伴意に対する後続のSEM_APIS.CREATE_ENTAILMENTの使用でも、すべてOPT_SAMEAS=Tを使用する必要があり、そうしないとエラーがレポートされます。最適化されたsameAsの処理を無効化するには、最初に伴意を削除する必要があります。

クリークのメンバーシップ情報は、MDSYS.SEMCL_entailment-nameというビューに格納されます(entailment-nameは伴意(ルール索引)の名前です)。表2-3に、各MDSYS.SEMCL_entailment-nameビューの列を示します。

表2-3 MDSYS.SEMCL_entailment_nameビューの列

列名

データ型

説明

MODEL_ID

NUMBER

推論されたモデルのID番号

VALUE_ID

NUMBER

CLIQUE_IDによって識別されるowl:sameAsクリークのメンバーであるリソースのID番号

CLIQUE_ID

NUMBER

VALUE_IDリソースのクリーク代表のID番号

領域を節約するため、MDSYS.SEMCL_entailment-nameビューには、(CLIQUE_ID, CLIQUE_ID)などの再帰行は含まれません。

2.2.8.1 owl:sameAsで統合された推論グラフの問合せ

問合せ時に、問合せ対象の伴意がOPT_SAMEAS=Tオプションを使用して作成された場合、その結果は、owl:sameAsで統合された推論パーティションから戻されます。すべてのowl:sameAs閉包を含めるように問合せ結果が拡張されることはありません。

次の例の問合せでは、戻される唯一の結果は、正規形クリークの代表である:John1です。

SELECT A FROM TABLE (
SEM_MATCH ('(?A :hasAge "32")',SEM_MODELS('M'),
SEM_RULEBASES('OWLPRIME'),NULL, NULL));

前述の例で、モデルに:John2 :hasAge "32"が出現したとしても、冗長トリプルが除外される推論統合フェーズ中に置換されます。ただし、統合されたowl:sameAs情報を含むMDSYS.SEMCL_rules-index-nameビューとの結合を実行して、問合せ結果を拡張できます。たとえば、前述のSEM_MATCH問合せの拡張結果セットを取得するには、次の拡張問合せを使用します。

SELECT V.VALUE_NAME A_VAL FROM TABLE (
SEM_MATCH ('(?A :hasAge "32")',SEM_MODELS('M'),
SEM_RULEBASES('OWLPRIME'), NULL, NULL)) Q,
MDSYS.RDF_VALUE$ V, MDSYS.SEMCL_M_IDX C
WHERE V.VALUE_ID  = C.VALUE_ID
AND C.CLIQUE_ID = Q.A$RDFVID
UNION ALL
SELECT A A_VAL FROM TABLE (
SEM_MATCH ('(?A :hasAge "32")',SEM_MODELS('M'),
SEM_RULEBASES('OWLPRIME'),NULL, NULL));

または、次のように左側外部結合を使用して、前述の拡張問合せをリライトできます。

SELECT V.VALUE_NAME A_VAL FROM TABLE (
SEM_MATCH ('(?A <http://hasAge> "33")',SEM_MODELS('M'),
SEM_RULEBASES('OWLPRIME'), NULL, NULL)) Q,
MDSYS.RDF_VALUE$ V,
(SELECT value_id, clique_id FROM MDSYS.SEMCL_M_IDX
UNION ALL
SELECT DISTINCT clique_id, clique_id
FROM MDSYS.SEMCL_M_IDX) C
WHERE Q.A$RDFVID  = c.clique_id  (+)
AND V.VALUE_ID  = nvl(C.VALUE_ID, Q.A$RDFVID);

2.2.9 増分推論の実行

増分推論を使用すると、トリプルの追加後に効率的に伴意(ルール索引)を更新できます。伴意に対する増分推論を有効にするには、次の2つの方法があります。

- 伴意の作成時にoptionsパラメータ値としてINC=Tを指定します。次に例を示します。

EXECUTE sem_apis.create_entailment ('M_IDX',sem_models('M'),
sem_rulebases('OWLPRIME'),null,null, 'INC=T');

- SEM_APIS.ENABLE_INC_INFERENCEプロシージャを使用します。
このプロシージャを使用する場合、伴意のステータスはVALIDである必要があります。プロシージャをコールする前に、伴意に含まれるモデルを所有していない場合、各モデルの所有者がSEM_APIS.ENABLE_CHANGE_TRACKINGプロシージャを使用してそれらのモデルの変更トラッキングを有効化していることを確認する必要があります。

伴意で増分推論が有効化されている場合、その伴意に対してSEM_APIS.CREATE_ENTAILMENTプロシージャを起動するときに、パラメータINC=Tを指定する必要があります。

伴意に対する増分推論は、伴意の作成に含まれるモデルのアプリケーション表のトリガーに依存します。つまり、次の例のようにSEM_APIS.CREATE_ENTAILMENTプロシージャのコールでdelta_inパラメータを使用してトリプルを指定しない場合、従来型パスによるロードを使用して伴意の基礎となるアプリケーション表にトリプルが挿入されるときにのみ、増分推論が機能します(次の例では、モデルM_NEWのトリプルがモデルMに追加され、伴意M_IDXが新しい推論で更新されます)。

EXECUTE sem_apis.create_entailment('M_IDX', sem_models('M'),
sem_rulebases('OWLPRIME''), SEM_APIS.REACH_CLOSURE, null, null,
sem_models('M_NEW'));

複数のモデルが増分推論コールに含まれる場合、1つ以上のdelta_inモデルが追加される宛先モデルを指定するには、optionsパラメータにDEST_MODEL=<model_name>を指定します。たとえば、次の例では、モデルM_NEWのセマンティク・データがモデルM2に追加されます。

EXECUTE sem_apis.create_entailment('M_IDX', sem_models('M1','M2','M3'),
sem_rulebases('OWLPRIME''), SEM_APIS.REACH_CLOSURE, null, 'DEST_MODEL=M2', sem_models('M_NEW'));

増分推論の使用時に従来型パスによるロードの要件を省略するもう1つの方法は、バルク・ロードの実行時に伴意間の間隔を対象とするようにUNDO_RETENTIONパラメータを設定することです。たとえば、最後の伴意が6時間前に作成された場合、UNDO_RETENTION値に6時間を超える値を設定する必要があり、それより短い場合(ワークロードが過大でUNDO領域が制限されていると)、増分推論を適用するためのすべての関連UNDO情報が保存されない可能性があります。このような場合、SEM_APIS.CREATE_ENTAILMENTプロシージャは、通常の(非増分)推論に戻ります。

変更トラッキングがモデルで有効になっているかどうかを確認するには、SEM_APIS.GET_CHANGE_TRACKING_INFOプロシージャを使用します。伴意に対する増分推論の追加情報を取得するには、SEM_APIS.GET_INC_INF_INFOプロシージャを使用します。

増分推論の制限事項は、次のとおりです。

- 最適化されたowl:sameAsの処理(OPT_SAMEAS)、ユーザー定義ルール、VPD対応モデルまたはバージョン対応モデルでは機能しません。

- トリプルの追加のみがサポートされます。更新または削除では、伴意が完全に再構築されます。

- アプリケーション表のトリガーに依存します。

- 増分推論で使用される列の型(RAW8またはNUMBER)には、一貫性がある必要があります。たとえば、最初にRAW8=Tを使用して伴意を構築した場合、後続のすべてのSEM_APIS.CREATE_ENTAILMENTコールで同じオプションを使用する必要があります。列の型をNUMBERに変更するには、伴意を削除して再構築する必要があります。

2.2.10 パラレル推論の使用

パラレル推論では、マルチコアまたはマルチCPUアーキテクチャの機能を利用して、推論パフォーマンスを向上できます。パラレル推論を使用するには、SEM_APIS.CREATE_ENTAILMENTプロシージャの使用時にDOP (並列度)キーワードと適切な値を指定します。次に例を示します。

EXECUTE sem_apis.create_entailment('M_IDX',sem_models('M'),
sem_rulebases('OWLPRIME'), sem_apis.REACH_CLOSURE, null, 'DOP=4');

DOPキーワードの指定によって、オラクル社が選択した推論コンポーネントのセットに対してパラレル実行が有効になります。

パラレル推論が成功するかどうかは、データベースが実行されているシステムのハードウェア構成が適切かどうかによって大きく異なります。重要なのは、データベース・パフォーマンス・チューニングとOracle SQLパラレル実行のベスト・プラクティスが実現されるバランスの取れたシステムを確保することです。たとえば、単一の物理ディスクでSQL文をパラレルに実行すると、SQL文をシリアル・モードで実行するより低速になる可能性があるため、800GBのデータベースに対して単一の1TBのディスクを使用しないでください。パラレル推論には十分なメモリーが必要なため、CPUコアごとに4GB以上のメモリーが必要です。

パラレル推論は大規模なオントロジに最適ですが、小規模なオントロジでも推論パフォーマンスは向上する可能性があります。

パラレル推論の使用に関連して、一時的な記憶域のオーバーヘッドが発生します。パラレル推論によって、すべてのソースRDF/OWLモデルと既存の推論されたグラフに基づくすべてのトリプルを含むソース表が作成されます。この表は、ソース・モデルのデータおよび索引を格納するために必要な領域と比較して、10から30%余分に記憶域を使用する可能性があります。

2.2.11 名前付きグラフ・ベースの推論(グローバルおよびローカル)の使用

Oracle Databaseのデフォルトの推論では、提供された1つ以上のソース・モデルすべてから、すべての表明されたトリプルを取得し、推論の閉包に到達するまですべての表明されたトリプルにセマンティク・ルールを適用します。指定されたソース・モデルに1つ以上の名前付きグラフが含まれる場合でも、すべての表明は、それが名前付きグラフの一部であるかどうかにかかわらず、単一のグラフから取得された場合と同様に扱われるため、違いはありません。(Oracle Databaseセマンティク・テクノロジでの名前付きグラフのサポートの概要は、1.3.9項を参照してください。)

このデフォルトの推論は、名前付きグラフがまったく考慮されないという点で、完全にグローバルなものと考えることができます。

ただし、名前付きグラフを使用する場合は、次のいずれかの機能を使用することで、デフォルトの推論をオーバーライドし、名前付きグラフを考慮に入れることができます。

- 名前付きグラフ・ベースのグローバル推論(NGGI): すべての指定された名前付きグラフを統合グラフとして処理します。NGGIでは、考慮されるトリプルの有効範囲を絞り込みながら、高い柔軟性を実現できます(2.2.11.1項を参照)。

- 名前付きグラフ・ベースのローカル推論(NGLI): 指定された名前付きグラフをそれぞれ個別エンティティとして処理します。NGLIの詳細は、2.2.11.2項を参照してください。

NGGIとNGLIを一緒に使用する場合、2.2.11.3項の推奨される使用フローを参照してください。

伴意(ルール索引)の作成時に、SEM_APIS.CREATE_ENTAILMENTプロシージャの特定のパラメータおよびオプションを使用して、NGGIまたはNGLIを指定します。

2.2.11.1 名前付きグラフ・ベースのグローバル推論(NGGI)

名前付きグラフ・ベースのグローバル推論(NGGI)によって、(モデル・レベルではなく)名前付きグラフ・レベルで推論に使用されるトリプルの範囲を絞り込むことができます。また、有効範囲の選択で高い柔軟性が実現します(たとえば、0個以上の名前付きグラフまたはデフォルト・グラフ(あるいはその両方)からトリプルを含めることや、指定したモデルからNULLのグラフ名を持つすべてのトリプルを含めることができます)。

たとえば、病院向けアプリケーションで、特定の病院の患者を説明する名前付きグラフのセットに含まれるすべての情報にのみ推論ルールを適用できます。患者に関連する名前付きグラフにインスタンス関連の表明(ABox)のみが含まれる場合、例2-6のように、1つ以上の追加のスキーマ関連モデル(TBox)を指定できます。

例2-6 名前付きグラフ・ベースのグローバル推論

EXECUTE sem_apis.create_entailment(
'patients_inf',
models_in         => sem_models('patients','hospital_ontology'),
rulebases_in      => sem_rulebases('owl2rl'),
passes            => SEM_APIS.REACH_CLOSURE,
inf_components_in => null,
options           => 'DOP=4,RAW8=T',
include_default_g => sem_models('hospital_ontology'),
include_named_g   => sem_graphs('<urn:hospital1_patient1>','<urn:hospital1_patient2>'),
inf_ng_name       => '<urn:inf_graph_for_hospital1>'
);

例2-6の内容:

- 2つのモデルが含まれます(patientsには、各名前付きグラフが特定の患者に関連するトリプルを保持する名前付きグラフのセットが含まれ、hospital_ontologyには、病院で定義されている概念と関係を記述するスキーマ情報が含まれます)。これら2つのモデルは、ともにソース・モデルで、推論の全体的な有効範囲を設定します。

- include_default_gパラメータによって、指定したモデルのNULLのグラフ名を持つすべてのトリプルが、NGGIに参加します。この例では、モデルhospital_ontologyのNULLのグラフ名を持つすべてのトリプルがNGGIに含まれます。

- include_named_gパラメータによって、(すべてのソース・モデル全体の)指定した名前付きグラフのすべてのトリプルが、NGGIに参加します。この例では、名前付きグラフ<urn:hospital1_patient1>および<urn:hospital1_patient2>のトリプルがNGGIに含まれます。

- inf_ng_nameパラメータによって、グラフ名<urn:inf_graph_for_hospital1>が、NGGIによって推論される新しいすべてのトリプルに割り当てられます。

2.2.11.2 名前付きグラフ・ベースのローカル推論(NGLI)

名前付きグラフ・ベースのローカル推論(NGLI)は、各グラフを単一の統合グラフとして参照せず、名前付きグラフをそれぞれ個別エンティティとして処理します。推論ロジックは、各エンティティの境界内で実行されます。デフォルト・グラフでスキーマ関連の表明(TBox)を指定することが可能で、そのデフォルト・グラフは各名前付きグラフの推論に参加します。たとえば、G1という名前を持つグラフに基づいて推論されたトリプルには、推論されたデータ・パーティションで同じグラフ名のG1が割り当てられます。

2つの個別の名前付きグラフの表明が結合されて新しい表明が生成されることはありません。

たとえば、次の条件があると仮定します。

- グラフG1は、次の表明を含みます。

:John  :hasBirthMother  :Mary .

- グラフG2は、次の表明を含みます。

:John  :hasBirthMother  :Bella .

- デフォルト・グラフは、:hasBirthMotherがowl:FunctionalPropertyであるという表明を含みます。(この表明にはNULLのグラフ名が含まれます。)

この例では、2つの表明が2つの異なるグラフG1とG2から取得されるため、名前付きグラフ・ベースのローカル推論(NGLI)では、:Maryがowl:sameAs :Bellaであるとは推論されません。一方、G1、G2、および関数的プロパティ定義を含む名前付きグラフ・ベースのグローバル推論(NGGI)では、:Maryがowl:sameAs :Bellaであると推論できます。

例2-7に、NGLIを示します。

例2-7 名前付きグラフ・ベースのローカル推論

EXECUTE sem_apis.create_entailment(
'patients_inf',
models_in         => sem_models('patients','hospital_ontology'),
rulebases_in      => sem_rulebases('owl2rl'),
passes            => SEM_APIS.REACH_CLOSURE,
inf_components_in => null,
options           => 'LOCAL_NG_INF=T'
);

例2-7の内容:

- 2つのモデルpatientsとhospital_ontologyは、ともにソース・モデルで、例2-6のグローバル推論の場合と同様に、推論の全体的な有効範囲を設定します。NULLのグラフ名を持つすべてのトリプルは、共通スキーマ(TBox)の一部として処理されます。推論は、共通スキーマに結合された単一の名前付きグラフすべての境界内で実行されます。

- optionsパラメータのキーワードと値のペアLOCAL_NG_INF=Tは、名前付きグラフ・ベースのローカル推論(NGLI)を実行することを指定しています。

設計上、NGLIはデフォルト・グラフ自体には適用されないことに注意してください。ただし、名前付きグラフ・ベースのグローバル推論(NGGI)をデフォルト・グラフに簡単に適用し、inf_ng_nameパラメータをNULLに設定できます。このように、TBox推論は事前に計算され、全体的パフォーマンスと記憶域の消費が改善されます。

NGLIでは、次のことは許可されません。

- 複数の名前付きグラフからの混合トリプルに基づいた新しい関係の推論

- デフォルト・グラフからのトリプルのみを使用した新しい関係の推論

通常予測される推論を取得するには、スキーマ表明とインスタンス表明を別々に保持する必要があります。スキーマ表明(たとえば、:A rdfs:subClassOf :Bと:p1 rdfs:subPropertyOf :p2)は、(NULLのグラフ名を持つ)名前なしトリプルとしてデフォルト・グラフに格納される必要があります。一方、インスタンス表明(たとえば、:X :friendOf :Y)は、名前付きグラフのいずれかに格納される必要があります。

NGLIを使用してセマンティクに索引付けされたドキュメントでドキュメント中心の推論を実行する方法の詳細とその例は、4.15項「ドキュメント中心の推論の実行」を参照してください。

現在のところ、NGLIは、証明の生成、ユーザー定義ルール、最適化されたowl:sameAsの処理または増分推論とは連携しません。

2.2.11.3 NGGIとNGLIの併用

次に、NGGIとNGLIを併用する場合に推奨される使用フローを示します。前提として、TBoxとABoxが2つの別個のモデルに格納され、TBoxにスキーマ定義が含まれ、TBoxのすべてのトリプルがNULLのグラフ名を持つが、インスタンス関連データを記述する名前付きグラフのセットでABoxが構成されているとします。

1. TBoxでNGGIを単独で起動します。次に例を示します。

EXECUTE sem_apis.create_entailment(
'TEST_INF',
sem_models('abox','tbox'),
sem_rulebases('owl2rl'),
SEM_APIS.REACH_CLOSURE,
include_default_g=>sem_models('tbox')
);

2. すべての名前付きグラフに対してNGLIを起動します。次に例を示します。

EXECUTE sem_apis.create_entailment(
'TEST_INF',
sem_models('abox','tbox'),
sem_rulebases('owl2rl'),
SEM_APIS.REACH_CLOSURE,
options => 'LOCAL_NG_INF=T,ENTAIL_ANYWAY=T'
);

手順1のNGGIコールで推論されたグラフのステータスがVALIDに設定され、手順2のSEM_APIS.CREATE_ENTAILMENTプロシージャ・コールはENTAIL_ANYWAY=Tが指定されていないと即座に終了するため、ENTAIL_ANYWAY=Tが指定されています。

2.2.12 選択的推論の実行(高度な情報)

選択的推論は、コンポーネント・ベースの推論です。この操作では、推論を関心のある特定のOWLコンポーネントに限定します。選択的推論を実行するには、SEM_APIS.CREATE_ENTAILMENTプロシージャのinf_components_inパラメータを使用して、コンポーネントのカンマ区切りのリストを指定します。最終的な推論は、指定したルールベースと指定したコンポーネントの和集合によって決定されます。

例2-8では、サブクラス(SCOH)関係に基づくクラス階層と、サブプロパティ(SPOH)関係に基づくプロパティ階層に推論を限定します。この例では、空のルールベースを作成してから、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールで2つのコンポーネント('SCOH,SPOH')を指定します。

例2-8 選択的推論の実行

EXECUTE sem_apis.create_rulebase('my_rulebase');

EXECUTE sem_apis.create_entailment('owltst_idx', sem_models('owltst'), sem_rulebases('my_rulebase'), SEM_APIS.REACH_CLOSURE, 'SCOH,SPOH');

使用できるコンポーネント・コードは、SCOH、COMPH、DISJH、SYMMH、INVH、SPIH、MBRH、SPOH、DOMH、RANH、EQCH、EQPH、FPH、IFPH、DOM、RAN、SCO、DISJ、COMP、INV、SPO、FP、IFP、SYMM、TRANS、DIF、SAM、CHAIN、HASKEY、ONEOF、INTERSECT、INTERSECTSCOH、MBRLST、PROPDISJH、SKOSAXIOMS、SNOMED、SVFH、THINGH、THINGSAM、UNION、RDFP1、RDFP2、RDFP3、RDFP4、RDFP6、RDFP7、RDFP8AX、RDFP8BX、RDFP9、RDFP10、RDFP11、RDFP12A、RDFP12B、RDFP12C、RDFP13A、RDFP13B、RDFP13C、RDFP14A、RDFP14BX、RDFP15、RDFP16、RDFS2、RDFS3、RDFS4a、RDFS4b、RDFS5、RDFS6、RDFS7、RDFS8、RDFS9、RDFS10、RDFS11、RDFS12、RDFS13です。

接頭辞RDFP付きのコンポーネントに対応するルールの詳細は、『Completeness, decidability and complexity of entailment for RDF Schema and a semantic extension involving the OWL vocabulary』(H.J. Horst)を参照してください。

コンポーネントを選択解除する構文は、component_nameの次にマイナス記号(-)を付けます。たとえば、次の文では、subClassOf階層を計算することなくOWLPrime推論を実行します。

EXECUTE sem_apis.create_entailment('owltst_idx', sem_models('owltst'), sem_rulebases('OWLPRIME'), SEM_APIS.REACH_CLOSURE, 'SCOH-');

デフォルトでは、OWLPrimeルールベースは、owl:sameAsの推移的セマンティクを実装しています。OWLPrimeには、次のルール(セマンティク)は含まれません。

U   owl:sameAs   V  .
U     p    X  .        ==>   V  p   X   .

U   owl:sameAs   V  .
X     p    U  .        ==>   X   p   V   .

これらのルールが含まれない理由は、通常、そのルールにより数多くの表明が生成されるためです。これらの表明を含める必要がある場合は、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールでSAMコンポーネント・コードを指定します。

2.3 セマンティク演算子を使用したリレーショナル・データの問合せ

セマンティク演算子を使用すると、表の列のデータとオントロジの用語間のセマンティク関係に基づいてオントロジ支援形式でリレーショナル・データを問い合せることができます。SEM_RELATEDセマンティク演算子では、セマンティク関係に基づいて行を取得できます。SEM_DISTANCEセマンティク演算子では、セマンティク関係の距離量が戻されるため、その距離量を使用してSEM_RELATED演算子で戻された行を順序付けることや、制限することが可能です。索引タイプMDSYS.SEM_INDEXTYPEでは、このような問合せを効率的に実行することで、大規模なデータセットに対してスケーラブルなパフォーマンスを発揮できます。

2.3.1 SEM_RELATED演算子の使用

2.1.1項のがんのオントロジの例を題材として、セマンティクな一致を必要とする「診断がImmune_System_Disorderタイプの患者をすべて検出する」という問合せについて検討します。構文的な一致に基づくPATIENTS表(2.1.1項を参照)の一般的なデータベース問合せでは、Immune_System_Disorderとまったく同じ値を含むDIAGNOSIS列のある行は存在しないため、どの行も戻されません。たとえば、次の問合せではどの行も戻されません。

SELECT diagnosis FROM patients WHERE diagnosis = 'Immune_System_Disorder';

ただし、患者のデータ表の多くの行は、診断上このクラスに分類されるため、関連性を保持しています。例2-9では、(字句の等価性ではなく)SEM_RELATED演算子を使用して、患者のデータ表から関連するすべての行を取得します。(この例の場合、Immune_System_Disorderという用語には名前空間の接頭辞が付けられており、デフォルトの仮定として表の列の値にも名前空間の接頭辞が含まれます。ただし、2.3.5項の説明にあるとおり、この前提は常に成り立つとはかぎりません。)

例2-9 SEM_RELATED演算子

SELECT diagnosis FROM patients
WHERE SEM_RELATED (diagnosis,
'<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
'<http://www.example.org/medical_terms/Immune_System_Disorder>',
sem_models('medical_ontology'), sem_rulebases('owlprime')) = 1;

SEM_RELATED演算子には、次の属性があります。

SEM_RELATED(
sub  VARCHAR2,
predExpr  VARCHAR2,
obj  VARCHAR2,
ontologyName  SEM_MODELS,
ruleBases  SEM_RULEBASES,
index_status  VARCHAR2,
lower_bound INTEGER,
upper_bound INTEGER
) RETURN INTEGER;

sub属性は、検索される表の列の名前です。表の列の用語は、通常、<主語、述語、目的語>のトリプル・パターンにおける主語です。

predExpr属性は、主語ノードから目的語ノードに向かうパスの一端のラベルとして出現可能な述語を表します。

obj属性は、その関連用語(predExpr属性により関連付けられる用語)をsub属性で指定された表の列内で検出する必要のあるオントロジの用語を表します。この用語は、通常、<主語、述語、目的語>のトリプル・パターンにおける目的語です。(等価演算子を含む問合せでは、これが問合せ用語になります。)

ontologyName属性は、用語間の関係を含むオントロジの名前です。

rulebases属性は、新しい関係を推論するためにオントロジに適用されるルールを含む1つ以上のルールベースを示します。問合せに対する回答は、オントロジから取得される関係と、この属性の指定時に推論される新しい関係の両方に基づきます。

index_statusオプション属性では、関連する伴意(指定したルールベースがオントロジに適用されたときに作成される伴意)のステータスが無効の場合でも、データを問い合せることができます。この属性がNULLの場合、伴意のステータスが無効であると、問合せによりエラーが戻されます。この属性がNULLではない場合、文字列VALID、INCOMPLETEまたはINVALIDを使用して、問合せを成功させるための伴意の最低限のステータスを指定する必要があります。OWLでは単調性は保証されないため、OWLルールベースを指定する場合、値INCOMPLETEを使用しないでください。

lower_boundおよびupper_boundオプション属性では、関連する用語間の関係の距離量に対して限界値を指定できます。距離量の詳細は、2.3.2項を参照してください。

SEM_RELATED演算子では、オントロジ内の指定したpredExpr関係について、2つの入力用語が関連している場合、1が戻されます。2つの入力用語が関連していない場合、0が戻されます。下限値および上限値を指定した場合は、lower_bound以上およびupper_bound以下の距離量で2つの入力用語が関連している場合に1が戻されます。

2.3.2 SEM_DISTANCE補助演算子の使用

SEM_DISTANCE補助演算子は、SEM_RELATED演算子の使用によりフィルタされた行の距離量を計算します。SEM_DISTANCE演算子の書式は、次のとおりです。

SEM_DISTANCE (number) RETURN NUMBER;

number属性には、SEM_RELATED演算子のコールで指定した最後の属性の数と一致していれば、どのような数でも指定できます(例2-10を参照)。問合せでは、主演算子と補助演算子を複数起動できるため、この数を使用して補助演算子SEM_DISTANCEの起動と特定のSEM_RELATED(主演算子)の起動を一致させます。

例2-10は、例2-9を拡張したもので、SEM_DISTANCE補助演算子を含む複数の文が使用されています(これは、2つの用語間の距離を測定することで、それらの用語(ここでは、患者の診断と用語Immune_System_Disorder)の関連がどの程度近似しているかを計算します)。2.1.1項のがんのオントロジを使用すると、AIDSとImmune_System_Disorder間の距離は3です。

例2-10 SEM_DISTANCE補助演算子

SELECT diagnosis, SEM_DISTANCE(123) FROM patients
WHERE SEM_RELATED (diagnosis,
'<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
'<http://www.example.org/medical_terms/Immune_System_Disorder>',
sem_models('medical_ontology'), sem_rulebases('owlprime'), 123) = 1;

SELECT diagnosis FROM patients
WHERE SEM_RELATED (diagnosis,
'<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
'<http://www.example.org/medical_terms/Immune_System_Disorder>',
sem_models('medical_ontology'), sem_rulebases('owlprime'), 123) = 1
ORDER BY SEM_DISTANCE(123);

SELECT diagnosis, SEM_DISTANCE(123) FROM patients
WHERE SEM_RELATED (diagnosis,
'<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
'<http://www.example.org/medical_terms/Immune_System_Disorder>',
sem_models('medical_ontology'), sem_rulebases('owlprime'), 123) = 1
WHERE SEM_DISTANCE(123) <= 3;

例2-11では、距離情報を使用して、主演算子により戻される行の数を制限します。SEM_RELATEDの起動で指定された目的語属性に関連する用語を含む行のうち、距離が2以上4以下のすべての行が取得されます。

例2-11 SEM_DISTANCEを使用した返却行数の制限

SELECT diagnosis FROM patients
WHERE SEM_RELATED (diagnosis,
'<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
'<http://www.example.org/medical_terms/Immune_System_Disorder>',
sem_models('medical_ontology'), sem_rulebases('owlprime'), 2, 4) = 1;

例2-11では、SEM_DISTANCE演算子を使用するかわりにSEM_RELATED演算子のlower_boundおよびupper_boundパラメータを使用して下限値および上限値を指定しています。SEM_DISTANCE演算子は、例2-10の最後のSELECT文のように、戻される行を制限する場合にも使用できます。

2.3.2.1 距離情報の計算

距離は、推論(伴意)の実行中に、推移的プロパティとして定義されたOWLプロパティ、RDFS subClassOfプロパティおよびRDFS subPropertyOfプロパティに対して生成されます。これらのプロパティを通じてリンクされた2つの用語間の距離は、階層クラス構造内の用語間の最短距離として計算されます。他のプロパティを通じてリンクされた2つの用語間の距離は、未定義のためNULLに設定されます。

(階層クラス構造として参照される)元のモデルの推移的プロパティ・リンクの距離はそれぞれ1となり、推論されるトリプルの距離は2つの用語間のリンク数に従って生成されます。ここでは、次の架空の使用例について検討します。

- 元のグラフにC1 rdfs:subClassOf C2およびC2 rdfs:subClassOf C3が含まれる場合、C1 rdfs:subClassof of C3が導出されます。この場合、次のようになります。

- C1 rdfs:subClassOf C2: 距離 = 1(モデル内に存在するため)。

- C2 rdfs:subClassOf C3: 距離 = 1(モデル内に存在するため)。

- C1 rdfs:subClassOf C3: 距離 = 2(推論時に生成されるため)。

- 元のグラフにP1 rdfs:subPropertyOf P2およびP2 rdfs:subPropertyOf P3が含まれる場合、P1 rdfs:subPropertyOf P3が導出されます。この場合、次のようになります。

- P1 rdfs:subPropertyOf P2: 距離 = 1(モデル内に存在するため)。

- P2 rdfs:subPropertyOf P3: 距離 = 1(モデル内に存在するため)。

- P1 rdfs:subPropertyOf P3: 距離 = 2(推論時に生成されるため)。

- 元のグラフにC1 owl:equivalentClass C2およびC2 owl:equivalentClass C3が含まれる場合、C1 owl:equivalentClass C3が導出されます。この場合、次のようになります。

- C1 owl:equivalentClass C2: 距離 = 1(モデル内に存在するため)。

- C2 owl:equivalentClass C3: 距離 = 1(モデル内に存在するため)。

- C1 owl:equivalentClass C3: 距離 = 2(推論時に生成されるため)。

SEM_RELATED演算子は、ユーザー定義のルールベースとともに動作します。ただし、SEM_DISTANCE演算子とユーザー定義のルールベースの併用は、現時点ではサポートされないため、エラーが発生します。

2.3.3 MDSYS.SEM_INDEXTYPEタイプのセマンティク索引の作成

SEM_RELATED演算子を使用する場合、オントロジ用語を含む列に対してMDSYS.SEM_INDEXTYPEタイプのセマンティク索引を作成できます。この索引を作成することで、問合せをより効率的に実行できます。作成する索引のタイプを指定するため、CREATE INDEX文にINDEXTYPE IS MDSYS.SEM_INDEXTYPE句を含める必要があります。

例2-12では、Cancer_Ontologyオントロジを使用するPATIENTS表のDIAGNOSIS列に対してDIAGNOSIS_SEM_IDXというセマンティク索引を作成します。

例2-12 セマンティク索引の作成

CREATE INDEX diagnosis_sem_idx
ON patients (diagnosis)
INDEXTYPE IS MDSYS.SEM_INDEXTYPE;

索引を使用するには、索引の作成される列(例2-12ではDIAGNOSIS)がSEM_RELATED演算子の最初のパラメータである必要があります。最初のパラメータではない場合、その索引は問合せの実行時に使用されません。

特定のセマンティク問合せのパフォーマンスを向上するため、索引の作成時に1つ以上のモデルおよびルールベースを指定して、セマンティク索引用の統計情報を生成できます。例2-13では、指定したモデルおよびルールベースの統計情報も同時に生成する索引を作成します。この索引は、問合せ時に他のモデルやルールベースと組み合せて使用できますが、統計情報は、索引の作成時に指定したモデルおよびルールベースが問合せで指定したモデルおよびルールベースと同じ場合にのみ使用されます。

例2-13 モデルおよびルールベースを指定するセマンティク索引の作成

CREATE INDEX diagnosis_sem_idx
ON patients (diagnosis)
INDEXTYPE IS MDSYS.SEM_INDEXTYPE('ONTOLOGY_MODEL(medical_ontology),
RULEBASE(OWLPrime)');

統計情報は、セマンティク関係の距離でソートされた上位k個の結果を戻す問合せを実行する場合に便利です。例2-14に、このような問合せを示します。

例2-14 統計情報の生成が効果的な問合せ

SELECT /*+ FIRST_ROWS */ diagnosis FROM patients
WHERE SEM_RELATED (diagnosis,
'<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
'<http://www.example.org/medical_terms/Immune_System_Disorder>',
sem_models('medical_ontology'), sem_rulebases('owlprime'), 123) = 1
ORDER BY SEM_DISTANCE(123);

2.3.4 索引付けされた列が最初のパラメータではない場合のSEM_RELATEDおよびSEM_DISTANCEの使用

MDSYS.SEM_INDEXTYPEタイプの索引が、SEM_RELATED演算子の最初のパラメータに相当する表の列に対して作成されている場合、その索引は使用されます。たとえば、次の問合せでは、Immune_System_Disorderのサブクラス(rdfs:subClassOf)であるDIAGNOSIS列の値を含むすべての行が取得されます。

SELECT diagnosis FROM patients
WHERE SEM_RELATED (diagnosis,
'<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
'<http://www.example.org/medical_terms/Immune_System_Disorder>',
sem_models('medical_ontology'), sem_rulebases('owlprime')) = 1;

このとき、かわりにImmune_System_DisorderがサブクラスであるDIAGNOSIS列の値を含むすべての行を取得する必要があるとします。問合せを次のように書き換えます。

SELECT diagnosis FROM patients
WHERE SEM_RELATED
('<http://www.example.org/medical_terms/Immune_System_Disorder>',
'<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
diagnosis,
sem_models('medical_ontology'), sem_rulebases('owlprime')) = 1;

この場合、DIAGNOSIS列はSEM_RELATED演算子の最初のパラメータではないため、DIAGNOSIS列のセマンティク索引は使用されません。索引を使用するには、inverseOfキーワードを使用して前述の問合せを次のように変更します。

SELECT diagnosis FROM patients
WHERE SEM_RELATED (diagnosis,
'inverseOf(http://www.w3.org/2000/01/rdf-schema#subClassOf)',
'<http://www.example.org/medical_terms/Immune_System_Disorder>',
sem_models('medical_ontology'), sem_rulebases('owlprime')) = 1;

この形式により、(索引が作成されている)表の列がSEM_RELATED演算子の最初のパラメータとなり、Immune_System_DisorderがサブクラスであるDIAGNOSIS列の値を含むすべての行が取得されます。

2.3.5 値がURIとして格納されない場合のURIPREFIXの使用

デフォルトでは、セマンティク演算子のサポートは、表に格納される値がURIであることを前提とします。これらのURIでは、異なる名前空間を使用できます。ただし、表の値にURIが含まれない場合は、セマンティク索引の作成時にURIPREFIXキーワードを使用してURIを指定できます。この場合、指定したURIが表の値に接頭辞として追加され、索引構造に格納されます。(ただし、複数のURIは使用できません。)

例2-15では、URI接頭辞を使用するセマンティク索引を作成します。

例2-15 セマンティク索引作成時のURI接頭辞の指定

CREATE INDEX diagnosis_sem_idx
ON patients (diagnosis)
INDEXTYPE IS MDSYS.SEM_INDEXTYPE
PARAMETERS('URIPREFIX(<http://www.example.org/medical/>)');

URI接頭辞は解析なしで(索引構造の)表の値に追加されるため、URIの最後のスラッシュ(/)文字は重要です。

3 Simple Knowledge Organization System (SKOS)のサポート

Simple Knowledge Organization System (SKOS)データ・モデルのコア・サブセットに基づいて推論を実行できます(これは、シソーラス、分類スキーム、分類学、その他のタイプの統制ボキャブラリを表す場合に特に役立ちます)。SKOSは、RDFやOWLを含む標準のセマンティクWebテクノロジを基盤とし、これによって知識組織化システムの形式意味論の定義およびアプリケーション間でのセマンティク共有が容易になります。

SKOSの機能は、すべてではありませんが、そのほとんどがサポートされます(仕様の詳細は、http://www.w3.org/TR/skos-reference/を参照)。

Oracle Databaseセマンティク・テクノロジ・サポートには、約40個のSKOS固有の用語が含まれます(skos:broader、skos:relatedMatch、skos:Conceptなど)。100個を超えるSKOSの公理トリプルが追加され、SKOSセマンティクの基本が網羅されています。ただし、SKOS仕様に記述されている整合性条件に関するサポートは含まれません。

SKOSベースの推論を実行するには、次の例のように、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールでrulebases_inパラメータにシステム定義のSKOSCOREルールベースを指定します。

EXECUTE sem_apis.create_entailment('tstidx',sem_models('tst'), sem_rulebases('skoscore'));

例3-1では、Turtle形式で単純な電子機器スキームと2つの関連概念(カメラとデジタル・カメラ)を定義しています。その意味は簡単で、RDFで表現されています。これは、他のRDFおよびOWLデータと同様にOracle Databaseによって管理できます。

例3-1 電子機器スキームのSKOS定義

ex1:electronicsScheme rdf:type skos:ConceptScheme;

ex1:cameras rdf:type skos:Concept;
skos:prefLabel "cameras"@en;
skos:inScheme ex1:electronicsScheme.

ex1:digitalCameras rdf:type skos:Concept;
skos:prefLabel "digital cameras"@en;
skos:inScheme ex1:electronicsScheme.

ex1:digitalCameras skos:broader ex1:cameras.

3.1 サポート対象およびサポート対象外のSKOSセマンティク

この項では、SKOSセマンティクについて、Oracle Databaseでサポートされる機能とサポートされない機能について説明します。

3.1.1 サポートされるSKOSセマンティク

ラベル用にSKOSおよびSKOS拡張で定義されている用語は、すべて認識されます。SKOSCOREルールベースが推論に選択される場合、認識される用語は次のとおりです。

skos:altLabel
skos:broader
skos:broaderTransitive
skos:broadMatch
skos:changeNote
skos:closeMatch
skos:Collection
skos:Concept
skos:ConceptScheme
skos:definition
skos:editorialNote
skos:exactMatch
skos:example
skos:hasTopConcept
skos:hiddenLabel
skos:historyNote
skos:inScheme
skos:mappingRelation
skos:member
skos:memberList
skos:narrower
skos:narrowerTransitive
skos:narrowMatch
skos:notation
skos:note
skos:OrderedCollection
skos:prefLabel
skos:related
skos:relatedMatch
skos:scopeNote
skos:semanticRelation
skos:topConceptOf
skosxl:altLabel
skosxl:hiddenLabel
skosxl:Label
skosxl:labelRelation
skosxl:literalForm
skosxl:prefLabel

ほとんどのSKOS公理および定義がサポートされます(S1-S8、S10-S11、S15-S26、S28-S31、S33-S36、S38-S45、S47-S50およびS53-S54を含む)。(定義については、SKOSの詳細な仕様を参照してください。)

ほとんどのSKOS整合性条件がサポートされます(S9、S13、S27、S37およびS46を含む)。

S52は部分的にサポートされます。

S55、S56およびS57は、デフォルトではサポートされません。

- S55: プロパティ・チェーン(skosxl:prefLabel, skosxl:literalForm)は、skos:prefLabelのサブプロパティです。

- S56: プロパティ・チェーン(skosxl:altLabel, skosxl:literalForm)は、skos:altLabelのサブプロパティです。

- S57: プロパティ・チェーン(skosxl:hiddenLabel, skosxl:literalForm)は、skos:hiddenLabel.chainsのサブプロパティです。

ただし、S55、S56およびS57は、OWL 2サブプロパティ・チェーン構成要素を使用して実装できます。プロパティ・チェーンの処理の詳細は、3.2.2項を参照してください。

3.1.2 サポートされないSKOSセマンティク

SKOSセマンティクの次の機能はサポートされません。

- S12およびS51: 関連する述語のrdfs:rangeは、RDFプレーン・リテラルのクラスです。これらの述語の目的語値が実際にプレーン・リテラルかどうかはチェックされませんが、アプリケーションでそのようなチェックを実行できます。

- S14: リソースには、言語タグごとにskos:prefLabelの1つの値のみが含まれます。この整合性条件は、OWL FULLセマンティクの範囲外で、現在のリリースでは実施されません。

- S32: rdfs:range of skos:memberは、skos:Conceptクラスとskos:Collectionクラスの和集合です。この整合性条件は実施されません。

- S55、S56およびS57: デフォルトではサポートされませんが、OWL 2サブプロパティ・チェーン構成要素を使用して実装できます(3.1.1項を参照)。

3.2 SKOSモデルでの推論の実行

SKOSモデルを作成するには、セマンティク・モデルを作成する場合と同じプロシージャ(SEM_APIS.CREATE_SEM_MODEL)を使用します。セマンティク・モデルと同じ方法でSKOSモデルにデータをロードできます。

1つ以上のSKOSモデルの新しい関係を推論するには、SEM_APIS.CREATE_ENTAILMENTプロシージャをシステム定義のルールベースSKOSCOREとともに使用します。次に例を示します。

EXECUTE sem_apis.create_entailment('tstidx',sem_models('tst'), sem_rulebases('skoscore'));

推論データには、SKOSの詳細な仕様で定義されている多くの公理が含まれます。他のシステム定義のルールベースのように、SKOSCOREは明示的なルールを持たず、サポートされるすべてのセマンティクは、実装にコーディングされています。

3.2.1 SKOSモデルおよび伴意の検証

SEM_APIS.VALIDATE_ENTAILMENTおよびSEM_APIS.VALIDATE_MODELプロシージャを使用して、サポートされる整合性条件を検証できます。出力には、サポートされる整合性条件(OWL 2 propertyDisjointWithやS52など)によって発生する不整合が含まれます。

例3-2では、SKOS伴意を検証しています。

例3-2 SKOS伴意の検証

set serveroutput on
declare
lva mdsys.rdf_longVarcharArray;
idx int;
begin
lva := sem_apis.validate_entailment(sdo_rdf_models('tstskos'), sem_rulebases('skoscore'));
if (lva is null) then
dbms_output.put_line('No conflicts');
else
for idx in 1..lva.count loop
dbms_output.put_line('entry ' || idx || ' ' || lva(idx));
end loop;
end if;
end;
/

3.2.2 プロパティ・チェーンの処理

SKOS S55、S56およびS57セマンティクは、デフォルトではサポートされません。ただし、OWL 2サブプロパティ・チェーン構成要素を使用して、それらのサポートを追加できます。

例3-3では、S55の必要なチェーン定義トリプルをSKOSモデルに挿入しています。挿入後、SKOSCOREルールベースを指定するSEM_APIS.CREATE_ENTAILMENTの起動によって、S55で定義されるセマンティクが含まれます。

例3-3 S55を実装するためのプロパティ・チェーンの挿入

INSERT INTO tst VALUES(sdo_rdf_triple_s('tst','<http://www.w3.org/2004/02/skos/core#prefLabel>', '<http://www.w3.org/2002/07/owl#propertyChainAxiom>', '_:jA1'));
INSERT INTO tst VALUES(sdo_rdf_triple_s('tst','_:jA1', '<http://www.w3.org/1999/02/22-rdf-syntax-ns#first>', '<http://www.w3.org/2008/05/skos-xl#prefLabel>'));
INSERT INTO tst VALUES(sdo_rdf_triple_s('tst','_:jA1', '<http://www.w3.org/1999/02/22-rdf-syntax-ns#rest>', '_:jA2'));
INSERT INTO tst VALUES(sdo_rdf_triple_s('tst','_:jA2', '<http://www.w3.org/1999/02/22-rdf-syntax-ns#first>', '<http://www.w3.org/2008/05/skos-xl#literalForm>'));
INSERT INTO tst VALUES(sdo_rdf_triple_s('tst','_:jA2', '<http://www.w3.org/1999/02/22-rdf-syntax-ns#rest>', '<http://www.w3.org/1999/02/22-rdf-syntax-ns#nil>'));

4 ドキュメントのセマンティク索引付け

情報エクストラクタは、構造化されていないドキュメントから意味のある情報を検索して抽出します。この抽出された情報に基づいてドキュメントを検索する機能は、全文検索エンジンでサポートされるキーワード・ベースの検索より大幅に優れています。

ドキュメントのセマンティク索引付けによって、情報エクストラクタおよびアノテータを使用して、リレーショナル表に格納されているドキュメントにセマンティクに索引付けできる索引タイプが導入されます。セマンティクに索引付けされたドキュメントは、標準のSQL問合せ内でSEM_CONTAINS演算子を使用して検索できます。これらのドキュメントの検索条件は、次の例に示すとおり、ドキュメントから抽出された情報に基づいて機能するSPARQL問合せパターンを使用して表現されます。

SELECT docId
FROM   Newsfeed
WHERE  SEM_CONTAINS (article,
' { ?org    rdf:type            typ:Organization  .
?org    pred:hasCategory    cat:BusinessFinance } ', ..) = 1

Oracle Databaseのドキュメントのセマンティク索引付けを容易にする主要コンポーネントは、次のとおりです。

- 拡張可能な情報エクストラクタ・フレームワーク: サードパーティの情報エクストラクタをデータベースにプラグインできます。

- SEM_CONTAINS演算子: 標準のSQL問合せを使用して、抽出された情報に基づいて目的のドキュメントを識別します。

- SEM_CONTAINS_SELECT補助演算子: SEM_CONTAINS演算子を使用して識別されたドキュメントの関連情報を戻します。

- SemContext索引タイプ: 情報エクストラクタと対話して索引構造のドキュメント・セットから抽出された情報を管理し、ドキュメントに対するセマンティクに意味のある検索を容易にします。

ドキュメントに対して作成されたエクストラクタ・ポリシーおよびセマンティク索引を管理するためのアプリケーション・プログラミング・インタフェース(API)は、SEM_RDFCTX PL/SQLパッケージで提供されます。第12章に、SEM_RDFCTXパッケージのサブプログラムに関するリファレンス情報があります。

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

- 4.1項「ドキュメントのセマンティク索引付け用の情報エクストラクタ」

- 4.2項「エクストラクタ・ポリシー」

- 4.3項「ドキュメントのセマンティク索引付け」

- 4.4項「SEM_CONTAINSおよび補助演算子」

- 4.5項「SPARQL問合せパターンを使用したドキュメントの検索」

- 4.6項「ドキュメントの一致サブグラフでのSPARQL変数のバインディング(SEM_CONTAINS_SELECT補助演算子)」

- 4.7項「ドキュメント検索操作の品質の向上」

- 4.8項「外部ドキュメントの索引付け」

- 4.9項「Calaisエクストラクタ・タイプの構成」

- 4.10項「General Architecture for Text Engineering (GATE)の使用」

- 4.11項「新しいエクストラクタ・タイプの作成」

- 4.12項「レンジ・パーティション表でのローカル・セマンティク索引の作成」

- 4.13項「セマンティク索引の変更」

- 4.14項「CREATE INDEXおよびALTER INDEXでのエクストラクタ固有のパラメータの受渡し」

- 4.15項「ドキュメント中心の推論の実行」

- 4.16項「セマンティク索引付けのメタデータ・ビュー」

- 4.17項「GATEエクストラクタ出力のデフォルトのスタイル・シート」

4.1 ドキュメントのセマンティク索引付け用の情報エクストラクタ

情報エクストラクタは、通常、オントロジで支援された自然言語処理エンジンを使用して、構造化されていないドキュメントを処理し、そこから意味のある情報を抽出します。ドキュメントから抽出される情報の品質と完全性は、エクストラクタごとに異なります。一部のエクストラクタは単にエンティティを識別するのみですが(ドキュメントに基づく人、組織および地理的場所の名前など)、他のエクストラクタは識別したエンティティ間の関係やそれらのエンティティの追加記述の識別を試みます。ドキュメントから抽出された情報がセマンティク索引として管理されている場合、大規模なセットから特定のドキュメントを検索できます。

情報エクストラクタを使用して、リレーショナル表の列に格納されたドキュメントに対してセマンティク索引を作成できます。拡張可能なフレームワークによって、データベースからアクセス可能なサードパーティの情報エクストラクタをデータベースにプラグインできます。エクストラクタ用に作成されたオブジェクト型は、抽出ロジックをカプセル化し、エクストラクタを構成してRDF/XML形式の特定のドキュメントから抽出された情報を受信するメソッドを持ちます。

抽象タイプMDSYS.RDFCTX_EXTRACTORは、すべての情報エクストラクタに共通のインタフェースを定義します。この抽象タイプの実装は、特定の情報エクストラクタと対話して特定のドキュメントのRDF/XMLを生成します。このタイプの実装は、データベース・アプリケーションとして使用できるか、ネットワークにインストールされている(Webサービス・コールアウトを使用してアクセスされる)サードパーティの情報エクストラクタにアクセスできます。例4-1に、RDFCTX_EXTRACTOR抽象タイプの定義を示します。

例4-1 RDFCTX_EXTRACTOR抽象タイプの定義

create or replace type rdfctx_extractor authid current_user as object (
extr_type        VARCHAR2(32),
member function  getDescription return VARCHAR2,
member function  rdfReturnType return VARCHAR2,
member function  getContext(attribute VARCHAR2) return VARCHAR2,
member procedure startDriver,
member function  extractRDF(document CLOB,
docId    VARCHAR2) return CLOB,
member function  extractRdf(document CLOB,
docId    VARCHAR2,
params   VARCHAR2,
options  VARCHAR2 default NULL) return CLOB
member function  batchExtractRdf(docCursor        SYS_REFCURSOR,
extracted_info_table  VARCHAR2,
params                VARCHAR2,
partition_name        VARCHAR2 default NULL,
docId                 VARCHAR2 default NULL,
preferences           SYS.XMLType default NULL,
options               VARCHAR2 default NULL)
return CLOB,
member procedure closeDriver
) not instantiable not final
/

RDFCTX_EXTRACTORタイプの特定の実装は、extr_type属性にエクストラクタ・タイプの識別子を設定し、getDescriptionメソッドを使用してエクストラクタ・タイプの短い説明を戻します。この抽象タイプのすべての実装で、抽出された情報がRDFトリプルとして戻されます。現在のリリースでは、RDFトリプルはRDF/XML形式を使用してシリアライズされることが予定されているため、rdfReturnTypeメソッドは、'RDF/XML'を戻す必要があります。

エクストラクタ・タイプの実装は、通常、独自のインタフェースを使用して外部情報エクストラクタを起動することで抽出ロジックをカプセル化するextractRDFメソッドを使用し、抽出された情報をRDF/XML形式で戻します。抽出された情報を取得するためにサードパーティのエクストラクタが独自のXMLスキーマを使用する場合、XMLスタイル・シートを使用して同等のRDF/XMLを生成できます。startDriverメソッドとcloseDriverメソッドは、情報エクストラクタに関連するハウスキーピング操作を実行できます。オプションのparamsパラメータによって、エクストラクタは、必要な抽出のタイプに関する追加情報を取得できます(たとえば、要求される抽出品質など)。

エクストラクタ・タイプの実装では、オプションで、batchExtractRdfメンバー・ファンクションの実装を提供することでバッチ・インタフェースをサポートできます。このファンクションは、入力パラメータdocCursorを通じてカーソルを受け入れ、通常はそのカーソルを使用して各ドキュメントを取得し、ドキュメントから情報を抽出した後で、抽出した情報をextracted_info_table表のpartition_nameパーティションによって識別される指定されたパーティションに挿入します。preferencesパラメータは、ポリシーに関連付けられたプリファレンス値を取得するために使用されます(4.8項およびSEM_RDFCTX.CREATE_POLICYのリファレンスの項を参照)。

getContextメンバー・ファンクションは、属性名を受け入れ、その属性の値を戻します。現在、このファンクションは、バッチ・インタフェースをサポートするエクストラクタにのみ使用できます。属性名とそれに対応する可能な戻り値は次のとおりです。

- BATCH_SUPPORT属性に対する戻り値は、エクストラクタがバッチ・インタフェースをサポートするかどうかに応じて'YES'または'NO'です。

- DBUSER属性に対する戻り値は、(docCursorパラメータによって識別される)カーソルから行を取得するためにデータベースに接続し、表extracted_info_tableに書込みを行うデータベース・ユーザーの名前です。

この情報は、索引付けされる表および表extracted_info_tableに適切な権限を付与するために使用されます。

startDriverメソッドとcloseDriverメソッドは、情報エクストラクタに関連するハウスキーピング操作を実行できます。

General Architecture for Text Engineering (GATE)エンジンのエクストラクタ・タイプは、RDFCTX_EXTRACTORタイプのサブタイプとして定義されます。このエクストラクタ・タイプの実装は、TCP接続を介してGATEエンジンにドキュメントを送信し、エンジンによって抽出された注釈をXML形式で受信して、その独自のXMLドキュメントをRDF/XMLドキュメントに変換します。GATEエンジンを構成してOracle Databaseと連携させる方法の詳細は、4.10項を参照してください。新しい情報エクストラクタを作成する例は、4.11項を参照してください。

Webサービスとしてデプロイされた情報エクストラクタは、RDFCTX_EXTRACTORタイプのサブタイプであるRDFCTX_WS_EXTRACTORタイプを拡張することで、データベースから起動できます。RDFCTX_WS_EXTRACTORタイプは、extractRDFメソッドのWebサービス・コールアウトをカプセル化します(ネットワーク・ベース・エクストラクタの特定の実装によって、タイプ・コンストラクタに適切な属性値を設定することでその実装を再利用できます)。

Thomson Reuters Calaisは、Webサービス・コールアウトを使用してアクセスできるネットワーク・ベースの情報エクストラクタの一例です。RDFCTX_WS_EXTRACTORタイプのサブタイプであるCALAIS_EXTRACTORタイプは、Calais抽出ロジックをカプセル化し、それを使用してドキュメントにセマンティクに索引付けできます。CALAIS_EXTRACTORタイプは、それを使用してセマンティク索引を作成する前に、データベース・インスタンスに対して構成しておく必要があります(4.9項を参照)。

4.2 エクストラクタ・ポリシー

エクストラクタ・ポリシーは、ポリシーを使用して作成されたセマンティク索引の特性を決定する名前付きのディクショナリ・エンティティです。各エクストラクタ・ポリシーは、直接的または間接的にエクストラクタ・タイプのインスタンスを参照します。エクストラクタ・タイプのインスタンスを直接参照するエクストラクタ・ポリシーは、オントロジの追加のRDFモデルを含む他のエクストラクタ・ポリシーを構成するために使用できます。

次の例では、GATEエクストラクタ・タイプを使用して作成される基本エクストラクタ・ポリシーを作成しています。

begin
sem_rdfctx.create_policy (policy_name => 'SEM_EXTR',
extractor   => mdsys.gatenlp_extractor());
end;
/

次の例では、前述の例のポリシーによって抽出されたメタデータと、geo_ontologyというユーザー定義のRDFモデルを組み合せる依存エクストラクタ・ポリシーを作成しています。

begin
sem_rdfctx.create_policy (policy_name => 'SEM_EXTR_PLUS_GEOONT',
base_policy => 'SEM_EXTR',
user_models => SEM_MODELS ('geo_ontology'));
end;
/

エクストラクタ・ポリシーを使用して、構造化されていないドキュメントを格納する列に1つ以上のセマンティク索引を作成できます(4.3項を参照)。

4.3 ドキュメントのセマンティク索引付け

リレーショナル表のCLOBまたはVARCHAR2列に格納されたテキスト・ドキュメントは、セマンティクに意味のある検索を容易にするため、MDSYS.SEMCONTEXT索引タイプを使用して索引付けできます。索引の作成時に指定されたエクストラクタ・ポリシーによって、ドキュメントのセマンティク索引付けに使用される情報エクストラクタが決定されます。ドキュメントごとにRDFトリプルのセットとして取得された抽出情報は、セマンティク・データ・ストアで管理されます。セマンティク索引の各インスタンスは、対応するドキュメントから抽出されたRDFトリプルを保持するシステム生成のRDFモデルに関連付けられます。

次の例では、SEM_EXTRというエクストラクタ・ポリシーを使用して、NEWSFEED表のARTICLE列のテキスト・ドキュメントにArticleIndexというセマンティク索引を作成しています。

CREATE INDEX ArticleIndex on Newsfeed (article)
INDEXTYPE IS mdsys.SemContext PARAMETERS ('SEM_EXTR');

索引に対して作成されたRDFモデルは、内部的に管理され、アプリケーション表には関連付けられません。このようなモデルに格納されているトリプルは、表の列に格納されたドキュメントを変更(更新、挿入、削除など)するために自動的に管理されます。1つのRDFモデルを使用して、表の列に格納されたすべてのドキュメントが索引付けされますが、モデルに格納されたトリプルは、抽出元のドキュメントに対する参照を管理するため、特定のドキュメントから抽出されたすべてのトリプルによって、RDFモデル内の個々のグラフが構成されます。セマンティクに索引付けされたドキュメントは、ドキュメントから抽出されたトリプルを処理するSPARQL問合せパターンを使用して検索できます。

ドキュメントのセマンティク索引を作成する場合、1つ以上のユーザー定義のRDFモデルを含むことが可能な基本エクストラクタ・ポリシーまたは依存ポリシーを使用できます。依存エクストラクタ・ポリシーで索引を作成する場合、SPARQLを使用して指定されたドキュメント検索パターンは、ドキュメントから抽出されたトリプルとユーザー定義モデルで定義されたトリプルを対象とすることができます。

複数のエクストラクタ・ポリシーを使用して索引を作成できますが、その場合、対応するエクストラクタによって抽出されたトリプルは、別々のRDFモデルで個別に管理されます。このような索引を使用するドキュメント検索問合せでは、問合せへの応答に使用される特定のポリシーを選択できます。たとえば、CITY_EXTRというエクストラクタ・ポリシーを作成して特定のドキュメントから都市の名前を抽出できます(次の例のようにこのエクストラクタ・ポリシーをSEM_EXTRポリシーと組み合せて使用すると、セマンティク索引を作成できます)。

CREATE INDEX ArticleIndex on Newsfeed (article)
INDEXTYPE IS mdsys.SemContext PARAMETERS ('SEM_EXTR CITY_EXTR');

PARAMETERSリストの最初のエクストラクタ・ポリシーは、問合せが特定のポリシーを参照していない場合、デフォルト・ポリシーとみなされますが、次の例のようにSEM_RDFCTX.SET_DEFAULT_POLICYプロシージャを使用することでセマンティク索引のデフォルトのエクストラクタ・ポリシーを変更できます。

begin
sem_rdfctx.set_default_policy (index_name => 'ArticleIndex',
policy_name => 'CITY_EXTR');
end;
/

4.4 SEM_CONTAINSおよび補助演算子

標準のSQL文でSEM_CONTAINS演算子を使用して、リレーショナル表に格納されているドキュメントまたはドキュメント参照を検索できます。この演算子の構文は次のとおりです。

SEM_CONTAINS(
column   VARCHAR2 / CLOB,
sparql   VARCHAR2,
policy   VARCHAR2,
aliases  SEM_ALIASES,
index_status  NUMBER,
ancoper  NUMBER
) RETURN NUMBER;

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

column属性では、セマンティクに索引付けされているドキュメントまたはドキュメントへの参照を格納しているリレーショナル表のVARCHAR2またはCLOB列を指定します。SEM_CONTAINS演算子によって使用するには、タイプMDSYS.SEMCONTEXTの索引をこの列に定義する必要があります。

sparql属性は、SPARQL形式で表現されるドキュメント検索条件を定義する文字列リテラルです。

オプションのpolicy属性では、通常はデフォルト・ポリシーをオーバーライドするため、エクストラクタ・ポリシーの名前を指定します。セマンティク・ドキュメント索引は、索引の作成時に指定された1つ以上のエクストラクタ・ポリシーを持つことが可能で、これらのポリシーの1つが、SEM_CONTAINSのコールでpolicy属性がNULLの場合に使用されるデフォルトになります。

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

オプションのindex_status属性は、1つ以上の伴意を含む依存ポリシーがSEM_CONTAINSの起動で使用される場合にのみ関連します。index_statusの値で、伴意の最小限必要な有効性ステータスを指定します。可能な値は、0 (VALIDの場合で、デフォルト)、1 (INCOMPLETEの場合)および2 (INVALIDの場合)です。

オプションのancoper属性では、問合せでSEM_CONTAINS_SELECT補助演算子をこの演算子とともに使用する場合に使用されるバインディングとしての数値を指定します。ancoper属性に指定する数値は、SEM_CONTAINS_SELECT補助演算子のoperbind属性に指定された数値と同じである必要があります。

SEM_CONTAINS演算子は、指定した検索条件に一致するドキュメント・インスタンスごとに1を戻し、他のすべての場合は0を戻します。

SEM_CONTAINS演算子の使用方法の詳細とその例は、4.5項を参照してください。

4.4.1 SEM_CONTAINS_SELECT補助演算子

SEM_CONTAINS_SELECT補助演算子を使用すると、いくつかの検索条件に一致する各ドキュメントの追加情報を戻すことができます。この補助演算子には、バインディングに同じ値を使用してSEM_CONTAINS_SELECT補助演算子のインスタンスとSEM_CONTAINS演算子を関連付ける単一の数値属性(operbind)が含まれます。この補助演算子は、一致ドキュメントから追加情報を含むCLOB型のオブジェクトをSPARQL Query Results XML形式で書式設定した状態で戻します。

SEM_CONTAINS_SELECT補助演算子の構文は次のとおりです。

SEM_CONTAINS_SELECT(
operbind  NUMBER
) RETURN CLOB;

SEM_CONTAINS_SELECT補助演算子の使用方法の詳細とその例は、4.6項を参照してください。

4.4.2 SEM_CONTAINS_COUNT補助演算子

SEM_CONTAINS演算子の起動にSEM_CONTAINS_COUNT補助演算子を使用できます。一致したドキュメントごとに、SEM_CONTAINSの起動で指定されたSPARQLグラフ・パターンの一致サブグラフの数が戻されます。

SEM_CONTAINS_COUNT補助演算子の構文は次のとおりです。

SEM_CONTAINS_COUNT(
operbind  NUMBER
) RETURN NUMBER;

次の抜粋例は、SEM_CONTAINS_COUNT補助演算子を使用して、一致したドキュメントごとに一致サブグラフの数を戻す方法を示しています。

SELECT docId, SEM_CONTAINS_COUNT(1) as matching_subgraph_count
FROM   Newsfeed
WHERE  SEM_CONTAINS (article,
'{ ?org   rdf:type          class:Organization  .
?org   pred:hasCategory  cat:BusinessFinance }', ..,
1)= 1;

4.5 SPARQL問合せパターンを使用したドキュメントの検索

セマンティクに索引付けされたドキュメント(mdsys.SemContext索引タイプを使用して索引付けされたドキュメント)は、標準のSQL問合せ内でSEM_CONTAINS演算子を使用して検索できます。問合せで、SEM_CONTAINS演算子は2つ以上のパラメータを持つ必要があります(次の例のように、最初のパラメータはドキュメントが格納される列を指定するもので、2番目のパラメータはSPARQL問合せパターンとして表現されるドキュメント検索条件を指定するものです)。

SELECT docId FROM Newsfeed
WHERE  SEM_CONTAINS (article,
'{ ?org  rdf:type  <http://www.example.com/classes/Organization>  .
?org  <http://example.com/pred/hasCategory>
<http://www.example.com/category/BusinessFinance> }'
)= 1;

SEM_CONTAINS演算子で指定されたSPARQL問合せパターンは、各ドキュメントに対応する個々のグラフに対して照合され、ドキュメントは、対応するグラフのトリプルが問合せパターンを満足させる場合に検索条件に一致するものとみなされます。前述の例で、SPARQL問合せパターンは、BusinessFinanceカテゴリに属するOrganizationを参照する個々のグラフ(ドキュメント)を識別します。SQL問合せによって、一致ドキュメントに対応する行が結果セットで戻されます。前述の例では、問合せで使用されるURIが基礎となるエクストラクタによって生成され、ドキュメントを検索するユーザーが使用中のエクストラクタによって生成されたプロパティと用語を認識していることが前提です。

1つ以上のユーザー定義のRDFモデルを含む依存エクストラクタ・ポリシーを使用して索引を作成する場合、ユーザー・モデルで表明されたトリプルは、すべてのドキュメントに共通とみなされます。このようなポリシーを含むドキュメント検索では、ユーザー・モデルのトリプルに結合された、ドキュメントに対応する個々のグラフのトリプルに対して検索条件がテストされます。たとえば、次の問合せでは、都市を州にマップする地理オントロジ(前述の例のgeo_ontology RDFモデル)を使用して、ニューハンプシャー州の組織に言及しているすべての記事が識別されます。

SELECT docId FROM   Newsfeed
WHERE  SEM_CONTAINS (article,
'{ ?org     rdf:type          class:Organization  .
?org     pred:hasLocation  ?city .
?city    geo:hasState      state:NewHampshire }',
'SEM_EXTR_PLUS_GEOONT',
sem_aliases(
sem_alias('class', 'http://www.myorg.com/classes/'),
sem_alias('pred', 'http://www.myorg.com/pred/'),
sem_alias('geo', 'http://geoont.org/rel/'),
sem_alias('state', 'http://geoont.org/state/'))) = 1;

前述の問合せは、(4.2項の例で作成された)エクストラクタ・ポリシーのSEM_EXTR_PLUS_GEOONTに対する参照を使用して、索引付きドキュメントから抽出されたトリプルと、ユーザー・モデルのトリプルを結合して一致ドキュメントを検索します。この例で、エクストラクタ・ポリシーの名前は、対応する索引がこのポリシーで作成されている場合、またはこれが索引のデフォルトのエクストラクタ・ポリシーの場合はオプションです。問合せパターンで修飾名を使用する場合、SEM_CONTAINS演算子のオプション・パラメータでは、修飾名を拡張するために使用する名前空間を指定できます。

SPARQLベースのドキュメント検索では、SEM_MATCH問合せを通じてサポートされるSPARQL構文を使用できます。

4.6 ドキュメントの一致サブグラフでのSPARQL変数のバインディング(SEM_CONTAINS_SELECT補助演算子)

SEM_CONTAINS_SELECT補助演算子を使用すると、SEM_CONTAINS演算子を使用して照合された各ドキュメントの追加情報を戻すことができます。具体的には、この演算子を使用して、SPARQLベースのドキュメント検索条件で使用される変数のバインディングを戻すことができます。この演算子は、SEM_CONTAINS演算子を補助するもので、次の例のように、この演算子の引数としてリテラル数値が使用され、SEM_CONTAINS演算子の特定のインスタンスに関連付けられます。

SELECT docId, SEM_CONTAINS_SELECT(1) as result
FROM   Newsfeed
WHERE  SEM_CONTAINS (article,
'{ ?org   rdf:type          class:Organization  .
?org   pred:hasCategory  cat:BusinessFinance }', ..,
1)= 1;

SEM_CONTAINS_SELECT補助演算子によって、CLOBデータとしてSPARQL Query Results XML形式で変数のバインディングが戻されます。変数は、単一のドキュメントから複数のデータ・インスタンスにバインドされることがあり、その場合は変数のすべてのバインディングが戻されます。次の例は、前述の問合せの出力からの抜粋です(指定した検索条件に一致するドキュメントに対してSEM_CONTAINS_SELECT補助演算子によって戻された値)。

<results>
<result>
<binding name="ORG">
<uri>http://newscorp.com/Org/AcmeCorp</uri>
</binding>
</result>
<result>
<binding name="ORG">
<uri>http://newscorp.com/Org/ABCCorp</uri>
</binding>
</result>
</results>

SEM_CONTAINS_SELECT補助演算子によって戻されるCLOB値に対してXMLTypeのインスタンスを作成し、属性値に基づいて結果をソートするXPath式を適用することで、検索結果をランク付けできます。

デフォルトでは、SEM_CONTAINS_SELECT補助演算子によって、SPARQLベースのドキュメント検索条件で使用されているすべての変数のバインディングが戻されます。ただし、変数のサブセットのみの値が検索に適切な場合、次の例のように、値を戻す必要のある変数の空白区切りのリストを持つSELECT句をSPARQLパターンに含めることができます。

SELECT docId, SEM_CONTAINS_SELECT(1) as result
FROM   Newsfeed
WHERE  SEM_CONTAINS (article,
'SELECT ?org  ?city
WHERE { ?org     rdf:type          class:Organization  .
?org     pred:hasLocation  ?city .
?city    geo:hasState      state:NewHampshire }', ..,
1) = 1;

4.7 ドキュメント検索操作の品質の向上

ドキュメント検索操作の品質は、ドキュメントの索引付けに使用されるエクストラクタによって生成される情報の品質に応じて変化します。抽出される情報が不完全の場合、ドキュメントに注釈を追加できます。次の例に示すとおり、検索の品質を向上するため、SEM_RDFCTX.MAINTAIN_TRIPLESプロシージャを使用してRDFトリプルの形式で特定のドキュメントに注釈を追加できます。

begin
sem_rdfctx.maintain_triples(
index_name      => 'ArticleIndex',
where_clause    => 'docid in (1,15,20)',
rdfxml_content => sys.xmltype(
'<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:pred="http://example.com/pred/">
<rdf:Description rdf:about=" http://newscorp.com/Org/ExampleCorp">
<pred:hasShortName
rdf:datatype="http://www.w3.org/2001/XMLSchema#string">
Example
</pred:hasShortName>
</rdf:Description>
</rdf:RDF>'));
end;
/

前述の例に指定されている索引名とWHERE句によって、注釈が指定されたドキュメントの特定のインスタンスが識別され、渡されたRDF/XMLコンテンツが使用されて、それらのドキュメントに対応する個々のグラフに他のトリプルが追加されます。これによって、ドメイン・エキスパートとユーザー・コミュニティは、関連するトリプルを追加して一部のドキュメントに注釈を指定することで、検索の品質を向上できます。

4.8 外部ドキュメントの索引付け

ファイル・システムまたはネットワークに格納されているドキュメントに対してセマンティク索引付けを使用できます。この場合、表の列に外部ドキュメントへの参照を格納し、適切なエクストラクタ・ポリシーを使用してその列にセマンティク索引を作成します。

外部ドキュメントに索引を付けるには、次の例のように、SEM_RDFCTX.CREATE_POLICYプロシージャのpreferencesパラメータに割り当てられたXMLドキュメントを使用して、適切なプリファレンスによってエクストラクタ・ポリシーを定義します。

begin
sem_rdfctx.create_policy (
policy_name => 'SEM_EXTR_FROM_FILE',
extractor   => mdsys.gatenlp_extractor()),
preferences => sys.xmltype('<RDFCTXPreferences>
<Datastore type="FILE">
<Path>EXTFILES_DIR</Path>
</Datastore>
</RDFCTXPreferences>'));
end;
/

プリファンレス・ドキュメントの<Datastore>要素によって、索引付けするドキュメントで使用するリポジトリのタイプを指定します。type属性の値がFILEに設定されている場合、<Path>要素によって、(SQL文のCREATE DIRECTORYを使用して作成された)データベースのディレクトリ・オブジェクトが識別されます。指定したエクストラクタ・ポリシーを使用して索引付けされた表の列は、次の例に示すとおり、ディレクトリ・オブジェクト内の個々のファイルに対する相対パスを含むことになります。

CREATE TABLE newsfeed (docid       number,
articleLoc  VARCHAR2(100));
INSERT INTO into newsfeed (docid, articleLoc) values
(1, 'article1.txt');
INSERT INTO newsfeed (docid, articleLoc) values
(2, 'folder/article2.txt');

CREATE INDEX ArticleIndex on newsfeed (articleLoc)
INDEXTYPE IS mdsys.SemContext PARAMETERS ('SEM_EXTR_FROM_FILE');

HTTPプロトコルを使用してアクセスされるドキュメントに索引を付けるには、次の抜粋に示すとおり、<Datastore>要素のtype属性にURLを設定し、<Path>要素に1つ以上のホストをリストしたプリファレンスを含むエクストラクタ・ポリシーを作成します。

<RDFCTXPreferences>
<Datastore type="URL">
<Path>http://cnn.com</Path>
<Path>http://abc.com</Path>
</Datastore>
</RDFCTXPreferences>

外部ドキュメントのセマンティク索引が作成されるスキーマは、次の例に示すとおり、外部オブジェクトへのアクセスに必要な権限(ファイアウォール外部のドキュメントにアクセスするために使用されるプロキシ・サーバーへのアクセス権限など)を持っている必要があります。

-- Grant read access to the directory object for FILE data store --
grant read on directory EXTFILES_DIR to SEMUSR;

-- Grant connect access to set of hosts for URL data store --
begin
dbms_network_acl_admin.create_acl (
acl          => 'network_docs.xml',
description  => 'Normal Access',
principal    => 'SEMUSR',
is_grant     => TRUE,
privilege    => 'connect');
end;
/

begin
dbms_network_acl_admin.assign_acl (
acl        => 'network_docs.xml',
host       =>  'cnn.com',
lower_port => 1,
upper_port => 10000);
end;
/

データベースでセマンティクに索引付けされた外部ドキュメントは、Microsoft Word、RTF、PDFなどの一般的な形式のいずれかである場合があります。この場合、Oracle Text機能を利用して、書式設定されたドキュメントからフィルタを通じてプレーン・テキスト・バージョンを抽出します(『Oracle Textリファレンス』でCTX_DOC.POLICY_FILTERプロシージャを参照してください)。書式設定されたドキュメントにセマンティクに索引を付けるには、次の抜粋に示すとおり、エクストラクタ・プリファレンスにCTXポリシーの名前を指定する必要があります。

<RDFCTXPreferences>
<Datastore type="FILE" filter="CTX_FILTER_POLICY">
<Path>EXTFILES_DIR</Path>
</Datastore>
</RDFCTXPreferences>

前述の例で、CTX_DDL.CREATE_POLICYプロシージャを使用して作成されたCTX_FILTER_POLICYポリシーは、スキーマ内に存在する必要があります。このプリファレンス・ドキュメントを使用してセマンティクに索引付けされた表の列には、指定したCTXポリシーを使用してプレーン・テキストが抽出される、書式設定されたドキュメントへのパスを格納できます。エクストラクタ・ポリシーに関連付けられた情報エクストラクタは、その後、RDF/XML形式でセマンティクを抽出するためにプレーン・テキストをさらに処理します。

4.9 Calaisエクストラクタ・タイプの構成

RDFCTX_WS_EXTRACTORタイプのサブタイプであるCALAIS_EXTRACTORタイプによって、ネットワーク上の任意の場所にあるWebサービス・エンド・ポイントにアクセスできます(パブリックにアクセス可能な場所(OpenCalais.com)を含む)。これを行うには、SYSDBA権限で接続し、次の例に示すとおり、対応するパラメータを設定してWebサービス・エンド・ポイント、SOAPアクションおよびライセンス・キーでCalaisエクストラクタ・タイプを構成する必要があります。

begin
sem_rdfctx.set_extractor_param (
param_key   => 'CALAIS_WS_ENDPOINT',
param_value => 'http://api1.opencalais.com/enlighten/calais.asmx',
param_desc  => 'Calais web service end-point');

sem_rdfctx.set_extractor_param (
param_key   => 'CALAIS_KEY',
param_value => '<Calais license key goes here>',
param_desc  => 'Calais extractor license key');

sem_rdfctx.set_extractor_param (
param_key   => 'CALAIS_WS_SOAPACTION',
param_value => 'http://clearforest.com/Enlighten',
param_desc  => 'Calais web service SOAP Action');
end;

ファイアウォール外部のWebサービスへのアクセスを可能にするには、次の例のようにプロキシ・ホストのパラメータも設定する必要があります。

begin
sem_rdfctx.set_extractor_param (
param_key   => 'HTTP_PROXY',
param_value => 'www-proxy.acme.com',
param_desc  => 'Proxy server');
end;

4.10 General Architecture for Text Engineering (GATE)の使用

General Architecture for Text Engineering (GATE)は、オープン・ソースの自然言語プロセッサおよび情報エクストラクタです(http://gate.ac.ukを参照)。GATEを使用して、データベースに格納されているドキュメントのセマンティク索引付けを実行できます。エクストラクタ・タイプmdsys.gatenlp_extractorは、RDFCTX_EXTRACTORタイプのサブタイプとして定義されます。このエクストラクタ・タイプの実装によって、構造化されていないドキュメントをTCP接続を通じてGATEエンジンに送信し、対応する注釈を受信して、それらをユーザー指定のXMLスタイル・シートに従ってRDFに変換します。

情報抽出のリクエストは、GATEコンポーネントをインスタンス化し、事前決定済のポートで抽出リクエストをリスニングするサーバー・ソケット実装によって処理されます。GATEリスナーのホストとポートは、次の例に示すとおり、使用するmdsys.gatenlp_extractorタイプのすべてのインスタンスに対してデータベースに記録されます。

begin
sem_rdfctx.set_extractor_param (
param_key   => 'GATE_NLP_HOST',
param_value => 'gateserver.acme.com',
param_desc  => 'Host for GATE NLP Listener ');

sem_rdfctx.set_extractor_param (
param_key   => 'GATE_NLP_PORT',
param_value => '7687',
param_desc  => 'Port for Gate NLP Listener');
end;

サーバー・ソケット・アプリケーションは、構造化されていないドキュメントを受信し、目的のタイプの注釈を含む注釈セットを構成します。セット内の各注釈は、入力ドキュメントからの関連フレーズやドメイン固有の機能などの追加機能を含むようにカスタマイズできます。結果となる注釈セットは、(gate.corpora.DocumentXmlUtils JavaパッケージのannotationSetToXmlメソッドを使用して) XMLにシリアライズされ、ソケット・クライアントに戻されます。

GATEリスナーのサンプルのJava実装は、OTNのコード・サンプルおよび使用例のページからダウンロードできます(このページの詳細は、1.11項「セマンティク・データの例(PL/SQLとJava)」を参照してください)。

データベースのmdsys.gatenlp_extractor実装は、XMLでエンコードされた注釈セットを受信し、それをXMLスタイル・シートを使用してRDF/XMLに変換します。mdsys.gatenlp_extractor実装で使用されるデフォルト・スタイル・シート(4.17項を参照)は、タイプをインスタンス化する際にカスタム・スタイル・シートに置換できます。

次の例では、カスタム・スタイル・シートを使用するエクストラクタ・ポリシーを作成して、GATEエクストラクタによって生成された注釈セットからRDFを生成しています。

begin
sem_rdfctx.create_policy (policy_name => 'GATE_EXTR',
extractor   => mdsys.gatenlp_extractor(
sys.XMLType('<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
..
</xsl:stylesheet>')));
end;
/

4.11 新しいエクストラクタ・タイプの作成

RDFCTX_EXTRACTORまたはRDFCTX_WS_EXTRACTORエクストラクタ・タイプを拡張して新しいエクストラクタ・タイプを作成できます。拡張されるエクストラクタ・タイプには、Webサービス・コールを使用してアクセスできる必要があります。新しいエクストラクタ・タイプが作成されるスキーマには、サブタイプを作成できるように追加の権限を付与する必要があります。たとえば、新しいエクストラクタ・タイプがスキーマRDFCTXUに作成される場合、次のコマンドを入力してそのスキーマにUNDERおよびRDFCTX_ADMIN権限を付与する必要があります。

GRANT under ON mdsys.rdfctx_extractor TO rdfctxu;
GRANT rdfctx_admin TO rdfctxu;

たとえば、情報エクストラクタで受信ドキュメントを処理し、抽出された情報を含むXMLドキュメントを戻すことができると仮定します。PL/SQLラッパーを使用して情報エクストラクタを起動できるようにするには、次の例のように、対応するエクストラクタ・タイプの実装を作成します。

create or replace type rdfctxu.info_extractor under rdfctx_extractor (
xsl_trans   sys.XMLtype,
constructor function info_extractor (
xsl_trans  sys.XMLType ) return self as result,
overriding member function getDescription return VARCHAR2,
overriding member function rdfReturnType return VARCHAR2,
overriding member function extractRDF(document CLOB,
docId    VARCHAR2) return CLOB
)
/

create or replace type body rdfctxu.info_extractor as
constructor function info_extractor (
xsl_trans  sys.XMLType ) return self as result is
begin
self.extr_type := 'Info Extractor Inc.';
-- XML style sheet to generate RDF/XML from proprietary XML documents
self.xsl_trans := xsl_trans;
return;
end info_extractor;

overriding member function getDescription return VARCHAR2 is
begin
return 'Extactor by Info Extractor Inc.';
end getDescription;

overriding member function rdfReturnType return VARCHAR2 is
begin
return 'RDF/XML';
end rdfReturnType;

overriding member function extractRDF(document CLOB,
docId    VARCHAR2) return CLOB is
ce_xmlt  sys.xmltype;
begin
EXECUTE IMMEDIATE
'begin :1 = info_extract_xml(doc => :2); end;'
USING IN OUT ce_xmlt, IN document;

-- Now pass the ce_xmlt through RDF/XML transformation --
return ce_xmlt.transform(self.xsl_trans).getClobVal();
end extractRdf;

end;

前述の例の説明:

- 作成されたinfo_extractorエクストラクタ・タイプの実装は、基礎となる情報エクストラクタで使用される独自のXMLスキーマからRDF/XMLを生成するため、コンストラクタに設定されたXMLスタイル・シートに依存します。

- extractRDFファンクションでは、info_extract_xmlファンクションが目的の情報エクストラクタと通信し、渡されたドキュメントから抽出された情報を含むXMLドキュメントが戻されることが前提となります。

- XMLスタイル・シートがXMLドキュメントに適用され、同等のRDF/XMLが生成されます(これはextractRDFファンクションから戻されます)。

4.12 レンジ・パーティション表でのローカル・セマンティク索引の作成

次の構文を使用して、レンジ・パーティション表のVARCHAR2またはCLOB列にローカル索引を作成できます。

CREATE INDEX <index-name> … LOCAL;

次の例では、レンジ・パーティション表とその表に対するローカル・セマンティク索引を作成しています。

CREATE TABLE part_newsfeed (
docid number, article CLOB, cdate DATE)
partition by range (cdate)
(partition p1 values less than (to_date('01-Jan-2001')),
partition p2 values less than (to_date('01-Jan-2004')),
partition p3 values less than (to_date('01-Jan-2008')),
partition p4 values less than (to_date('01-Jan-2012'))
);

CREATE INDEX ArticleLocalIndex on part_newsfeed (article)
INDEXTYPE IS mdsys.SemContext PARAMETERS ('SEM_EXTR')
LOCAL;

ローカル・セマンティク索引のすべてのパーティションに、同じポリシー・セットに対して生成された内容が含まれることに注意してください。ローカル索引にALTER INDEX文を使用して、セマンティク索引パーティションに関連付けられたポリシーを追加または削除する場合、各パーティションに関連付けられた同じポリシー・セットを維持する必要があります。この結果を得るには、パーティションのセットを反復するループでALTER INDEX文を使用します。(セマンティク索引の変更の詳細は、4.13項を参照してください。)

4.13 セマンティク索引の変更

この項では、セマンティク索引でのALTER INDEX文の使用について説明します。ローカル・セマンティク索引では、ALTER INDEX文は指定したパーティションに適用されます。セマンティク索引のALTER INDEXコマンドの一般的な構文は、次のとおりです。

ALTER INDEX <index-name> REBUILD [PARTITION <index-partition-name>]
[PARAMETERS ('-<action_for_policy> <policy-name>')];

4.13.1 セマンティク索引におけるすべての既存ポリシーの内容の再構築

PARAMETERS句がALTER INDEX文に含まれない場合、セマンティク索引(または索引パーティション)の内容は、索引に現在関連付けられているすべてのポリシーに対して再構築されます。次に2つの例を示します。

ALTER INDEX ArticleIndex REBUILD;
ALTER INDEX ArticleLocalIndex REBUILD PARTITION p1;

4.13.2 セマンティク索引に新しいポリシーの内容を追加するための再構築

<action_for_policy>でadd_policyを使用して、セマンティク索引(または索引パーティション)に新しいベース・ポリシーまたは依存ポリシーの内容を追加できます。依存ポリシーが追加される場合や、そのベース・ポリシーがすでに索引の一部ではない場合、ベース・ポリシーの内容も(ベース・ポリシー定義の一部として指定されたエクストラクタを起動することで)暗黙的に追加されます。次に例を示します。

ALTER INDEX ArticleIndex REBUILD PARAMETERS ('-add_policy MY_POLICY');

4.13.3 セマンティク索引からの既存ポリシーの内容の再構築

<action_for_policy>でrebuild_policyを使用して、索引に現在関連付けられている既存ポリシーのセマンティク索引(または索引パーティション)の内容を再構築できます。次に例を示します。

ALTER INDEX ArticleIndex REBUILD PARAMETERS ('-rebuild_policy MY_POLICY');

4.13.4 セマンティク索引から既存ポリシーの内容を削除するための再構築

<action_for_policy>でdrop_policyを使用して、セマンティク索引(または索引パーティション)から既存のベース・ポリシーまたは依存ポリシーに対応する内容を削除できます。ベース・ポリシーの内容の削除は、それが索引(または索引パーティション)の唯一のポリシーである場合、またはそれが索引(または索引パーティション)に関連付けられた依存ポリシーによって使用されている場合、失敗することに注意してください。

次の例では、索引からポリシーの内容を削除しています。

ALTER INDEX ArticleIndex REBUILD PARAMETERS ('-drop_policy MY_POLICY');

4.14 CREATE INDEXおよびALTER INDEXでのエクストラクタ固有のパラメータの受渡し

CREATE INDEX文とALTER INDEX文では、エクストラクタに必要なパラメータの受渡しが可能です。これらのパラメータは、extractRdfメソッドとbatchExtractRdfメソッドのparamsパラメータを使用してエクストラクタに渡されます。次の2つの例にその使用方法を示します。

CREATE INDEX ArticleIndex on Newsfeed (article)
INDEXTYPE IS mdsys.SemContext PARAMETERS ('SEM_EXTR=(NE_ONLY)');

ALTER INDEX ArticleIndex REBUILD
PARAMETERS ('-add_policy MY_POLICY=(NE_ONLY)');

4.15 ドキュメント中心の推論の実行

ドキュメント中心の推論とは、各ドキュメントから個別に推論する機能です。異なる2つのドキュメントから抽出されたトリプルは、まとめて推論用に使用できません。これとは対照的に、より一般的なコーパス中心の推論では、複数のドキュメントから抽出されたトリプルの組合せから新しいトリプルを推論できます。

検索結果にドキュメントが含まれることは、そのドキュメントのみを対象に抽出または推論された(あるいはその両方が行われた)トリプルに基づくため(コーパスの他のドキュメントから抽出または推論された(あるいはその両方が行われた)トリプルは、そのドキュメントの選択に何の役割も果たさないため)、ドキュメント中心の推論はドキュメント検索アプリケーションに適しています。(たとえば、データの信頼性またはドキュメント作成者のバイアスに違いがあるためにドキュメント間に一貫性がない場合、ドキュメント中心の推論が推奨されることがあります。)

ドキュメント中心の推論を実行するには、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールでoptions => 'LOCAL_NG_INF=T'を指定して、名前付きグラフ・ベースのローカル推論(2.2.11.2項を参照)を使用します。

ドキュメント中心の推論を通じて作成された伴意をセマンティク索引の内容として含めるには、例4-2に示すとおり、依存ポリシーを作成してそのポリシーをセマンティク索引に追加します。

例4-2 ドキュメント中心の推論の使用

-- Create entailment 'extr_data_inf' using document-centric inference
-- assuming:
--   model_name for semantic index based on base policy: 'RDFCTX_MOD_1'
--    (model name is available from the RDFCTX_INDEX_POLICIES view;
--     see Section 4.16.2, "RDFCTX_INDEX_POLICIES View")
--   ontology: dataOntology
--   rulebase: OWL2RL
-- options: 'LOCAL_NG_INF=T' (for document-centric inference)
BEGIN
sem_apis.create_entailment('extr_data_inf',
models_in    => sem_models('RDFCTX_MOD_1', 'dataOntology'),
rulebases_in => sem_rulebases('OWL2RL'),
options      => 'LOCAL_NG_INF=T');
END;
/
-- Create a dependent policy to augment data extracted using base policy
-- with content of entailment extr_data_inf (computed in previous statement)
BEGIN
sem_rdfctx.create_policy (
policy_name => 'SEM_EXTR_PLUS_DATA_INF',
base_policy => 'SEM_EXTR',
user_models => NULL,
user_entailments => sem_models('extr_data_inf'));
END;
/
-- Add the dependent policy to the ARTICLEINDEX index.
EXECUTE sem_rdfctx.add_dependent_policy('ARTICLEINDEX','SEM_EXTR_PLUS_DATA_INF');

4.16 セマンティク索引付けのメタデータ・ビュー

この項では、セマンティク索引付けのメタデータを含むビューについて説明します。

4.16.1 MDSYS.RDFCTX_POLICIESビュー

現在のスキーマに定義されたエクストラクタ・ポリシーに関する情報は、MDSYS.RDFCTX_POLICIESビューに保持されます(表4-1に、このビューの列を示します(1つの行が1つのエクストラクタ・ポリシーに対応します))。

表4-1 MDSYS.RDFCTX_POLICIESビューの列

列名

データ型

説明

POLICY_OWNER

VARCHAR2(32)

エクストラクタ・ポリシーの所有者

POLICY_NAME

VARCHAR2(32)

エクストラクタ・ポリシーの名前

EXTRACTOR

MDSYS.RDFCTX_EXTRACTOR

エクストラクタ・タイプのインスタンス

IS_DEPENDENT

VARCHAR2(3)

エクストラクタ・ポリシーがベース・ポリシーに依存する場合はYESを含み、エクストラクタ・ポリシーがベース・ポリシーに依存しない場合はNOを含みます。

BASE_POLICY

VARCHAR2(32)

依存ポリシーの場合、ベース・ポリシーの名前

USER_MODELS

MDSYS.RDF_MODELS

依存ポリシーの場合、そのポリシーに含まれるRDFモデルのリスト

4.16.2 RDFCTX_INDEX_POLICIESビュー

現在のスキーマに定義されたセマンティク索引と、その索引の作成に使用されるエクストラクタ・ポリシーに関する情報は、MDSYS.RDFCTX_POLICIESビューに保持されます(表4-2に、このビューの列を示します(1つの行がセマンティク索引とエクストラクタ・ポリシーの1つの組合せに対応します))。

表4-2 MDSYS.RDFCTX_INDEX_POLICIESビューの列

列名

データ型

説明

INDEX_OWNER

VARCHAR2(32)

セマンティク索引の所有者

INDEX_NAME

VARCHAR2(32)

セマンティク索引の名前

INDEX_PARTITION

VARCHAR2(32)

索引パーティションの名前(LOCAL索引のみ)

POLICY_NAME

VARCHAR2(32)

エクストラクタ・ポリシーの名前

EXTR_PARAMETERS

VARCHAR2(100)

エクストラクタに指定されたパラメータ

IS_DEFAULT

VARCHAR2(3)

POLICY_NAMEが索引のデフォルトのエクストラクタ・ポリシーである場合はYESを含み、POLICY_NAMEが索引のデフォルトのエクストラクタ・ポリシーではない場合はNOを含みます。

STATUS

VARCHAR2(10)

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

RDF_MODEL

VARCHAR2(32)

索引データを保持するRDFモデルの名前

4.16.3 RDFCTX_INDEX_EXCEPTIONSビュー

現在のスキーマでセマンティク索引を作成または保持する際に発生した例外に関する情報は、MDSYS.RDFCTX_INDEX_EXCEPTIONSビューに保持されます(表4-3に、このビューの列を示します(1つの行が1つの例外に対応します))。

表4-3 MDSYS.RDFCTX_INDEX_EXCEPTIONSビューの列

列名

データ型

説明

INDEX_OWNER

VARCHAR2(32)

例外に関連付けられたセマンティク索引の所有者

INDEX_NAME

VARCHAR2(32)

例外に関連付けられたセマンティク索引の名前

POLICY_NAME

VARCHAR2(32)

例外に関連付けられたエクストラクタ・ポリシーの名前

DOC_IDENTIFIER

VARCHAR2(38)

例外に関連付けられたドキュメントの行識別子(ROWID)

EXCEPTION_TYPE

VARCHAR2(13)

例外のタイプ

EXCEPTION_CODE

NUMBER

例外に関連付けられたエラー・コード

EXCEPTION_TEXT

CLOB

例外に関連付けられたテキスト

EXTRACTED_AT

TIMESTAMP

例外が発生した時刻

4.17 GATEエクストラクタ出力のデフォルトのスタイル・シート

この項では、XMLでエンコードされた注釈セットをRDF/XMLに変換するためにmdsys.gatenlp_extractor実装で使用されるデフォルトのXMLスタイル・シートをリストします。(このエクストラクタの詳細は、4.10項を参照してください。)

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output encoding="utf-8" indent="yes"/>
<xsl:param name="docbase">http://xmlns.oracle.com/rdfctx/</xsl:param>
<xsl:param name="docident">0</xsl:param>
<xsl:param name="classpfx">
<xsl:value-of select="$docbase"/>
<xsl:text>class/</xsl:text>
</xsl:param>
<xsl:template match="/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:prop="http://xmlns.oracle.com/rdfctx/property/">
<xsl:for-each select="AnnotationSet/Annotation">
<rdf:Description>
<xsl:attribute name="rdf:about">
<xsl:value-of select="$docbase"/>
<xsl:text>docref/</xsl:text>
<xsl:value-of select="$docident"/>
<xsl:text>/</xsl:text>
<xsl:value-of select="@Id"/>
</xsl:attribute>
<xsl:for-each select="./Feature">
<xsl:choose>
<xsl:when test="./Name[text()='majorType']">
<rdf:type>
<xsl:attribute name="rdf:resource">
<xsl:value-of select="$classpfx"/>
<xsl:text>major/</xsl:text>
<xsl:value-of select="translate(./Value/text(),
' ', '#')"/>
</xsl:attribute>
</rdf:type>
</xsl:when>
<xsl:when test="./Name[text()='minorType']">
<xsl:element name="prop:hasMinorType">
<xsl:attribute name="rdf:resource">
<xsl:value-of select="$docbase"/>
<xsl:text>minorType/</xsl:text>
<xsl:value-of select="translate(./Value/text(),
' ', '#')"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="./Name[text()='kind']">
<xsl:element name="prop:hasKind">
<xsl:attribute name="rdf:resource">
<xsl:value-of select="$docbase"/>
<xsl:text>kind/</xsl:text>
<xsl:value-of select="translate(./Value/text(),
' ', '#')"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="./Name[text()='locType']">
<xsl:element name="prop:hasLocType">
<xsl:attribute name="rdf:resource">
<xsl:value-of select="$docbase"/>
<xsl:text>locType/</xsl:text>
<xsl:value-of select="translate(./Value/text(),
' ', '#')"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:when test="./Name[text()='entityValue']">
<xsl:element name="prop:hasEntityValue">
<xsl:attribute name="rdf:datatype">
<xsl:text>
http://www.w3.org/2001/XMLSchema#string
</xsl:text>
</xsl:attribute>
<xsl:value-of select="./Value/text()"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="prop:has{translate(
substring(./Name/text(),1,1),
'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}{
substring(./Name/text(),2)}">
<xsl:attribute name="rdf:datatype">
<xsl:text>
http://www.w3.org/2001/XMLSchema#string
</xsl:text>
</xsl:attribute>
<xsl:value-of select="./Value/text()"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</rdf:Description>
</xsl:for-each>
</rdf:RDF>
</xsl:template>
</xsl:stylesheet>

5 RDFデータのファイングレイン・アクセス制御

Oracle Databaseセマンティク・データ・ストアに対するアクセスのデフォルト制御は、モデル・レベルです(モデルの所有者は、RDFM_<model_name>というビューに対する適切な権限を付与することで、モデルに対する選択、削除および挿入権限を他のユーザーに付与できます)。ただし、厳格なセキュリティ要件のあるアプリケーションでは、Oracle Databaseの仮想プライベート・データベース機能またはOracle Label Securityオプションを使用してファイングレイン・アクセス制御メカニズムを実施できます。

- RDFデータの仮想プライベート・データベース(VPD)によって、セキュリティ管理者は、特定のRDFクラスまたはプロパティのインスタンスを含むトリプルに対するユーザーのアクセスを条件付きで制限するポリシーを定義できます。VPDを使用すると、RDFモデルに格納されたデータはそのメタデータを使用して分類され、各ユーザー問合せは、アクセス制限を実施するコンテキスト依存のデータ・アクセス制約を含むようにリライトされます。
VPDの使用方法の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。セマンティク・データのあるVPDのサポートの詳細は、5.1項を参照してください。

- RDFデータのOracle Label Security (OLS)によって、RDFモデルに格納された個々のトリプルに機密性ラベルを関連付けることができます。問合せごとに、それらのラベルとユーザーのセッション・ラベルを比較することで、特定のトリプルに対するアクセス権限が付与されます。また、特定のリソースを記述するすべてのトリプル、または特定の述語で定義されているすべてのトリプルの最小限の機密性ラベルを、それぞれリソースまたは述語に機密性ラベルを直接割り当てることで実施できます。
OLSの使用方法の詳細は、『Oracle Label Security管理者ガイド』を参照してください。セマンティク・データのあるOLSのサポートの詳細は、5.2項を参照してください。

RDFデータでVPDとOLSのどちらを使用するかを選択する場合に考慮する要素は、次のとおりです。

- OLSは、RDFデータに対して有効化されると、ネットワーク・レベルで実施されますが、VPDは個々のRDFモデルに対して実施できます。

- Oracleインスタンスで同時にRDFデータに対してVPDとOLSの両方を使用することはできません。

セマンティク・データとともにVPDまたはOLSを実装するためのアプリケーション・プログラミング・インタフェース(API)は、SEM_RDFSA PL/SQLパッケージで提供されます。第13章に、SEM_RDFSAパッケージのプログラムに関するリファレンス情報があります。

RDFデータのVPDおよびOLSサポートは、リリース11.2のセマンティク・テクノロジ・サポートに含まれます。(セマンティク・テクノロジ・サポートを有効化、ダウングレードまたは削除する方法の詳細は、付録Aを参照してください。)

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

- 5.1項「RDFデータの仮想プライベート・データベース(VPD)」

- 5.2項「RDFデータのOracle Label Security (OLS)」

5.1 RDFデータの仮想プライベート・データベース(VPD)

仮想プライベート・データベース(VPD)機能は、セキュリティ・ポリシーとアプリケーション・コンテキストを使用してリレーショナル表またはビューの特定の行に対するアクセスを制限する行レベルのセキュリティ・メカニズムです。セキュリティ・ポリシーには、ユーザー問合せに対して戻される行ごとに実施される述語を動的に生成するポリシー・ファンクションが含まれます。表に関連付けられたポリシー・ファンクションによって戻されるセキュリティ述語は、通常、表の列を使用して表現されるため、表のメタデータに依存します。実際、セキュリティ述語によって、ユーザー問合せに対して戻される行が、その行の内容に適用される追加の条件を満たすことが保証されます。

リレーショナル・データがRDFにマップされている場合、特定のリレーショナル表に格納されているデータは、特定のRDFクラスのインスタンスを記述するトリプルを表します。この表現では、リレーショナル表の列は、リソースを記述するために使用されるRDFプロパティにマップされます。このマッピングは、さらにVPDポリシーのアプリケーションに拡張できます。

RDFデータに適用されるVPDポリシーによって、グラフ・パターンおよびフィルタ条件の形式でインスタンス・データに述語を適用することで、特定のRDFクラスまたはプロパティのインスタンスにユーザーのアクセスを制限します。たとえば、VPDポリシーを定義して、特定の部門に属するユーザーのみがContract RDFクラスのインスタンスにアクセスできるように制限できます。また、Contract RDFクラスのインスタンスとして識別されるリソースのhasContractValueプロパティに対するアクセスを、契約の管理者のみに制限できます。RDFデータのVPDサポートによって、セキュリティ条件またはデータ・アクセス制約をRDFクラスおよびプロパティに関連付けることができるため、対応するインスタンス・データに対するアクセスが制限されます。

RDFクラスまたはプロパティに関連付けられたデータ・アクセス制約によって、問合せ結果として戻される、対応するすべてのデータ・インスタンスに対して実施する必要のあるグラフ問合せパターンを指定します。たとえば、Contractクラス{?contract :hasDueDate ?due}のすべてのインスタンスの期限日を検出するSPARQL問合せパターンによって、戻された情報が特定の部門に属する契約に関連することを保証するデータ・アクセス制約をアクティブ化できます。これは、次の例のように、追加のグラフ・パターンを含むようにユーザーのグラフ問合せパターンを論理的にリライトすることで実現されます。

{ ?contract   :hasDueDate  ?due .
?contract   :drivenBy    dept:Dept1 }

また、リライトされたグラフ問合せパターンにバインドされた値は、セッション・コンテキストを使用して動的アクセス制限を実施できます。次の例では、トリプル・パターンの目的語の位置にあるsys_contextファンクションによって、セッション・コンテキストに基づく適切な部門値をバインドしています。

{ ?contract   :hasDueDate   ?due .
?contract   :drivenBy
"sys_context('sa$appctx','user_dept'}"^^orardf:instruction }

リレーショナル・データ・モデルでは、メタデータは、表定義の形式で常にデータ(表に格納された行)とともに存在するため、メタデータを使用して定義されたVPDポリシーは適切に整形され、ポリシー・ファンクションの手続き型ロジックを使用してセキュリティ条件が生成されます。

ただし、RDFデータ・モデルでは、付随するメタデータのないデータも許容されるため、特定のRDFグラフに対してインスタンス・データのクラス情報を常に使用できるとはかぎりません。たとえば、RDFグラフでは、契約として認識されるリソースに、そのリソースがContractクラスのインスタンスであることを表明するトリプルが付随しないことがあります。通常、このようなトリプルは、リソースを記述するプロパティで使用可能なドメインおよびレンジの指定を使用して推論されます。

同様に、VPDポリシーは、インスタンス・データのクラス情報を導出し、適切なデータ・アクセス制約を実施するためにプロパティのドメインおよびレンジの指定に依存します。ただし、実行時にユーザー・データに依存することを避けるため、VPDポリシーは、表明および推論されたトリプルとは別に、そのディクショナリのクラス情報を導出するために必要な最低限のメタデータを保持します。これによって、VPDポリシーで保持されるメタデータは、表明されたトリプルに必要な情報が存在しない場合でも完全で、データ・アクセス制約とメタデータを保持するVPDポリシーは、自己完結型で外部の依存性なしに移行できることが保証されます。

特定のデータ・アクセス制約とRDFメタデータの指定があるVPDポリシーは、RDFモデルに格納されたデータのアクセス制限を実施するために使用できます。モデルに対して発行された各SPARQL問合せは、その問合せでアクセスされるリソースのクラス情報を推測するために分析され、適切なデータ・アクセス制約が適用されます。インスタンス・データのクラス情報のコンパイル時間分析および導出を容易にするため、バインドされていない述語のあるグラフ問合せパターンは、VPDポリシーが有効な場合は制限されます。たとえば、次の形式のグラフ・パターンがSPARQL問合せパターンのいずれかの場所に存在する場合、基礎となるモデルにVPDポリシーが含まれると例外が発生します。

{ <contract:projectHLS>  ?pred  ?obj }

VPDポリシーは、SPARQL構文に表現されたSEM_MATCH問合せに対してのみ実施されます。データ・アクセスの他のすべての形式(グラフ・パターンの従来の構文またはモデル・ビューに対する直接問合せなど)は、許可されません。

5.1.1 RDFデータのVPDポリシー

RDFデータのVPDポリシーは、1つ以上のRDFモデルに格納されたデータに対してアクセス制限を実施するために使用できる名前付きディクショナリ・エンティティです。RDFデータに定義されたVPDポリシーは、一意の特性を持ち、リレーショナル・データにセキュリティ・ポリシーを実施するために再利用できません。データベースに定義されるRDF-VPDポリシーは次のとおりです。

- SPARQLユーザー問合せで参照されるデータのクラス情報を導出するために必要なRDFスキーマ文またはメタデータ

- インスタンス・データに対してアクセス制限を実施するデータ・アクセス制約

- 実行時環境に基づいてデータ・アクセス制約のグループの条件付き組込みを可能にするアプリケーション・コンテキスト

RDF-VPDポリシーは、組織のセキュリティ管理者ロールを持つユーザーによって、定義、所有および管理されます。このユーザーは、少なくともSYS.DBMS_RLSパッケージに対するEXECUTE権限を持っている必要があります。RDF-VPDポリシーの所有者は、ポリシーに関連付けられたメタデータを管理し、新しいデータ・アクセス制約を定義して、1つ以上のRDFモデルにポリシーを適用できます。

VPDポリシーのあるRDFモデルに対して発行されたSPARQL問合せが分析され、ポリシーに定義された0個以上のデータ・アクセス制約が実施され、それによって問合せ結果として戻されるデータ・インスタンスもそれらの制約に適合します。ユーザー問合せに実施される正確なデータ・アクセス制約は、問合せとアプリケーション・コンテキストで参照されるリソースに基づいて変化します。たとえば、hasContractValueプロパティに対する管理者のアクセスを制限するポリシーは、部長ロールを持つユーザーに対しては緩和できます。

適用される特定の制約は、アプリケーション・コンテキストで取得されるユーザーのロールに基づいて実行時に決定されます。VPDポリシーで定義された制約のサブセットの動的な組込みを容易にするため、データ・アクセス制約は、アプリケーション・コンテキストに基づいてアクティブ化および非アクティブ化できる名前付きグループに分類されます。問合せの分析中は、アクティブなグループに定義されている制約のみが実施対象とみなされます。

VPDポリシー内の制約グループは、アプリケーション・コンテキストとそのパッケージ実装を使用して管理されます。各VPDポリシーでは、CREATE CONTEXTコマンドで作成されたコンテキストの名前空間を指定できます。コンテキストに関連付けられた各属性は、その値を1に初期化してアクティブ化できる制約グループの名前として扱われます。たとえば、VPDポリシーに関連付けられたコンテキストのMANAGER属性の値を1に設定すると、ユーザー・セッションのMANAGERグループに関連付けられた制約がアクティブ化されます。ユーザー・コンテキストに基づいて特定の制約グループを初期化するロジックは、通常、コンテキスト・タイプに関連付けられたパッケージに組み込まれます。次の例は、このようなパッケージのサンプル実装からの抜粋を示しています。

CREATE CONTEXT contracts_constr_ctx using sec_admin.contracts_ctx_pack;

begin
-- create the VPD policy with a context --
sem_rdfsa.create_vpd_policy(policy_name    => 'CONTRACTS_POLICY',
policy_context => 'contracts_constr_ctx');
end;
/

create or replace package sec_admin.contracts_ctx_pack as
procedure init_constr_groups;
end;
/

create or replace package body sec_admin.contracts_ctx_pack as
procedure init_contr_groups is
hrdata EmpRole%rowtype;
begin
-- specific users with FULL access to the data associated with
-- the policy --
if (sys_context('userenv', 'session_user') = 'RDF_ADMIN') then
dbms_session.set_context('contracts_constr_ctx',
sem_rdfsa.VPD_FULL_ACCESS, 1);
return;
end if;

SELECT * into hrdata FROM EmpRole WHERE guid =
sys_context('userenv','session_user');

if (hrdata.emprole = 'VP') then
-- if the user logged in has VP role, activate the constraint
-- group named VP and keep all other groups inactive.
dbms_session.set_context('contracts_constr_ctx','VP', '1');
elsif (hrdata.emprole = 'MANAGER') then
dbms_session.set_context('contracts_constr_ctx', 'MANAGER', '1');
elsif ...
...
else
raise_application_error(-20010, 'unknown user role');
end if;

exception when others then
-- enforce constraints for all groups --
dbms_session.clear_all_context('contracts_constr_ctx');
end init_contr_groups;
end;
/

デフォルトでは、名前空間がRDF-VPDポリシーに関連付けられていない場合、または特定の制約グループがセッションでアクティブ化されていない場合、ポリシーに定義されたすべての制約がアクティブになり、各ユーザー問合せに実施されます。ただし、対応する名前空間属性の値を1に設定して特定の制約グループをアクティブ化すると、そのグループに属している制約と、任意のグループに関連付けられていない他の制約のみが実施されます。特定のセッションでは、1つ以上の制約グループがアクティブ化されることがありますが、その場合、適用可能なすべての制約が結合して実施されます。

作成時に、RDF-VPDポリシーに定義されたデータ・アクセス制約によって、制約グループの名前を指定できます(5.1.3項「データ・アクセス制約」を参照)。データベース・セッション内で、コンテキスト・パッケージによって設定されたセッション・コンテキストに基づいて、制約の適切なグループがアクティブ化されます。データベース・セッションの後続のすべてのSPARQL問合せでは、適切なセキュリティ・ポリシーを実施するために、アクティブなグループに属している制約が参照されます。

VPDポリシーのあるRDFモデルに対するメンテナンス操作では、モデルのデータに対する無制限のアクセスが必要です。これらの操作には、1つ以上のVPD保護モデルを使用した伴意の作成と、ロードまたはデータ処理操作が含まれます。RDFモデルに格納されたデータに対する無制限のアクセスを可能にするには、VPDポリシーに関連付けられた名前空間の予約属性を初期化します。予約属性は、パッケージ定数sem_rdfsa.VPD_FULL_ACCESSによって定義され、前述の例に示されているコンテキスト・パッケージ実装によってRDF_ADMINユーザーに完全なアクセス権限を付与します。

アプリケーション表に対するDML操作は、VPD制約違反については検証されないため、対応するモデルに対する完全なアクセス権限を持つユーザーのみが、既存のトリプルを追加または変更できます。

SEM_MATCH演算子を使用すると、標準のSQL問合せでVPDポリシーのあるRDFモデルを問い合せることや、VPD対応のモデルとVPDポリシーのないモデルの組合せに対してマルチモデル問合せを実行することができます。ただし、マルチモデル問合せの複数のモデルがVPD対応の場合、それらはすべて同じVPDポリシーに関連付けられている必要があります。RDFモデルに関連付けられたVPDポリシーは、モデルから推論された任意のデータに自動的に拡張されます。推論中に複数のRDFモデルが指定される場合、そのセット内のすべてのVPD対応モデルで同じVPDポリシーを使用する必要があります。

5.1.2 VPDポリシーを実施するためのRDFメタデータ

VPDポリシーを実施するために使用されるRDFメタデータのタイプは、次のとおりです。

- グラフで使用されるプロパティのドメインおよびレンジ情報

- グラフのサブクラス関係

- グラフのサブプロパティ関係

- グラフの等価プロパティ

VPDポリシーに関連付けられているRDFメタデータは、次のプロパティURIのいずれかを使用して、1つ以上のRDFスキーマ文として指定されます。

- http://www.w3.org/2000/01/rdf-schema#domain

- http://www.w3.org/2000/01/rdf-schema#range

- http://www.w3.org/2000/01/rdf-schema#subClassOf

- http://www.w3.org/2000/01/rdf-schema#subPropertyOf

- http://www.w3.org/2002/07/owl#equivalentProperty

たとえば、contracts_policyに関連付けられている次のRDFスキーマ文は、hasContractValueプロパティのドメインがContractクラスであることを表明しています。述語のレンジ指定は、それらが適切でない場合やリテラル・タイプの場合、スキップされることがあります。

begin
sem_rdfsa.maint_vpd_metadata(
policy_name => 'contracts_policy',
t_subject   => '<http://www.myorg.com/pred/hasContractValue>',
t_predicate => '<http://www.w3.org/2000/01/rdf-schema#domain>',
t_object    => '<http://www.myorg.com/classes/Contract>');
end;
/

RDF-VPDポリシーによって、表明および推論されたトリプルから独立してメタデータを管理します。このメタデータは、RDFモデルおよび対応する伴意からプログラム的に導出できます。たとえば、プロパティのドメインおよびレンジ情報と、サブクラスおよびサブプロパティの関係が、表明または推論されたトリプルにすでに確立されている場合、基礎となるモデル・ビューに対するSQL問合せを使用して、RDF-VPDポリシーのメタデータを移入できます。

プロパティのドメインおよびレンジ情報は、問合せで参照される用語および非バインド変数のRDFクラス・タイプを問合せ分析で決定する場合に役立ちます。さらに、この情報は、問合せでアクセスされるデータに対して適切なデータ・アクセス制約を実施する場合に使用されます。サブクラス・プロパティに関連するメタデータの使用によって、クラス階層内の特定のクラスに定義されたデータ・アクセス制約がそのすべてのサブクラスに自動的に実施されることが保証されます。同様に、VPDポリシーのサブプロパティ指定の使用によって、プロパティに関連付けられた制約がそのすべてのサブプロパティに実施されます。

VPDポリシーに関連付けられたRDFスキーマ文は、追加の文を推論するためには使用されないため、セキュリティ管理者は、推論データを使用したクロス・チェックによって、VPDポリシーで取得されたメタデータが完全であることを確認する必要があります。たとえば、サブプロパティ・スキーマ文では、スーパープロパティに指定されたドメインとレンジに基づいて、プロパティのドメインおよびレンジ情報が自動的に推論されることはありません。

表明されたトリプルの特定のOWLおよびRDFSプロパティは、チェックされないままの場合、VPDポリシーを回避するために使用できるデータを推論するために使用される可能性があります。たとえば、新しいプロパティが、特定のデータ・アクセス制約を持つプロパティのスーパープロパティとして定義されている場合、推論データによって、スーパープロパティを使用してサブプロパティのすべてのインスタンスが複製される可能性があります。VPDポリシーでスーパープロパティのアクセス制約を明示的に定義していない場合、推論データを使用して、アクセス制限を回避できます。

新しいデータを推論する機能は、完全なアクセス権限を持っているユーザーにのみ付与され、そのようなユーザーは、VPDポリシーに関連付けられたメタデータが新しい推論データに関して完全であることを確認する必要があります。特に、rdfs:subClassOf、rdfs:superClassOf、rdfs:subPropertyOf、rdfs:superPropertyOfまたはowl:equivalentPropertyの新しい表明が推論中に生成される場合、VPDポリシーに関連付けられたメタデータが保持されている必要があります。また、推論に使用されるルールベースによって導入された新しいプロパティでは、それらが機密情報に関連付けられている場合、データ・アクセス制約と同様に、ドメインおよびレンジの指定が必要になることがあります。

VPDポリシーでは、プロパティが別のプロパティと等価であると宣言して、元のプロパティに定義された制約と同様に、ドメインおよびレンジ情報を等価プロパティに対して自動的に複製できます。ただし、VPDポリシー内では、別のプロパティと等価であると宣言されたプロパティに追加のメタデータまたはデータ・アクセス制約を直接割り当てることはできません。

5.1.3 データ・アクセス制約

VPDポリシーに関連付けられたデータ・アクセス制約は、実施されるアクセス制限のタイプに基づいて次の2つの一般的なカテゴリに分類されます。

- 特定のRDFクラスのインスタンスに対するアクセスを制限するもの

- 特定のRDFプロパティを使用する表明に制限するもの

アクセス制限は、アプリケーション・コンテキストとSPARQL問合せでアクセスされるリソースの特性に基づいて、条件付きで実施されます。データ・アクセス制約は、リソースに関連付けられたプロパティを使用して、RDFクラスまたはプロパティのインスタンスに対するアクセスを制限します。たとえば、Contractクラスのメンバーであるリソースに対するアクセスを、そのリソースに関連付けられたhasMemberプロパティを使用して識別される、契約作業をしているユーザーのみに制限できます。同様に、リソースのhasContractValueプロパティに対するアクセスを、同じリソースに関連付けられたhasManagerプロパティを使用して、契約の管理者として識別されるユーザーに制限できます。

各データ・アクセス制約は、一致パターンおよび適用パターンとして識別される2つのグラフ・パターンを使用して表現されます。制約の一致パターンによって、実施されるアクセス制限のタイプが決定され、ユーザー問合せでアクセスされる対応するデータ・インスタンスに1つ以上の変数がバインドされます。たとえば、次の一致パターンがContractクラスのインスタンスに定義され、SPARQL問合せを通じてアクセスされるすべてのインスタンスに変数がバインドされます。

{ ?contract  rdf:type  <http://www.myorg.com/classes/Contract> }

同様に、RDFプロパティを含む制約の一致パターンは、SPARQL問合せでアクセスされるプロパティのインスタンスに一致し、それらのインスタンスの主語と目的語の位置にあるリソースに2つの変数がバインドされます。たとえば、hasContractValueプロパティに対する制約の一致パターンは、次のように定義されます。

{ ?contract  <http://www.myorg.com/pred/hasContractValue>  ?cvalue }

データ・アクセス制約の適用パターンによって、一致パターンに一致するリソースに適用される追加のグラフ・パターンが定義されます(その後、それらを使用して問合せ結果を構成できます)。データ・アクセス制約の一致パターンに定義された1つ以上の変数は、識別されたリソースに対してアクセス制限を実施するために、対応する適用パターンで使用されます。たとえば、次の一致パターンと適用パターンの組合せによって、Andyがアクセスされる契約の管理者である場合にのみ、その契約のhasContractValueにアクセスできることが保証されます。

Match:  { ?contract  pred:hasContractValue  ?cvalue  }
Apply:  { ?contract  pred:hasManager        emp:Andy }

SPARQL構文で表現されている一致パターンと適用パターンのあるデータ・アクセス制約をVPDポリシーに追加して、VPDポリシーに関連付けられたRDFモデルに格納されているデータに対してアクセス制限を実施できます。VPDポリシーに制約を追加する次の例では、predおよびempという名前空間の接頭辞に対する適切な名前空間マップでVPDポリシーが定義されていると仮定します。(VPDポリシーに名前空間マップを関連付けるには、SEM_RDFSA.CREATE_VPD_POLICYプロシージャを使用します。)

begin
sem_rdfsa.add_vpd_constraint(
policy_name   => 'contracts_policy',
constr_name   => 'andy_constraint_1',
match_pattern => '{?contract  pred:hasContractValue ?cvalue }',
apply_pattern => '{?contract  pred:hasManager       emp:Andy }',
constr_group  => 'andy');
end;
/

データ・アクセス制約をグループに分類する機能によって、前述の制約がAndyに関連付けられたセッションにのみ適用されることが保証されます。ただし、ユーザーごとに構造的に類似した制約が増大することを避けるため、次の例に示すとおり、適用グラフ・パターンの目的語の位置にあるアプリケーション・コンテキストを使用する共通の制約を定義できます。

begin
sem_rdfsa.add_vpd_constraint(
policy_name   => 'contracts_policy',
constr_name   => 'manager_constraint_1',
match_pattern => '{?contract  pred:hasContractValue ?cvalue }',
apply_pattern => '{?contract  pred:hasManager
"sys_context(''sa$appctx'',''app_user_uri''}"^^orardf:instruction }',
constr_group  => 'manager');
end;
/

前述の例で、manager制約グループ内に定義されたデータ・アクセス制約は、管理者ロールを持つユーザーを含むすべてのセッションでアクティブ化できます。この場合、ログインしたユーザーのURIを使用してsa$appctx名前空間のapp_user_uri属性を初期化するように、セキュアなアプリケーション・コンテキストをプログラムできます。たとえば、ユーザーAndyがアプリケーションにログインしたときに、app_user_uri属性を<http://www.myorg.com/employee/Andy>に初期化できます(この場合、制約によって、Andyが契約を管理する場合にのみ、ユーザーAndyは契約の値を参照できます)。通常、sys_contextファンクションをグラフ・パターンの目的語の位置で使用して、動的URIまたはリテラル値を問合せの実行時にバインドできます。ただし、コンテキストが適切に初期化されないと、前述の制約はすべてのデータ・インスタンスに対して失敗し、ユーザーは事実上どのデータにもアクセスできなくなります。

VPDポリシーのあるRDFモデルに対して発行されたSPARQL問合せは、ポリシーに定義されたアクティブなすべてのデータ・アクセス制約の一致パターンを使用して分析されます。次の例では、SPARQL問合せでhasContractValueプロパティを参照し、グループがアクティブな場合に制約を実施します。制約を実施することは、ユーザー問合せの適切な変数および用語を使用して、関連するすべての制約の適用パターンを含めるように元のSPARQLグラフ・パターンをリライトすることと論理的に同等です。hasContractValueプロパティに対する前述のアクセス制限では、次の例に示すとおり、SEM_MATCH演算子に渡される次のSPARQLグラフ・パターンが論理的にリライトされます。

Query:
{ ?contr  pred:drivenBy         ?dept .
?contr  pred:hasContractValue ?val }

Rewritten query:
{ ?contr  pred:drivenBy         ?dept .
?contr  pred:hasContractValue ?val .
?contr  pred:hasManager
"sys_context('sa$appctx','app_user_uri'}"^^orardf:instruction }

RDFプロパティに対するデータ・アクセス制約の一致パターンがユーザー問合せでアクセスされるパターンに一致する場合、同等のVPD実施問合せによって、一致したパターンに出現する変数および用語を使用して、対応する適用パターンがSPARQL問合せに追加されます。SPARQL問合せにネストしたグラフ・パターンが含まれる場合、データ・アクセス制約は、適切な基本問合せグラフ・パターン・ブロックに適用されます。次の例では、hasContractValueプロパティがOPTIONALグラフ・パターンで参照され、対応する適用パターンがグラフ・パターンのこのブロックに対して実施されます。

Query:
{ ?contr  pred:drivenBy         ?dept .
OPTIONAL { ?contr  pred:hasContractValue ?val } }

Rewritten query:
{ ?contr  pred:drivenBy         ?dept .
OPTIONAL { ?contr  pred:hasContractValue ?val .
?contr  pred:hasManager
"sys_context('sa$appctx','app_user_uri'}"^^orardf:instruction }

データ・アクセス制約の適用パターンは、複数のトリプル・パターンとFILTER句のある有効な基本グラフ・パターンになります。たとえば、VPロールを持つユーザーのhasContractValueプロパティに対するアクセス制約によって、そのユーザーは、契約を推進する部門の部長である場合にのみ、プロパティにアクセスできるようになります。このような制約の一致パターンと適用パターンは、次のように定義できます。

Match:  { ?contract  pred:hasContractValue  ?cvalue  }
Apply:  { ?contract  pred:drivenBy          ?dept .
?dept      pred:hasVP
"sys_context('sa$appctx','app_user_uri'}"^^orardf:instruction }

RDFクラスに関連付けられたデータ・アクセス制約に定義されている一致パターンによって、クラスのインスタンスに認識されているすべての変数および用語が識別されます。VPDポリシーに定義されているRDFメタデータは、各変数のタイプとSPARQL問合せの用語を決定するために使用され、適切なアクセス制約がこれらの変数と用語に適用されます。たとえば、次のVPD制約によって、Contractクラスのメンバーであるリソースに、そのリソースとのhasMember関係を持つユーザーのみがアクセスできることが保証されます。

Match:  { ?contract  rdf:type  <http://www.myorg.com/classes/Contract> }
Apply:  { ?contract  pred:hasMember
"sys_context('sa$appctx','app_user_uri'}"^^orardf:instruction }

SPARQL問合せに出現する変数または用語のクラス情報は、問合せに出現するプロパティのドメインおよびレンジ情報を使用して導出されます。次の例のSPARQL問合せでは、drivenByプロパティのドメインがContractクラスであると表明するRDFスキーマ文をVPDポリシーが含んでいる場合、変数?contrは、Contractクラスのインスタンスを保持するものとして認識されます。したがって、前に定義されたContractクラスのアクセス制限によって、次の例に示すとおり、ユーザー問合せは適切な適用パターンを含むようにリライトされます。

Query:
{ ?contr  pred:drivenBy    ?dept .
?contr  pred:hasDueDate  ?due }

Rewritten query:
{ ?contr  pred:drivenBy    ?dept .
?contr  pred:hasDueDate  ?due  .
?contr  pred:hasMember
"sys_context('sa$appctx','app_user_uri'}"^^orardf:instruction }

SPARQL問合せの基本グラフ・パターンが複数のデータ・アクセス制約に一致する場合、対応する適用パターンは、組み合されて結合グラフ・パターンを構成します(これは、SPARQL問合せを論理的にリライトすることで、後で特定のグラフ・パターンに対して実施されます)。特定のSPARQL問合せに対して実施されるデータ・アクセス制約が考慮される一方で、VPDポリシーに関連付けられたクラスおよびプロパティ階層が参照され、すべての適用可能な制約が自動的に実施されます。

- 特定のRDFクラスのインスタンスとして識別される変数または用語によって、クラスとそのすべてのスーパークラスに関連付けられている制約が実施されます。

- プロパティに関連付けられた制約は、ユーザー問合せによって、そのプロパティ(またはそのサブプロパティや等価プロパティとして定義されたプロパティ)が参照される場合に実施されます。

データ・アクセス制約のsys_contextファンクションを使用して、構造的に類似したグラフ・パターンを持つコンテキスト依存のアクセス制限を実施できます。アプリケーション・コンテキストに基づいて制約グループを動的にアクティブ化および非アクティブ化し、構造的に異なるグラフ・パターンを使用して代替アクセス制限を実施できます。

5.1.4 RDFVPD_POLICIESビュー

MDSYS.RDFVPD_POLICIESビューには、スキーマに定義されているすべてのVPDポリシーまたはユーザーが完全なアクセス権限を持っているポリシーに関する情報が含まれます。同じポリシーが複数のモデルに関連付けられている場合、ビューにはそのような関連ごとに1つのエントリが含まれます。このビューは、セマンティク・ネットワークとVPDポリシーが作成された後にのみ存在します。

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

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

列名

データ型

説明

POLICY_OWNER

VARCHAR2(32)

VPDポリシーの所有者。

POLICY_NAME

VARCHAR2(32)

VPDポリシーの名前。

NAMESPACE_MAP

RDF_ALIASES

VPD制約定義で使用される名前空間エントリのマッピング。

CONTEXT_NAME

VARCHAR2(32)

制約グループを管理するために使用されるコンテキストの名前。

5.1.5 RDFVPD_MODELSビュー

MDSYS.RDFVPD_MODELSビューには、RDFモデルとそれに関連付けられたVPDポリシーに関する情報が含まれます。このビューは、セマンティク・ネットワークとVPDポリシーが作成された後にのみ存在します。

表5-2に、MDSYS.RDFVPD_MODELSビューの列を示します。

表5-2 MDSYS.RDFVPD_MODELSビューの列

列名

データ型

説明

MODEL_NAME

VARCHAR2(25)

モデルの名前。

POLICY_OWNER

VARCHAR2(32)

VPDポリシーの所有者。

POLICY_NAME

VARCHAR2(32)

VPDポリシーの名前。

OPERATION_TYPE

VARCHAR2(9)

VPDポリシーが実施される操作のタイプ: QUERYまたはDML。

5.1.6 RDFVPD_POLICY_CONSTRAINTSビュー

MDSYS.RDFVPD_POLICY_CONSTRAINTSビューには、現在のユーザーがアクセスできるVPDポリシーに定義された制約に関する情報が含まれます。このビューは、セマンティク・ネットワークとVPDポリシーが作成された後にのみ存在します。

表5-3に、MDSYS.RDFVPD_POLICY_CONSTRAINTSビューの列を示します。

表5-3 MDSYS.RDFVPD_POLICY_CONSTRAINTSビューの列

列名

データ型

説明

POLICY_OWNER

VARCHAR2(32)

VPDポリシーの所有者。

POLICY_NAME

VARCHAR2(32)

VPDポリシーの名前。

CONSTRAINT_NAME

VARCHAR2(32)

制約の名前。

MATCH_PATTERN

VARCHAR2(1000)

制約の一致パターン。

APPLY_PATTERN

VARCHAR2(4000)

制約の適用パターン。

CONSTRAINT_GROUP

VARCHAR2(32)

制約が属している制約グループの名前。(大/小文字の区別なし。)

5.1.7 RDFVPD_PREDICATE_MDATAビュー

MDSYS.RDFVPD_PREDICATE_MDATAビューには、VPDポリシーに関連付けられた述語メタデータに関する情報が含まれます。このビューは、セマンティク・ネットワークとVPDポリシーが作成された後にのみ存在します。

表5-4に、MDSYS.RDFVPD_PREDICATE_MDATAビューの列を示します。

表5-4 MDSYS.RDFVPD_PREDICATE_MDATAビューの列

列名

データ型

説明

POLICY_OWNER

VARCHAR2(32)

VPDポリシーの所有者。

POLICY_NAME

VARCHAR2(32)

VPDポリシーの名前。

PREDICATE

VARCHAR2(4000)

ドメインおよびレンジ情報が定義されている述語のURI。

HASDOMAIN

VARCHAR2(4000)

述語のドメインを表すURI。

HASRANGE

VARCHAR2(4000)

述語のレンジを表すURI。

5.1.8 RDFVPD_RESOURCE_RELビュー

MDSYS.RDFVPD_RESOURCE_RELビューには、VPDポリシーのリソース間に定義されているサブクラス、サブプロパティおよび等価プロパティの関係に関する情報が含まれます。このビューは、セマンティク・ネットワークとVPDポリシーが作成された後にのみ存在します。

表5-5に、MDSYS.RDFVPD_RESOURCE_RELビューの列を示します。

表5-5 MDSYS.RDFVPD_RESOURCE_RELビューの列

列名

データ型

説明

POLICY_OWNER

VARCHAR2(32)

VPDポリシーの所有者。

POLICY_NAME

VARCHAR2(32)

VPDポリシーの名前。

SUBJECT_RESOURCE

VARCHAR2(4000)

主語リソース。

OBJECT_RESOURCE

VARCHAR2(4000)

目的語リソース。

RELATIONSHIP_TYPE

VARCHAR2(4000)

主語リソースと目的語リソースの間に存在する関係。

5.2 RDFデータのOracle Label Security (OLS)

RDFデータのOracle Label Security (OLS)では、セマンティク・データを保護するために2つのオプションが提供されます。

- トリプルレベル・セキュリティ(5.2.1項を参照): パフォーマンスと使いやすさの点で推奨されますが、パッチのインストールが必要です。

- リソースレベル・セキュリティ(5.2.2項を参照)

オプションを指定するには、適切なrdfsa_optionsパラメータ値とともにSEM_RDFSA.APPLY_OLS_POLICYプロシージャを使用します。

一方のオプションを他方に切り替えるには、SEM_RDFSA.REMOVE_OLS_POLICYプロシージャを使用して既存のポリシーを削除してから、適切なrdfsa_optionsパラメータ値とともにSEM_RDFSA.APPLY_OLS_POLICYプロシージャを使用して新しいポリシーを適用します。

5.2.1 トリプルレベル・セキュリティ

トリプルレベル・セキュリティ・オプションによって、Oracle Databaseによるラベル・セキュリティのネイティブ・サポートに加え、RDF固有の機能のThinレイヤーが提供されます。このオプションは、特にOLSを使用しながら推論を実行する場合、リソースレベル・セキュリティ(5.2.2項を参照)より高いパフォーマンスを発揮し、容易に使用できます。主な違いは、トリプルレベル・セキュリティでは、個々のトリプル・リソース(主語、プロパティ、目的語)に明示的にも暗黙的にもラベルを割り当てる必要がないところにあります。

注意:
トリプルレベル・セキュリティを使用するには、My Oracle Supportから入手できるパッチ9819833 SEMANTIC TECHNOLOGIES 11G R2 FIX BUNDLE 2を最初にインストールする必要があります。

トリプルレベル・セキュリティを使用するには、SEM_RDFSA.APPLY_OLS_POLICYプロシージャの実行時に、rdfsa_optionsパラメータ値としてSEM_RDFSA.TRIPLE_LEVEL_ONLYを指定します。次に例を示します。

EXECUTE sem_rdfsa.apply_ols_policy('defense', SEM_RDFSA.TRIPLE_LEVEL_ONLY);

SEM_RDFSA.APPLY_OLS_POLICYプロシージャに他の使用可能なパラメータを指定しないでください。

トリプルレベル・セキュリティを使用する場合、ネットワークの各セマンティク・モデルにはOLSが適用されます。つまり、関連する内部表とすべてのアプリケーション表にラベル・セキュリティが適用されるため、既存のセマンティク・モデルのアプリケーション表に手動でポリシーを適用する必要はありません。ただし、OLSポリシーの適用後に追加のモデルを作成する必要がある場合、モデルを作成する前に、SEM_OLS.APPLY_POLICY_TO_APP_TABプロシージャを使用してアプリケーション表にOLSを適用する必要があります。同様に、セマンティク・モデルをすでに削除していて、アプリケーション表を保護する必要がなくなった場合、SEM_OLS.REMOVE_POLICY_FROM_APP_TABプロシージャを使用できます。(これらのプロシージャの詳細は、第10章を参照してください。)

トリプルレベル・セキュリティでは、異なるラベルを持つ重複トリプルをセマンティク・モデルに挿入できます。(このような重複は、リソースレベル・セキュリティでは許可されません。)たとえば、次のように非常に機密性の高いラベルを持つトリプルがあるとします。

(<urn:X>,<urn:P>,<urn:Y>, "TOPSECRET")

この場合でも、権限の低い(UNCLASSIFIED)ユーザーは、トリプル(<urn:X>,<urn:P>,<urn:Y>, "UNCLASSIFIED")を挿入できます。SPARQLおよびSEM_MATCHではラベル情報が戻されないため、問合せでは両方の行が戻され(ユーザーが適切な権限を持っていると仮定)、TOPSECRETトリプルとUNCLASSIFIEDトリプルを簡単に区別することはできません。

セマンティク・モデルを問い合せる際にこのようにセキュリティの低いトリプルをフィルタするには、SEM_MATCHで次のオプションを1つ以上使用します。

- POLICY_NAMEは、OLSポリシー名を指定します。

- MIN_LABELは、問合せに含まれるトリプルに最小限のラベルを指定します。

つまり、厳密にMIN_LABELより優位性の低いラベルを含むトリプルは、すべて問合せから除外されます。たとえば、UNCLASSIFIEDトリプルをフィルタする場合、次の問合せを使用できます(OLSポリシー名がDEFENSEで、問合せユーザーがUNCLASSIFIEDトリプルとTOPSECRETトリプルに対する読取り権限を持っていると仮定)。

SELECT s,p,y FROM table(sem_match('{?s ?p ?y}' ,
sem_models(TEST'), null, null, null, null,
'MIN_LABEL=TOPSECRET POLICY_NAME=DEFENSE'));

前述の例のフィルタ処理は、ネイティブOLSソフトウェアによって実行されるセキュリティ・チェックに追加して発生します。

トリプルが挿入されると、セマンティク・モデルのアプリケーション表のCTXT1列を使用してラベル情報を表示および更新できます(ラベルを変更するためのWRITEUP権限とWRITEDOWN権限を持っていると仮定)。

トリプルレベル・セキュリティで推論またはバルク・ロードを実行できるユーザーの制限はなく、推論またはバルク・ロードされたトリプルは、すべてユーザーのセッション行ラベルで挿入されます。SA_UTLパッケージを使用してセッション・ラベルを変更できることに注意してください。(詳細は、『Oracle Label Security管理者ガイド』を参照してください。)

5.2.2 リソースレベル・セキュリティ

リソースレベル・セキュリティ・オプションによって、表の行にセキュリティ・レベルを定義する1つ以上のセキュリティ・ラベルを割り当てることができます。概念上、リレーショナル・データ・モデルの表は、同等のRDFグラフにマップできます。具体的には、リレーショナル表の行を、それぞれが特定の主語に関するファクトを表明するトリプルのセットにマップできます。このシナリオでは、主語は行の主キーを表し、行のキー以外の列と値の各組合せは、対応するトリプルの述語と目的語の値の組合せにマップされます。

リレーショナル・データ・モデルの行は、そのキーによって識別され、OLSは、行レベルのアクセス制御メカニズムとして、キーに関連付けられた値に対するアクセスを効果的に制限します。リレーショナル・データ・モデルとRDFデータ・モデル間のこの概念的なマッピングでは、リレーショナル表の行に対するアクセスを制限することは、特定の主語を含むサブグラフに対するアクセスを制限することと同等です。各トリプルの機密性ラベルをサポートするモデルでは、特定の主語を含むすべてのトリプルに同じラベルを適用することでこれが実施されます。ただし、個々のトリプルが異なるラベルを保持できるようにすることで、すべてのラベルの最小境界を維持しながら、柔軟性を大幅に向上することもできます。

OLSによるRDFデータのサポートでは、マルチレベル・アプローチが採用され、トリプル・コンポーネント(主語、述語、目的語)に関連付けられた機密性ラベルは、トリプルの機密性ラベルの最小境界を集合的に構成します。このアプローチでは、(主語、述語または目的語として使用される) RDFリソースに関連付けられたデータ機密性ラベルによって、権限のないユーザーがそのリソースを含むトリプルにアクセスすることや、そのリソースを含む新しいトリプルを作成することが制限されます。たとえば、主語であるprojectHLSに最小限の機密性ラベルが含まれると、この主語を記述するすべてのトリプルに少なくともprojectHLSのラベルを網羅する機密性ラベルが含まれることが保証されます。また、述語であるhasContractValueにより高い機密性ラベルが含まれると、この述語をprojectHLSとともに使用してトリプルを構成する場合、次の例のように、そのトリプルに少なくとも主語と述語両方のラベルを網羅するラベルが含まれます。

Triple 1: <http://www.myorg.com/contract/projectHLS> :ownedBy
<http://www.myorg.com/department/Dept1>
Triple 2: <http://www.myorg.com/contract/projectHLS> :hasContractValue
"100000"^^xsd:integer

機密性ラベルは、トリプルに出現する位置に基づいてRDFリソース(URI)に関連付けられます。たとえば、同じRDFリソースが、異なるトリプルの異なる位置(主語、述語または目的語)に出現することがあります。3つの一意のラベルを各リソースに割り当てることができるため、適切なラベルの使用によって、トリプルのリソースの位置に基づいてトリプルのラベルが決定されます。OLSポリシーをRDFリポジトリに適用する場合、データベース・インスタンスで保護する特定のリソース位置を選択できます。後続の別の項で説明するとおり、主語、目的語、述語またはその任意の組合せを保護できます。次の例では、defenseというOLSポリシーをRDFリポジトリに適用し、機密性ラベルをRDFの主語と述語に関連付けることができるようにしています。

begin
sem_rdfsa.apply_ols_policy(
policy_name   => 'defense',
rdfsa_options => sem_rdfsa.SECURE_SUBJECT+
sem_rdfsa.SECURE_PREDICATE);
end;
/

同じRDFリソースは、主語と目的語の両方の位置(および場合によっては述語の位置)に出現することが可能で、このようなリソースは、その位置に基づいて異なる機密性ラベルを持つことができます。特定の位置にあるリソースを使用するトリプルは、そのリソースの位置に対応するラベルを網羅するラベルを持つ必要があります。この場合、トリプルを表明するかトリプルにアクセスできるのは、そのトリプルおよびリソース・ラベルを網羅するラベルを持つユーザーのみです。

特定のRDFリポジトリでは、主語、述語、目的語またはこれらの組合せに対して、データ分類技術に基づいたセキュリティを有効化できます。これによって、リポジトリに追加されたすべてのトリプルは、必ず前述のラベル関係に自動的に準拠します。

5.2.2.1 RDFの主語の保護

RDFリソース(通常はURI)は、表明がリソースに関して行われる場合、トリプルの主語の位置に出現します。この場合、リソースに関連付けられた機密性ラベルには、次の特性があります。

- ラベルは、リソースを主語として使用するトリプルの最小限の機密性ラベルを表します。つまり、トリプルの機密性ラベルは、主語のラベルに優先するか、それを網羅する必要があります。

- 新しく追加されたトリプルのラベルは、ユーザーの初期行ラベルに初期化されるか、ラベル・ファンクションを使用して生成されます(ラベルを指定した場合)。この操作は、トリプルのラベルが、トリプルの主語に関連付けられたラベルより優先される場合にのみ成功します。

- トリプルを読み取ることができるのは、主語のラベルとトリプルのラベルに優先するアクセス・ラベルを持つユーザーのみです。

デフォルトでは、主語の機密性ラベルは、最初にRDFリソースがトリプルの主語の位置で使用されるときにユーザー環境から導出されます。この場合、デフォルトの機密性ラベルは、ユーザーの初期行ラベルに設定されます(ユーザーによって挿入されるすべての行に割り当てられるデフォルト)。

ただし、トリプルで使用する前でも、RDFリソースを主語として分類し、それに機密性ラベルを割り当てることができます。次の例では、SECRET:HLS:USという機密性ラベルをprojectHLSリソースに割り当て、それによってこのリソースに関する新しいトリプルを定義できるユーザーと、このリソースを主語として使用する既存のトリプルにアクセスできるユーザーを制限しています。

begin
sem_rdfsa.set_resource_label(
model_name   => 'contracts',
resource_uri => '<http://www.myorg.com/contract/projectHLS>',
label_string => 'SECRET:HLS:US',
resource_pos => 'S');
end;

5.2.2.2 RDFの述語の保護

RDFの述語は、主語と目的語の間の関係を定義します。RDFの述語に関連付けられた機密性ラベルを使用して、すべての主語との特定のタイプの関係に対するアクセスを制限できます。

RDFの述語は、リレーショナル表の列に類似し、特定の述語に対するアクセスを制限する機能は、列レベルでリレーショナル・データを保護することと同等です。主語を保護する場合と同様に、述語の機密性ラベルによって、この述語を使用するトリプルの最小境界が作成されます。また、これは、ユーザーが述語を含むトリプルを定義したり、述語を含むトリプルにアクセスする場合に持っている必要のある最小限の認可権限に相当します。

次の例では、ラベルHSECRET:FIN (このシナリオでは、機密性が高く、かつ経理部に属するラベル)を述語hasContractValueを含むトリプルに割り当て、そのような許可を持つユーザーのみがトリプルを定義し、またはトリプルにアクセスできるようにしています。

begin
sem_rdfsa.set_predicate_label(
model_name   => 'contracts',
predicate    => '<http://www.myorg.com/pred/hasContractValue>',
label_string => 'HSECRET:FIN');
end;
/

主語と組み合せて述語を保護できます。この場合、主語と述語を使用するトリプルは、少なくとも主語と述語の両方のラベルを網羅する機密性ラベルを持つことが保証されます。前述の例を拡張して、主語であるprojectHLSをラベルSECRET:HLS:USで保護する場合、および述語であるhasContractValueをラベルHSECRET:FIN:で保護する場合、projectHLSの金額値を割り当てるトリプルは、少なくともラベルHSECRET:HLS,FIN:USを持つ必要があります。実際、トリプルを定義し、またはトリプルにアクセスできるようにするには、ユーザーのラベルがこのトリプルのラベルに優先している必要があります。

5.2.2.3 RDFの目的語の保護

RDFトリプルは、その目的語の位置にURIまたはリテラルを持つことができます。トリプルの目的語の位置にあるURIは、リソースを表します。目的語の位置にあるリソースは、それに機密性ラベルを関連付けることで、トリプルの目的語としてリソースを使用する機能を制限するように保護できます。

通常、トリプルの目的語の位置に出現するリソース(URIまたは非リテラル)は、それ自体、追加のRDF文を使用して記述できます。実際、目的語の位置にあるRDFリソースは、他のトリプルの主語の位置に出現することがあります。RDFリソースが明示的な機密性ラベルを使用せずに目的語の位置で保護される場合、主語の位置にある同じリソースに関連付けられたラベルは、目的語のデフォルト・ラベルとして使用されます。

5.2.2.4 推論されたトリプルのラベルの生成

RDFデータ・モデルでは、宣言ルールの指定が可能で、明示的にリポジトリに追加されていないRDF文の存在を推論できます。次に、単純な宣言ルールを示します(これらのルールは、プロジェクトは部門によって所有可能で、部門には部長が存在し、その場合プロジェクト・リーダーはデフォルトでプロジェクトを所有する部門の部長になるというロジックに関連付けられています)。

RuleID -> projectLedBy
Antecedent Expression -> (?proj :ownedBy ?dept) (?dept :hasVP ?person)
Consequent Expression -> (?proj :isLedBy ?person)

RDFルールは、明示的に表明されたトリプルと、前に推論されたトリプルを前件として使用し、1つ以上の結果トリプルを推論します。通常、推論プロセスは、オフライン操作として実行され、すべての推論されたトリプルが事前生成されて、後続の問合せ操作で使用できるようになります。

基礎となるRDFグラフがOLSを使用して保護される場合、権限のないユーザーにデータを公開することを避けるため、グラフから推論された追加データも保護する必要があります。また、推論プロセスは、完全性を保証するため、より高い権限(特にデータに対する完全なアクセス権限)で実行する必要があります。

OLSによるRDFデータのサポートによって、1つ以上のRDFアーティファクトに関連付けられたラベルに基づいて、推論されたトリプルの機密性ラベルを生成するための技術が提供されます。これによって、推論時に起動できるラベル生成技術が提供されます。また、拡張可能な実装によって特定のトリプルの使用可能なラベルのセットを受信し、アプリケーション固有のロジックに基づいてトリプルに最も適した機密性ラベルを決定できる拡張フレームワークも提供されます。推論されたトリプルのラベルを生成する場合に使用できる技術は、次のとおりです(各技術は、前件ラベルの使用を除き、SEM_RDFSAパッケージ定数に関連付けられます)。

- ルール・ラベルの使用(SEM_RDFSA.LABELGEN_RULE): 推論されたトリプルは、特定のルールによって直接生成され、状況によってはその前件を通じて他のルールに間接的に依存します。各ルールは、機密性ラベルを持つことが可能で、それはルールによって直接推論されたすべてのトリプルの機密性ラベルとして使用されます。

- 主語ラベルの使用(SEM_RDFSA.LABELGEN_SUBJECT): 新しいトリプルの主語に関連付けられた機密性ラベルを考慮することで、推論されたトリプルのラベルを導出します。推論された各トリプルは、主語を持ち、それがトリプルの前件のいずれかに含まれる主語、述語または目的語になることが可能です。このようなRDFリソースが保護される場合、新しく推論されたトリプルの主語は、1つ以上のラベルに関連付けることができます。主語ラベルの使用の技術では、推論されたトリプルのラベルは、RDFリソースに関連付けられた一意のラベルに設定されます。リソースに複数のラベルが存在する場合、拡張可能なロジックを実装して新しいトリプルに最も適したラベルを決定できます。

- 述語ラベルの使用(SEM_RDFSA.LABELGEN_PREDICATE): 新しいトリプルの述語に関連付けられた機密性ラベルを考慮することで、推論されたトリプルのラベルを導出します。推論された各トリプルは、述語を持ち、それがトリプルの前件のいずれかに含まれる主語、述語または目的語になることが可能です。このようなRDFリソースが保護される場合、新しく推論されたトリプルの述語は、1つ以上のラベルに関連付けることができます。述語ラベルの使用の技術では、推論されたトリプルのラベルは、RDFリソースに関連付けられた一意のラベルに設定されます。リソースに複数のラベルが存在する場合、拡張可能なロジックを実装して新しいトリプルに最も適したラベルを決定できます。

- 目的語ラベルの使用(SEM_RDFSA.LABELGEN_OBJECT): 新しいトリプルの目的語に関連付けられた機密性ラベルを考慮することで、推論されたトリプルのラベルを導出します。推論された各トリプルは、目的語を持ち、それがトリプルの前件のいずれかに含まれる主語、述語または目的語になることが可能です。このようなRDFリソースが保護される場合、新しく推論されたトリプルの目的語は、1つ以上のラベルに関連付けることができます。目的語ラベルの使用の技術では、推論されたトリプルのラベルは、RDFリソースに関連付けられた一意のラベルに設定されます。リソースに複数のラベルが存在する場合、拡張可能なロジックを実装して新しいトリプルに最も適したラベルを決定できます。

- 上位ラベルの使用(SEM_RDFSA.LABELGEN_DOMINATING): 推論された各トリプルは、最小限で4つの直接コンポーネント(主語、述語、目的語、およびトリプルを生成したルール)を持ちます。上位ラベルの使用の技術では、推論時に、ラベル・ジェネレータによって、各コンポーネントに関連付けられた最上位の機密性ラベルが計算され、それが推論されたトリプルの機密性ラベルとして割り当てられます。様々なラベル間に明確な支配関係を確立できない場合、例外ラベルが割り当てられます。

- 前件ラベルの使用: 推論された各トリプルの4つの直接コンポーネント(主語、述語、目的語、およびトリプルを生成したルール)に加え、トリプルは、新しいトリプルを推測する手段となる1つ以上の前件トリプルを持つことができます。前件ラベルの使用の技術では、すべての前件トリプルのラベルが考慮され、新しいトリプルに最も適したラベルを決定するために、競合解決基準が実装されます。推論されたトリプルは、他の推論されたトリプルに依存することがあるため、すべての推論されたトリプルのラベルの生成中は厳密な順序に従います。
前件ラベルの使用の技術では、カスタム・ラベル・ジェネレータを使用する必要があります。カスタム・ラベル・ジェネレータの作成および使用の詳細は、5.2.2.5項を参照してください。

次の例では、特定のルールベースを使用して契約データの伴意(ルール索引)を作成しています。この操作は、OLSポリシーがRDFリポジトリに適用されている状態で完全なアクセス権限を持つユーザーによってのみ実行できます。この場合、推論されたトリプルに生成されるラベルは、label_genパラメータでのSEM_RDFSA.LABELGEN_PREDICATEパッケージ定数の使用に従って、述語に関連付けられたラベルに基づきます。

begin
sem_rdfsa.create_entailment(
index_name_in   => 'contracts_inf',
models_in       => SDO_RDF_Models('contracts'),
rulebases_in    => SDO_RDF_Rulebases('contracts_rb'),
options         => 'USER_RULES=T',
label_gen       => sem_rdfsa.LABELGEN_PREDICATE);
end;

事前定義された、または拡張可能なラベル生成の実装によって、推論されたトリプルに適用される一意のラベルを計算できない場合、トリプルに例外ラベルが設定されます。このようなトリプルには、RDFデータに対する完全なアクセス権限を持っているユーザー(および推論プロセスを開始したユーザー)以外のユーザーはアクセスできません。例外ラベル付きのトリプルは、明確にマークされるため、権限のあるユーザーはそれらにアクセスし、手動で意味のあるラベルを適用できます。推論されたトリプルに機密性ラベルが適用された後は、互換性のあるラベルを持つユーザーのみがそれらのトリプルにアクセスできます。次の例では、例外ラベルが設定されているトリプルの機密性ラベルを更新しています。

update mdsys.rdfi_contracts_inf
set ctxt1 = char_to_label('defense', 'SECRET:HLS:US')
where ctxt1 = -1;

生成されたラベルを通じてアクセスされる推論されたトリプルは、ユーザー・アクセス可能なトリプルおよびルールから直接推論される概念上のトリプルとは異なることがあります。システム定義の実装またはカスタム実装を使用して生成されるラベルの正確性は、保証されません。詳細は、第9章のSEM_APIS.CREATE_ENTAILMENTプロシージャの「使用方法」にある「ファイングレイン・アクセス制御(VPDおよびOLS)に関する考慮事項」を参照してください。

5.2.2.5 アプリケーション・ロジックに基づくラベルの使用

MDSYS.RDFSA_LABELGENタイプは、索引の作成時に適切なラベル・ジェネレータ・ロジックを適用するために使用されますが、このタイプを拡張してカスタム・ラベル・ジェネレータを実装し、アプリケーション・ロジックに基づくラベルを生成することもできます。ラベル・ジェネレータは、SEM_APIS.CREATE_ENTAILMENTプロシージャでlabel_genパラメータを使用して指定します。システム定義のラベル・ジェネレータを使用するには、SEM_RDFSAパッケージ定数(5.2.2.4項を参照)を指定し、カスタム・ラベル・ジェネレータを使用するには、カスタム・ラベル・ジェネレータ・タイプを実装してSEM_RDFSAパッケージ定数のかわりにそのタイプのインスタンスを指定する必要があります。

カスタム・ラベル・ジェネレータ・タイプを作成するには、RDFSA_LABELGENタイプに対するUNDER権限を持っている必要があります。また、RDFデータの索引を作成するには、このタイプに対するEXECUTE権限を持っている必要があります。次の例では、RDF_ADMINというユーザーにこれらの権限を付与しています。

GRANT under, execute ON mdsys.rdfsa_labelgen TO rdf_admin;

カスタム・ラベル・ジェネレータ・タイプは、次の例に示すとおり、コンストラクタを実装する必要があります(このコンストラクタによって、依存リソースを設定し、渡された情報から計算したラベルを戻すgetNumericLabelメソッドを指定します)。

CREATE OR REPLACE TYPE CustomSPORALabel UNDER mdsys.rdfsa_labelgen  (
constructor function CustomSPORALabel return self as result,
overriding member function getNumericLabel (
subject   rdfsa_resource,
predicate rdfsa_resource,
object    rdfsa_resource,
rule      rdfsa_resource,
anteced   rdfsa_resource)
return number);

ラベル・ジェネレータ・コンストラクタは、SEM_RDFSAパッケージに定義されている定数のセットを使用して、ラベル・ジェネレータが依存しているリソースのリストを示します。依存リソースは、推論されたトリプルの主語、述語、目的語、トリプルを生成したルール、およびその前件として識別されます。カスタム・ラベル・ジェネレータは、ラベルを生成するためにこれらのリソースの任意のサブセットに依存することが可能で、SEM_RDFSAパッケージに定義されている定数(USE_SUBJECT_LABEL、USE_PREDICATE_LABEL、USE_OBJECT_LABEL、USE_RULE_LABEL、USE_ANTCED_LABEL)を使用してそのコンストラクタにこれを指定できます。次の例では、タイプ本体を作成し、コンストラクタを指定しています。

例5-1では、タイプ本体を作成し、コンストラクタ・ファンクションおよびgetNumericLabelメンバー・ファンクションを指定しています。(アプリケーション固有のロジックはこの例に含まれていません。)

例5-1 カスタム・ラベル・ジェネレータ・タイプの作成

CREATE OR REPLACE TYPE BODY CustomSPORALabel AS

constructor function CustomSPORALabel return self as result as
begin
self.setDepResources(sem_rdfsa.USE_SUBJECT_LABEL+
sem_rdfsa.USE_PREDICATE_LABEL+
sem_rdfsa.USE_OBJECT_LABEL+
sem_rdfsa.USE_RULE_LABEL+
sem_rdfsa.USE_ANTECED_LABELS);
return;
end CustomSPORALabel;

overriding member function getNumericLabel (
subject   rdfsa_resource,
predicate rdfsa_resource,
object    rdfsa_resource,
rule      rdfsa_resource,
anteced   rdfsa_resource)
return number as
labellst mdsys.int_array := mdsys.int_array();
begin
-- Find dominating label of S P O R A –
–- Application specific logic for computing the triple label –
-- Copy over all labels to labellst --
for li in 1 .. subject.getLabelCount() loop
labellst.extend;
labellst(labellst.COUNT) = subject.getLabel(li);
end loop;
--- Copy over other labels as well ---
--- Find a dominating of all the labels. Generates –1 if no
--- dominating label within the set
return self.findDominatingOf(labellst);
end getNumericLabel;
end CustomSPORALabel;
/

例5-1では、サンプルのラベル・ジェネレータ実装で、トリプルの機密性ラベルを生成するために、推論されたトリプルに提供されるすべてのリソースを使用しています。そのため、コンストラクタは、スーパークラスに定義されたsetDepResourcesメソッドを使用して、そのすべての依存コンポーネントを設定します。この手順で設定される依存リソースのリストによって、ラベル生成ルーチンに渡される値の正確なリストが決定されます。

getNumericLabelメソッドは、推論されたトリプルが依存できるリソースごとに1つの引数を持つラベル生成ルーチンです。対応する依存リソースがコンストラクタの実装に設定されていない場合、いくつかの引数はNULL値になることがあります。

ラベル・ジェネレータの実装では、RDFSA_LABELGENタイプに定義されている汎用の静的ルーチンを使用して、特定のラベル・セットの上位ラベルを検出できます。ラベル・セットは、MDSYS.INT_ARRAYタイプのインスタンスに渡され、メソッドはそのうちの上位ラベルを検出します。そのようなラベルが存在しない場合、例外ラベル-1が戻されます。

カスタム・ラベル・ジェネレータ・タイプを実装した後、次の例に示すとおり、SEM_APIS.CREATE_ENTAILMENTプロシージャのlabel_genパラメータにこのタイプのインスタンスを割り当てることで、推論されたデータのカスタム・ラベル・ジェネレータを使用できます。

begin
sem_apis.create_entailment(
index_name_in  => 'contracts_rdfsinf',
models_in      => SDO_RDF_Models('contracts'),
rulebases_in   => SDO_RDF_Rulebases('RDFS'),
options        => '',
label_gen      => CustomSPORALabel());
end;
/

5.2.2.6 RDFOLS_SECURE_RESOURCEビュー

MDSYS.RDFOLS_SECURE_RESOURCEビューには、Oracle Label Security (OLS)ポリシーで保護されたリソースと、それらのリソースに関連付けられた機密性ラベルに関する情報が含まれます。

このビューに対するSELECT権限を適切なユーザーに付与できます。特定のモデルに関連付けられたリソースを表示するには、そのモデル(または対応するRDFM_model-nameビュー)に対するSELECT権限も持っている必要があります。

表5-6に、MDSYS.RDFOLS_SECURE_RESOURCEビューの列を示します。

表5-6 MDSYS.RDFOLS_SECURE_RESOURCEビューの列

列名

データ型

説明

MODEL_NAME

VARCHAR2(25)

モデルの名前。

MODEL_ID

NUMBER

モデルの内部識別子。

RESOURCE_ID

NUMBER

リソースの内部識別子(リソースに関する情報用としてMDSYS.RDF_VALUE$.VALUE_ID列に結合)。

RESOURCE_TYPE

VARCHAR2(16)

ラベルが割り当てられるリソース・タイプを示す文字列値(SUBJECT、PREDICATE、OBJECT、GLOBAL)のいずれか。

CTXT1

NUMBER

リソースに割り当てられる機密性ラベル。

6 RDFデータに対するWorkspace Managerサポート

Oracle Databaseセマンティク・データ・ストアに格納されているRDFデータは、Oracle Database 11g Workspace Managerを使用してバージョン対応にすることができます。Workspace Managerを使用すると、データ変更操作によって新しいバージョンのRDFデータを作成する一方で、古いデータのコピーを保持できます。Workspace Managerの使用方法およびリファレンス情報については、『Oracle Database Workspace Manager開発者ガイド』を参照してください。

セマンティク・データ・ストアのバージョニングの単位はモデルで、ユーザー・スキーマに存在するアプリケーション表に順番に関連付けられます。バージョン対応RDFモデルを管理するには、従来のWorkspace Managerインタフェースが使用されます。(ただし、仮想モデルに参加するモデルではバージョン対応を使用できません。仮想モデルの詳細は、1.3.8項を参照してください。)

データベースに最初のバージョン対応RDFモデルを作成すると、すべてのRDFモデルのデータが保持される基礎となるトリプル・ストアで索引が再作成されます。したがって、最初のバージョン対応RDFモデルを作成するために必要な時間は、これらのモデルの既存のデータ量に応じて異なります。

この章では、バージョン対応RDFモデルの主な特性について説明し、例をいくつか示します。この章の内容は次のとおりです。

- 6.1項「RDFデータに対するWorkspace Managerサポートの有効化」

- 6.2項「RDFモデルのバージョニングの有効化」

- 6.3項「バージョン対応RDFモデルからの推論」

- 6.4項「バージョン対応RDFモデルでのワークスペースのマージおよびリフレッシュ」

- 6.5項「RDFデータに対してWorkspace Managerサポートを使用する場合の特別な考慮事項」

- 6.6項「使用フローの例: セマンティク・モデルのバージョニング」

6.1 RDFデータに対するWorkspace Managerサポートの有効化

RDFデータに対するWorkspace Managerサポートは、デフォルトではデータベースにインストールされません。そのため、データベースでセマンティク・テクノロジ・サポートを有効にした後に(A.1項「セマンティク・テクノロジ・サポートの有効化」を参照)、sdordfwm.sqlという名前のスクリプトを実行する必要があります。データベースに対してsdordfwm.sqlを1回のみ実行する必要があります。このスクリプトを実行するには、データベースにSYSDBAとして接続し、使用しているオペレーティング・システムに応じて次の文を入力します。

- Linuxの場合: SQL> @$ORACLE_HOME/md/admin/sdordfwm.sql

- Windowsの場合: SQL> @%ORACLE_HOME%\md\admin\sdordfwm.sql

Workspace ManagerサポートがRDFデータに対して有効であるかどうかを調べる場合は、次の問合せを入力して、戻された値がINSTALLEDであるかどうかを確認します。

SELECT value FROM mdsys.rdf_parameter
WHERE namespace = 'COMPONENT' and attribute = 'RDFOWM';

6.1.1 RDFデータに対するWorkspace Managerサポートの削除

RDFデータに対するWorkspace Managerサポートを有効にした後に、特定の状況ではそのサポートを削除する必要がある場合があります。たとえば、データベースでセマンティク・テクノロジ・サポートをダウングレードまたは削除する前に、RDFデータに対するWorkspace Managerサポートを削除する必要があります。(セマンティク・テクノロジ・サポートのダウングレードおよび削除の詳細は、付録A「セマンティク・テクノロジ・サポートの有効化、ダウングレードまたは削除」を参照してください。)

RDFデータに対するWorkspace Managerサポートを削除するには、次の手順を実行します。

1. SYSDBA権限を持つSYSユーザーとしてデータベースに接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

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

- Linuxの場合: @$ORACLE_HOME/md/admin/sdordfwm_rm.sql

- Windowsの場合: @%ORACLE_HOME%\md\admin\sdordfwm_rm.sql

sdordfwm_rm.sqlスクリプトが正常に完了したら、データベースでセマンティク・テクノロジ・サポートをダウングレードまたは削除できます。

6.2 RDFモデルのバージョニングの有効化

RDFモデルをバージョン対応にするには、そこで必要な伴意(ルール索引)を作成し(SEM_APIS.CREATE_ENTAILMENTプロシージャを使用)、その関連するアプリケーション表をバージョン対応にする必要があります。たとえば、contractsという名前のRDFモデルがCONTRACTS_RDF_DATAという名前のアプリケーション表に関連付けられている場合は、次の例に示すようにバージョンの有効化を実行できます。

begin
dbms_wm.enableVersioning (table_name => 'contracts_rdf_data');
end;
/

アプリケーション表は主キーを持つ必要があり、HISTORYまたはVALID TIMEオプションを指定できません。

アプリケーション表に格納されるデータおよびセマンティク・データ・ストア内の対応するRDFデータは、論理的にバージョニングされます。バージョン対応アプリケーション表上の標準データ操作(挿入、更新、削除)では、セマンティク・データ・ストア内の影響を受けたアプリケーション表の行および対応するRDFトリプルのバージョン情報が保持されます。SEM_MATCH演算子を使用してRDFデータにアクセスする問合せは、結果セットを構築する場合に、アクティブ・ワークスペースの状態および関連するバージョンのデータを考慮します。

RDFデータを取り扱う場合、頻繁にリフレッシュされるワークスペースおよび複数の親ワークスペースは使用できません。ただし、他のワークスペース操作(新しいワークスペースの作成、セーブポイントの作成、アクセス・モードの設定およびワークスペースのリフレッシュとマージなど)については、予想どおりに進行します。

アプリケーション表の行でWorkspace Managerロックを使用すると、同時ワークスペースでのデータ操作の競合を回避できます。このような場合の競合は、ロックされた行の主キーに基づいて検出され、サブグラフまたはノード上のロックなど、RDFデータで意味のあるロックに直接変換されない場合があります。(バージョン対応RDFデータを含むベスト・プラクティスについては、6.4項を参照してください。)

6.3 バージョン対応RDFモデルからの推論

RDFモデルを使用すると、システム定義およびユーザー定義のルールベースを使用して、推論によって1つ以上の伴意を作成できます。このようなモデルをバージョン対応にすると、推論データを格納する関連伴意もバージョン対応になります。

ただし、論理的にバージョニングされるRDFモデルとは異なり、伴意は物理的にバージョニングされます。したがって、RDFモデルにマージされない変更を持つワークスペースは、伴意のプライベート・バージョンを保持する場合があります(親ワークスペースに対応する伴意にすでに存在する場合がある推論されたトリプルがすべて複製されます)。図6-1に、ワークスペースW1およびW2 (LIVEワークスペースの子ワークスペース)に対して索引のプライベート・コピーが保持される、物理的にバージョニングされた伴意を示します。

図6-1 伴意(ルール索引)の物理的なバージョニング

有効な伴意を持つ親ワークスペースから作成されたワークスペースは、対応するモデルでいくつかのワークスペース固有のデータ操作が発生するまで、伴意とその親を共有します。ワークスペース内の最初のデータ操作によって、伴意のプライベート・コピーが作成され、INVALIDとマークされます。次の例に示すように、推論データのワークスペース・プライベート・バージョンは、SEM_APIS.CREATE_ENTAILMENTプロシージャを使用して再構築できます。

begin
sem_apis.create_entailment(
index_name_in   => 'contracts_rdfs',
models_in       => SDO_RDF_Models('contracts'),
rulebases_in    => SDO_RDF_Rulebases('RDFS'));
end;
/

ワークスペース内のこのRDFモデルへのその後の追加では伴意をINCOMPLETEとしてマークしますが、SEM_APIS.CREATE_ENTAILMENTプロシージャを使用してVALIDステータスに戻すことができます。ワークスペースがマージされると、ワークスペースのプライベート伴意は削除され、親ワークスペースの対応する索引はINVALIDとしてマークされます。

6.4 バージョン対応RDFモデルでのワークスペースのマージおよびリフレッシュ

バージョン対応RDFモデルに格納されているデータを変更するワークスペースには、他のRDFモデルまたはリレーショナル表への追加変更が含まれている場合があります。ワークスペース内で変更されたリレーショナル・データのマージまたはリフレッシュに関するセマンティクは、変更されません。同様に、アプリケーション表のマージまたはリフレッシュは、アプリケーション表で定義される主キーに基づいた競合分析の対象になります。同時ワークスペースで追加および削除されたトリプルは、それらがアプリケーション表で同じ主キーに関連付けられていないかぎり、競合としてフラグは付けられません。たとえば、親ワークスペースと子ワークスペースで同じトリプルを異なる主キーで表明する場合がありますが、ワークスペースのマージ時に、これら両方のトリプルが受け入れられます。トリプル・コンポーネントからアプリケーション表の主キーを生成することによって、そのような競合を回避できます。

RDFデータを処理する場合、フラグを付ける必要がある競合のタイプは、アプリケーションの要件に応じて異なります。競合には、2つのトリプル間に存在する物理的競合、およびトリプルが属するグラフ内に存在する論理的競合があります。たとえば、特定の契約の値を物理的に取得するトリプルを表明する2つの同時ワークスペースは、互いに競合します。同様に、新しいプロジェクトを部門に割り当てたワークスペース(適切なトリプルを持つ)が、その部門の予算を削減した他のワークスペースと論理的に競合する場合があります。

DBMS_WM.lockRowsサブプログラムを使用してアプリケーション表の行で適切なWorkspace Managerロックを取得することによって、これらの競合を回避できます。たとえば、特定のリソースを記述する新しいトリプルを追加している間に、アプリケーション・ロジックが同じリソースを記述するすべてのアプリケーション表の行に対して行ロックを取得する場合があります(この場合、ロックの取得失敗は競合を示します)。

同時ワークスペース間のビジネスの競合を手動で検出して調整できる場合は、<アプリケーション表名>_DIFF Workspace Managerビューを使用して2つのワークスペース内のすべての変更の要約を取得できます。次の例の問合せは、contracts_rdf_dataという名前のバージョン対応アプリケーション表で、W2ワークスペースまたはLIVEワークスペースのいずれかで以前変更されたすべての行のトリプルをフェッチします。

begin
dbms_wm.SetDiffVersions(workspace1 => 'W2',
workspace2 => 'LIVE');
end;
/

SELECT appt.apptable_pkey, appt.triple.get_triple() triple,
wm_diffver, wm_code FROM contracts_rdf_data_diff appt;

WM_DIFFVERおよびWM_CODE列で可能な値の詳細は、『Oracle Database Workspace Manager開発者ガイド』のxxx_DIFFビューに関する項を参照してください。

この技術を使用して検出されたすべての競合については、競合するデータ変更に対して補正データ操作を実行することで解決できます。

6.5 RDFデータに対してWorkspace Managerサポートを使用する場合の特別な考慮事項

特定のいくつかのセマンティク・テクノロジ機能は、RDFデータ用のWorkspace Managerとは互換性がありません。

次のネットワークレベルの機能は、バージョン対応RDFモデルを含むセマンティク・ネットワーク上ではサポートされません。

- RDFデータ用のOracle Label Security (OLS)

- RDFデータ用の仮想プライベート・データベース(VPD)

- ドキュメントのセマンティク索引付け

- SEM_APIS.DROP_SEM_NETWORKとcascadeオプション

次のモデルレベルの機能は、バージョン対応RDFモデルではサポートされません。

- 仮想モデルへの参加

- 増分推論

- SEM_APIS.ALTER_MODEL

- SEM_APIS.MERGE_MODELS

- SEM_APIS.REMOVE_DUPLICATES

- SEM_APIS.RENAME_ENTAILMENT

- SEM_APIS.RENAME_MODEL

- SEM_APIS.SWAP_NAMES

6.6 使用フローの例: セマンティク・モデルのバージョニング

例6-1では、異なるワークスペースで伴意をどのように処理できるかを示します。この例では、コメントで個々の操作を説明します。

バージョン対応RDFモデルに関する次の制限事項および考慮事項に注意してください(これらは例6-1に反映されています)。

- バージョン対応RDFモデルを含む伴意に対しては、増分推論はサポートされていません。

- すでに作成された伴意はSEM_APIS.CREATE_ENTAILMENTをコールすることでVALIDにできますが、RDFモデルに関連するアプリケーション表をバージョン対応にした場合は新しい伴意を作成できません。

- SEM_MATCHのパターン引数は、古い(中カッコでない)構文を使用する必要があります。

- バージョン対応モデルに関連するSEM_APIS.CREATE_ENTAILMENTの起動では、次のオプションを使用する必要があります('EPT=1'(またはユーザー定義ルールが使用される場合はoptions => 'USER_RULES=T,EPT=1'))。

例6-1 セマンティク・モデルのバージョニング

set pagesize 10000

-- 1. Enabling Workspace Manager Support for RDF Data
conn / as sysdba
@?/md/admin/sdordfwm.sql

set echo on
column x format a10
column y format a10

column owner format a10
column index_name format a12
column index_view_name format a18
column status format a10

-- create sem network and a test user
exec sem_apis.create_sem_network('SYSAUX');
grant connect,resource,unlimited tablespace to rdfuser identified by rdfuser;

-- 2. Create table and model: then Insert triples (that will lead to some inferred triples, when entailed)

conn rdfuser/rdfuser

CREATE TABLE emp_rdf_data(id number,triple sdo_rdf_triple_s);
ALTER TABLE emp_rdf_data add CONSTRAINT emp_rdf_data_PK PRIMARY KEY (ID);

EXEC SEM_APIS.CREATE_SEM_MODEL('emp0','emp_rdf_data','triple');

insert into emp_rdf_data values (0.1, sdo_rdf_triple_s('emp0','<Man>','rdfs:subClassOf','<Person>'));
insert into emp_rdf_data values (0.2, sdo_rdf_triple_s('emp0','<Woman>','rdfs:subClassOf','<Person>'));
insert into emp_rdf_data values (1, sdo_rdf_triple_s('emp0','<John>','rdf:type','<Man>'));

-- 3. Create entailments: one with user-def rules only and the other with OWL

exec sdo_rdf_inference.create_rulebase('family_rb');

insert into mdsys.rdfr_family_rb values (
'R1',
'(?x rdf:type <Man>)',
NULL,
'(?x rdf:type <Male>)',
NULL);

insert into mdsys.rdfr_family_rb values (
'R2',
'(?x rdf:type <Woman>)',
NULL,
'(?x rdf:type <Female>)',
NULL);

begin
sem_apis.create_entailment(
index_name_in => 'emp0_u_idx',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('family_rb'),
options => 'USER_RULES=T,EPT=1');
end;
/

begin
sem_apis.create_entailment(
index_name_in => 'emp0_idx',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('owlprime'),
options => 'EPT=1');
end;
/

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 4. Activate versioning and re-try the queries

EXEC dbms_wm.enableVersioning (table_name => 'emp_rdf_data');

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 4a. [fail] try to create a post-versioning entailment for testing

begin
sem_apis.create_entailment(
index_name_in => 'emp0_idx_2',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('owl2rl'),
options => 'EPT=1');
end;
/

-- 5. Create Workspace and move into that workspace

exec dbms_wm.createworkspace('W1');
exec dbms_wm.gotoWorkspace('W1');

-- 5a. [fail] in this workspace, try to create a post-versioning entailment for testing

begin
sem_apis.create_entailment(
index_name_in => 'emp0_idx_3',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('rdfs'),
options => 'EPT=1');
end;
/

-- 6. Workspace inherits the entailment from LIVE workspace (no physical copy yet)

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 7. Insert some triples => causes LIVE entailments to be copied to this workspace and marked INVALID here
insert into emp_rdf_data values (2.1, sdo_rdf_triple_s('emp0','<Mary>','rdf:type','<Woman>'));
commit;

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 8. Go back to LIVE workspace to confirm that the LIVE entailments are still VALID

disconnect
connect rdfuser/rdfuser
select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 9. Back to new workspace: make its entailments VALID

exec dbms_wm.gotoWorkspace('W1');

begin
sem_apis.create_entailment(
index_name_in => 'emp0_u_idx',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('family_rb'),
options => 'USER_RULES=T,EPT=1');
end;
/

begin
sem_apis.create_entailment(
index_name_in => 'emp0_idx',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('owlprime'),
options => 'EPT=1');
end;
/

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 10. Go back to LIVE workspace to confirm that the entailments there are still VALID

disconnect
connect rdfuser/rdfuser
select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 11. Insert a new row into LIVE model => causes LIVE entailments to become INVALID

insert into emp_rdf_data values (3, sdo_rdf_triple_s('emp0','<Gary>','rdf:type','<Man>'));
commit;

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 12. Back to new workspace: confirm that its entailment is still VALID

exec dbms_wm.gotoWorkspace('W1');

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 13. Back to LIVE workspace: make the entailments VALID again

disconnect
connect rdfuser/rdfuser

begin
sem_apis.create_entailment(
index_name_in => 'emp0_u_idx',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('family_rb'),
options => 'USER_RULES=T,EPT=1');
end;
/

begin
sem_apis.create_entailment(
index_name_in => 'emp0_idx',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('owlprime'),
options => 'EPT=1');
end;
/

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 14. Insert a new row into LIVE model => causes LIVE entailments to become INCOMPLETE

insert into emp_rdf_data values (4, sdo_rdf_triple_s('emp0','<Lory>','rdf:type','<Man>'));
commit;

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 15. make the entailments in LIVE workspace VALID again

begin
sem_apis.create_entailment(
index_name_in => 'emp0_u_idx',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('family_rb'),
options => 'USER_RULES=T,EPT=1');
end;
/

begin
sem_apis.create_entailment(
index_name_in => 'emp0_idx',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('owlprime'),
options => 'EPT=1');
end;
/

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 16. merge workspace: this should make the LIVE entailments INVALID
conn rdfuser/rdfuser
exec dbms_wm.mergeWorkspace('W1');

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- 17. remove workspace
exec dbms_wm.removeWorkspace('W1');

-- 18. disable versioning, refresh the INVALID entailments to make them VALID, and then query
exec dbms_wm.disableVersioning('emp_rdf_data');

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

begin
sem_apis.create_entailment(
index_name_in => 'emp0_u_idx',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('family_rb'),
options => 'USER_RULES=T,EPT=1');
end;
/

begin
sem_apis.create_entailment(
index_name_in => 'emp0_idx',
models_in => SDO_RDF_Models('emp0'),
rulebases_in => SDO_RDF_Rulebases('owlprime'),
options => 'EPT=1');
end;
/

select * from mdsys.rdf_rules_index_info;
select count(*) from mdsys.rdfi_emp0_u_idx;
select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2;
select count(*) from mdsys.rdfi_emp0_idx;
select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1;

-- cleanup
exec sem_apis.drop_entailment('EMP0_IDX');
exec sem_apis.drop_entailment('EMP0_U_IDX');
exec sem_apis.drop_sem_model('EMP0');
exec sem_apis.drop_rulebase('FAMILY_RB');
drop table emp_rdf_data;
conn / as sysdba
drop user rdfuser cascade;

7 Jena Adapter for Oracle Database

Jena Adapter for Oracle Database (以降、Jena Adapter)は、既知のJenaグラフ、JenaモデルおよびJena DatasetGraphのAPIを実装することによって、Oracle Databaseセマンティク・テクノロジへのJavaベースのインタフェースを提供します。(Apache Jenaはオープン・ソースのフレームワークであり、そのライセンスと著作権条件についてはhttp://jena.sourceforge.net/license.htmlで説明されています。)

名前付きグラフ・データ(クワッドとも呼ぶ)の管理には、DatasetGraph APIを使用します。また、Jena Adapterは、Oracle Spatialのネットワーク・データ・モデルと統合することで、セマンティク・データでのネットワーク解析ファンクションを提供します。

この章では、第1章「Oracle Databaseセマンティク・テクノロジの概要」および第2章「OWLの概念」で説明されている主要な概念について十分に理解していることが前提です。Jena Javaフレームワークの全体的な機能および使用についても十分に理解していることを前提とします。Jenaフレームワークの詳細は、http://jena.apache.org/の、特に「Quick Links」の下にある「Documentation link」を参照してください。ネットワーク解析ファンクションを使用するには、『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』に説明されているOracle Spatialのネットワーク・データ・モデルについても理解しておく必要があります。

Jena Adapterは、Oracle Databaseリリース11.2のRDFおよびOWLのセマンティク・データ管理機能を拡張します。

この章には次の主要なトピックがあります。

- 7.1項「ソフトウェア環境の設定」

- 7.2項「SPARQLサービスの設定」

- 7.3項「セマンティク・テクノロジ環境の設定」

- 7.4項「SEM_MATCHとJena Adapter問合せの比較」

- 7.5項「SPARQL問合せ処理の最適化」

- 7.6項「他の機能をサポートするためのSPARQL構文への追加」

- 7.7項「Jena Adapterを介してSPARQL問合せでサポートされるファンクション」

- 7.8項「SPARQLの更新のサポート」

- 7.9項「RDFデータの解析ファンクション」

- 7.10項「サーバー側APIのサポート」

- 7.11項「Jena Adapterを使用したバルク・ロード」

- 7.12項「自動的な変数の名前変更」

- 7.13項「JavaScript Object Notation (JSON)形式のサポート」

- 7.14項「その他の推奨事項とガイドライン」

- 7.15項「Jena Adapterを使用した問合せ例」

- 7.16項「SPARQL Gatewayとセマンティク・データ」

免責事項:
現行のJena Adapterリリースは、Jena 2.6.4、ARQ 2.8.8およびJoseki 3.4.4に対してテストされたものです。オープン・ソース・プロジェクトの性質上、これ以上のバージョンのJena、ARQまたはJosekiでは、このJena Adapterを使用しないでください。

7.1 ソフトウェア環境の設定

Jena Adapterを使用するには、システム環境に必要なソフトウェア(Oracle Database 11gリリース2(SpatialオプションおよびPartitioningのオプションを含み、セマンティク・テクノロジのサポートが有効になっている)、Jenaバージョン2.6.4、Jena AdapterおよびJDK 1.6)があることを最初に確認する必要があります。次のアクションを実行することによって、ソフトウェア環境を設定できます。

1. Oracle Databaseリリース11.2 Enterprise Editionと、Oracle SpatialオプションおよびOracle Partitioningオプションをインストールします。

2. リリース11.2.0.3以上をまだインストールしていない場合は、Oracle Database Serverの11.2.0.2パッチ・セット(https://updates.oracle.com/Orion/PatchDetails/process_form?patch_num=10098816)をインストールします。

3. A.1項の説明のとおり、セマンティク・テクノロジのサポートを有効にします。

4. Jena (バージョン2.6.4)をインストールします(http://sourceforge.net/projects/jena/files/Jena/Jena-2.6.4/jena-2.6.4.zip/downloadから.zipファイルをダウンロードして解凍します)。(このファイルの解凍先となるディレクトリまたはフォルダは、<Jena_DIR>と表されます。)
Javaパッケージは<Jena_DIR>に解凍されます。

Jena 2.6.4にはARQバージョン2.8.7 (arq-2.8.7.jar)が付属していますが、実際は、このバージョンのJena Adapterには、より新しいARQバージョン(arq-2.8.8.jar)が必要です。http://sourceforge.net/projects/jena/files/ARQ/ARQ-2.8.8/arq-2.8.8.zip/downloadからarq-2.8.8.jarをダウンロードして、一時ディレクトリに解凍できます。<Jena_DIR>/Jena-2.6.4/lib/からarq-2.8.7.jarファイルを削除し、一時ディレクトリから<Jena_DIR>/Jena-2.6.4/lib/にarq-2.8.8.jarをコピーします。

5. Oracle Databaseセマンティク・テクノロジのページ(http://www.oracle.com/technetwork/database/options/semantic-tech/で「Downloads」をクリック)からJena Adapter (jena_adaptor_for_release11.2.0.3.zip)をダウンロード して、(Linuxシステムの) /tmp/jena_adapterなどの一時ディレクトリに解凍します。(この一時ディレクトリがまだ存在していない場合は、解凍操作の前に作成します。)
Jena Adapterのディレクトリとファイルの構造は、次のとおりです。

examples/
examples/Test10.java
examples/Test11.java
examples/Test12.java
examples/Test13.java
examples/Test14.java
examples/Test15.java
examples/Test16.java
examples/Test17.java
examples/Test18.java
examples/Test19.java
examples/Test20.java
examples/Test6.java
examples/Test7.java
examples/Test8.java
examples/Test9.java
examples/Test.java
jar/
jar/sdordfclient.jar
javadoc/
javadoc/javadoc.zip
joseki/
joseki/index.html
joseki/application.xml
joseki/update.html
joseki/xml-to-html.xsl
joseki/joseki-config.ttl
sparqlgateway/
default.xslt
noop.xslt
qb1.sparql
. . .
browse.jsp
index.html
. . .
application.xml
WEB-INF/
WEB-INF/web.xml
WEB-INF/weblogic.xml
WEB-INF/lib/
StyleSheets/
StyleSheets/paginator.css
StyleSheets/sg.css
StyleSheets/sgmin.css
Scripts/
Scripts/load.js
Scripts/paginator.js
Scripts/tooltip.js
admin/
admin/sparql.jsp
admin/xslt.jsp
web/
web/web.xml

6. ojdbc6.jarを<Jena_DIR>/lib (Linuxの場合)または<Jena_DIR>\lib (Windows)にコピーします。(ojdbc6.jarは、$ORACLE_HOME/jdbc/libまたは%ORACLE_HOME%\jdbc\libにあります。)

7. sdordf.jarを<Jena_DIR>/lib (Linuxの場合)または<Jena_DIR>\lib (Windows)にコピーします。(sdordf.jarは、$ORACLE_HOME/md/jlibまたは%ORACLE_HOME%\md\jlibにあります。)

8. JDK 1.6がまだインストールされていない場合は、インストールします。

9. JAVA_HOME環境変数にまだJDK 1.6インストールが指定されていない場合は、適切に定義します。次に例を示します。

setenv JAVA_HOME /usr/local/packages/jdk16/

10. SPARQLプロトコルをサポートするためのSPARQLサービスが設定されていない場合は、7.2項の説明のとおりに設定します。

ソフトウェア環境を設定した後、7.3項の説明にあるとおり、セマンティク・テクノロジ環境でJena Adapterを使用して問合せを実行できることを確認します。

7.2 SPARQLサービスの設定

Jena Adapterを使用してSPARQLエンドポイントを設定するには、Joseki (SPARQLプロトコルとSPARQL問合せをサポートするオープン・ソースのHTTPエンジン)をダウンロードする必要があります。この項では、WebLogic Serverにデプロイされるサーブレットを使用して、SPARQLサービスを設定する方法について説明します。Oracleではすべての依存するサードパーティ・ライブラリを.warまたは.earファイルにバンドルすることが許可されていないため、手順が多く複雑になっています。

1. Oracle WebLogic Server 11gリリース1 (10.3.1)をダウンロードしてインストールします。詳細は、http://www.oracle.com/technology/products/weblogic/およびhttp://www.oracle.com/technetwork/middleware/ias/downloads/wls-main-097127.htmlを参照してください。

2. Java 6がインストールされていることを確認します(Joseki 3.4.4に必要であるため)。

3. http://sourceforge.net/projects/joseki/files/Joseki-SPARQL/からJoseki 3.4.4 (joseki-3.4.4.zip)をダウンロードします。

4. joseki-3.4.4.zipを一時ディレクトリに解凍します。次に例を示します。

mkdir /tmp/joseki
cp joseki-3.4.4.zip /tmp/joseki
cd /tmp/joseki
unzip joseki-3.4.4.zip

5. 7.1項の説明にあるとおり、Jena Adapter for Oracle Databaseがダウンロードされ解凍されていることを確認します。

6. jena_adapterディレクトリと同じレベルにjoseki.warという名前のディレクトリを作成し、そのディレクトリに移動します。次に例を示します。

mkdir /tmp/joseki.war
cd /tmp/joseki.war

7. 前述の手順で作成したディレクトリに必要なファイルをコピーします。

cp /tmp/jena_adapter/joseki/*  /tmp/joseki.war
cp -rf /tmp/joseki/Joseki-3.4.4/webapps/joseki/StyleSheets  /tmp/joseki.war

8. 次のように、ディレクトリを作成し、必要なファイルをそれらのディレクトリにコピーします。

mkdir /tmp/joseki.war/WEB-INF
cp /tmp/jena_adapter/web/*  /tmp/joseki.war/WEB-INF

mkdir /tmp/joseki.war/WEB-INF/lib
cp /tmp/joseki/Joseki-3.4.4/lib/*.jar   /tmp/joseki.war/WEB-INF/lib
cp /tmp/jena_adapter/jar/*.jar   /tmp/joseki.war/WEB-INF/lib
##
## Assume ORACLE_HOME points to the home directory of a Release 11.2.0.3 Oracle Database.
##
cp $ORACLE_HOME/md/jlib/sdordf.jar /tmp/joseki.war/WEB-INF/lib
cp $ORACLE_HOME/jdbc/lib/ojdbc6.jar /tmp/joseki.war/WEB-INF/lib

9. WebLogic Server管理コンソールを使用し、OracleSemDSという名前のJ2EEデータ・ソースを作成します。データ・ソースの作成中に、SPARQL問合せの実行対象になる関連セマンティク・データを含むデータベース・スキーマのユーザーとパスワードを指定できます。
このデータ・ソースの作成に関する情報は、7.2.1項「WebLogic Serverを使用した必要なデータ・ソースの作成」を参照してください。

10. 次のように、WebLogic Serverのautodeployディレクトリに移動し、ファイルをコピーします。(開発ドメインでの自動デプロイ・アプリケーションの詳細は、http://docs.oracle.com/cd/E11035_01/wls100/deployment/autodeploy.htmlを参照してください。)

cd <domain_name>/autodeploy
cp -rf  /tmp/joseki.war  <domain_name>/autodeploy

前述の例で、<domain_name>はWebLogic Serverドメインの名前です。

WebLogic Serverドメインを2つの異なるモード(開発とプロダクション)で実行することはできますが、自動デプロイメント機能を使用できるのは開発モードのみであることに注意してください。

11. ファイルとディレクトリの構造を調べて、次が反映されているかどうかを確認します。

.
|-- META-INF
|   `-- MANIFEST.MF
|-- StyleSheets
|   `-- joseki.css
|-- WEB-INF
|   |-- lib
|   |   |-- arq-2.8.8-tests.jar
|   |   |-- arq-2.8.8.jar
|   |   |-- icu4j-3.4.4.jar
|   |   |-- iri-0.8.jar
|   |   |-- jena-2.6.4-tests.jar
|   |   |-- jena-2.6.4.jar
|   |   |-- jetty-6.1.25.jar
|   |   |-- jetty-util-6.1.25.jar
|   |   |-- joseki-3.4.4.jar
|   |   |-- junit-4.5.jar
|   |   |-- log4j-1.2.14.jar
|   |   |-- lucene-core-2.3.1.jar
|   |   |-- ojdbc6.jar
|   |   |-- sdb-1.3.4.jar
|   |   |-- sdordf.jar
|   |   |-- sdordfclient.jar
|   |   |-- servlet-api-2.5-20081211.jar
|   |   |-- slf4j-api-1.5.8.jar
|   |   |-- slf4j-log4j12-1.5.8.jar
|   |   |-- stax-api-1.0.1.jar
|   |   |-- tdb-0.8.10.jar
|   |   |-- wstx-asl-3.2.9.jar
|   |   `-- xercesImpl-2.7.1.jar
|   `-- web.xml
|-- application.xml
|-- index.html
|-- joseki-config.ttl
|-- update.html
`-- xml-to-html.xsl

12. /tmp/joseki.warディレクトリから.warファイルを作成する場合は(JosekiをOC4Jコンテナにデプロイする場合は、.warファイルが必要であることに注意します)、次のコマンドを入力します。

cd /tmp/joseki.war
jar cvf /tmp/joseki_app.war *

13. WebLogic Serverを起動または再起動します。

14. Webブラウザを使用して、書式http://<hostname>:7001/josekiのURL (Webアプリケーションはポート7001でデプロイされているとします)に接続し、デプロイメントを確認します。
「Oracle SPARQL Service Endpoint using Joseki」というタイトルのページが表示され、最初のテキスト・ボックスにSPARQLの問合せ例が入力されています。

15. 「Submit Query」をクリックします。
「Oracle SPARQL Endpoint Query Results」というタイトルのページが表示されます。問合せが実行される基礎となるセマンティク・モデルに応じて、結果がある場合とない場合があります。

デフォルトでは、joseki-config.ttlファイルには、M_NAMED_GRAPHSという名前のモデルを使用したoracle:Dataset定義が含まれます。次のスニペットは、構成を示しています。oracle:allGraphsの述語は、SPARQLサービス・エンドポイントがM_NAMED_GRAPHSモデルに格納されているすべてのグラフを使用して問合せを処理することを意味します。

<#oracle> rdf:type oracle:Dataset;
joseki:poolSize     1 ;         ## Number of concurrent connections allowed to this dataset.
oracle:connection
[ a oracle:OracleConnection ;
];
oracle:allGraphs [ oracle:firstModel "M_NAMED_GRAPHS" ] .

M_NAMED_GRAPHSモデルがまだ存在しない場合は、初回のSPARQL問合せリクエスト時に自動的に作成されます。トリプルおよびクワッドの例をいくつか追加して、名前付きグラフ機能をテストできます。その例は次のとおりです。

SQL> CONNECT username/password
SQL> INSERT INTO m_named_graphs_tpl VALUES(sdo_rdf_triple_s('m_named_graphs','<urn:s>','<urn:p>','<urn:o>'));
SQL> INSERT INTO m_named_graphs_tpl VALUES(sdo_rdf_triple_s('m_named_graphs:<urn:G1>','<urn:g1_s>','<urn:g1_p>','<urn:g1_o>'));
SQL> INSERT INTO m_named_graphs_tpl VALUES(sdo_rdf_triple_s('m_named_graphs:<urn:G2>','<urn:g2_s>','<urn:g2_p>','<urn:g2_o>'));
SQL> COMMIT;

行を挿入した後、http://<hostname>:7001/josekiに移動し、次のSPARQL問合せを入力して、「Submit Query」をクリックします。

SELECT ?g ?s ?p ?o
WHERE
{ GRAPH ?g { ?s ?p ?o} }

結果は、4つの列と2つの結果バインディング・セットがあるHTML表になります。

http://<hostname>:7001/josekiページには、「JSON Output」オプションも含まれます。このオプションを選択する(有効にする)と、SPARQL問合せのレスポンスがJSON形式に変換されます。

7.2.1 WebLogic Serverを使用した必要なデータ・ソースの作成

WebLogic Server管理コンソールを使用して必要なJ2EEデータ・ソースを作成するには、次の手順に従います。

1. http://<hostname>:7001/consoleにログインします。

2. 「ドメイン構造」パネルで、「サービス」をクリックします。

3. 「JDBC」をクリックします。

4. 「データ・ソース」をクリックします。

5. 「JDBCデータ・ソースのサマリー」パネルで、「データ・ソース」表の下の「新規」をクリックします。

6. 「新しいJDBCデータ・ソースの作成」パネルで、次の値を入力または選択します。
名前: OracleSemDS

JNDI名: OracleSemDS

データベースのタイプ: Oracle

データベース・ドライバ: Oracle's Driver (Thin) Versions: 9.0.1,9.2.0,10,11

7. 「次」を2回クリックします。

8. 「接続プロパティ」パネルで、「データベース名」、「ホスト名」、「ポート」、「データベース・ユーザー名」(セマンティク・データを含むスキーマ)、「パスワード」のフィールドに適切な値を入力します。

9. 「次」をクリックします。

10. このOracleSemDSデータ・ソースをデプロイするターゲット・サーバー(1つまたは複数)を選択します。

11. 「終了」をクリックします。
すべての変更がアクティブ化されており、再起動は必要ないというメッセージが表示されます。

7.2.2 SPARQLサービスの構成

デフォルトでは、SPARQLサービスのエンドポイントは、プリセット名を持つセマンティク・モデルに対して問合せが実行されることが前提になっています。このセマンティク・モデルは、JNDI名OracleSemDSを持つJ2EEデータ・ソースで指定されているスキーマに所有されています。このモデルはPL/SQLやJavaを使用して明示的に作成する必要はないことに注意してください(モデルがネットワークに存在しない場合は、必要なアプリケーション表や索引とあわせて自動的に作成されます)。

注意:
2011年11月のJena Adapterリリースから、アプリケーション表索引(<model_name>_idx)定義が、名前付きグラフ・データ(クワッド)に対応するように変更されました。
以前のバージョンのJena Adapterで作成された既存のモデルについては、oracle.spatial.rdf.client.jenaパッケージのstatic OracleUtils.migrateApplicationTableIndex(oracle, graph, dop)メソッドを使用して、アプリケーション表索引の名前と定義を移行できます。(詳細は、Javadocを参照してください。)新しい索引定義は、アプリケーション表に対するDML操作のパフォーマンスにとって非常に重要です。

ただし、<domain_name>/autodeploy/joseki.warに格納されているjoseki-config.ttl構成ファイルを編集することにより、SPARQLサービスを構成する必要があります。

用意されているjoseki-config.ttlファイルには、Oracleデータセット用に次のようなセクションが含まれます。

#
## Datasets
#
[] ja:loadClass "oracle.spatial.rdf.client.jena.assembler.OracleAssemblerVocab" .

oracle:Dataset  rdfs:subClassOf  ja:RDFDataset .

<#oracle> rdf:type oracle:Dataset;
joseki:poolSize     1 ;         ## Number of concurrent connections allowed to this dataset.
oracle:connection
[ a oracle:OracleConnection ;
];
oracle:defaultModel [ oracle:firstModel "TEST_MODEL" ] .

ファイルのこのセクションでは、次のことができます。

- joseki:poolSize値を変更します(この値は、データベース内の様々なRDFモデルをポイントする、このOracleデータセット(<#oracle> rdf:type oracle:Dataset;)に許可される同時接続数を指定します。)

- 問合せに対して異なるセマンティク・モデルを使用するために、defaultModelの名前(またはoracle:firstModel述語のオブジェクト値)を変更します。また、このdefaultModelに対して複数のモデルおよび1つ以上のルールベースを指定することもできます。
たとえば、次のように(ABOXとTBOXという名前の)2つのモデルとOWLPRIMEルールベースをデフォルトのモデルに対して指定できます。oracle:modelName述語を使用して指定されるモデルは存在している必要があることに注意します(これらのモデルは自動的には作成されません)。

<#oracle> rdf:type oracle:Dataset;
joseki:poolSize 1 ; ## Number of concurrent connections allowed to this dataset.
oracle:connection
[ a oracle:OracleConnection ;
];
oracle:defaultModel [ oracle:firstModel "ABOX";
oracle:modelName "TBOX";
oracle:rulebaseName "OWLPRIME" ] .

- データセットで名前付きグラフを指定します。たとえば次のようにして、2つのOracleモデルと1つの伴意に基づき、<http://G1>と呼ばれる名前付きグラフを作成できます。

<#oracle> rdf:type oracle:Dataset;
joseki:poolSize 1 ; ## Number of concurrent connections allowed to this dataset.
oracle:connection
[ a oracle:OracleConnection ;
];
oracle:namedModel [ oracle:firstModel "ABOX";
oracle:modelName "TBOX";
oracle:rulebaseName "OWLPRIME";
oracle:namedModelURI <http://G1> ]  .

namedModelオブジェクトには、defaultModelと同じ指定が可能であるため、仮想モデルがここでも同様にサポートされます(次の項目も参照)。

- 次の例に示すとおり、oracle:useVM "TRUE"を追加することによって、問合せに仮想モデルを使用します。指定した仮想モデルが存在しない場合は、必要に応じて自動的に作成されることに注意してください。

<#oracle> rdf:type oracle:Dataset;
joseki:poolSize 1 ; ## Number of concurrent connections allowed to this dataset.
oracle:connection
[ a oracle:OracleConnection ;
];
oracle:defaultModel [ oracle:firstModel "ABOX";
oracle:modelName "TBOX";
oracle:rulebaseName "OWLPRIME";
oracle:useVM "TRUE"
] .

詳細は、7.10.1項「仮想モデルのサポート」を参照してください。

- 次のTRIPLE_DATA_VM_0という名前の仮想モデルを使用する例に示すとおり、述語oracle:virtualModelNameを使用することで、SPARQL問合せに応答するためのデフォルトのモデルとして仮想モデルを指定します。

oracle:defaultModel [ oracle:virtualModelName "TRIPLE_DATA_VM_0" ] .

基礎となるデータがクワッドで構成される場合、oracle:virtualModelNameとともにoracle:allGraphsを使用できます。oracle:allGraphsを使用することで、DatasetGraphOracleSemオブジェクトのインスタンス化が名前付きグラフ問合せへの応答になります。次に例を示します。

oracle:allGraphs [ oracle:virtualModelName "QUAD_DATA_VM_0" ] .

仮想モデル名がデフォルトのグラフとして指定されると、エンドポイントは問合せリクエストのみに対応し、SPARQL更新操作はサポートされないことに注意してください。

- 問合せの動作と推定更新モードを変更するには、queryOptionsとinferenceMaintenanceプロパティを設定します。(QueryOptionsとInferenceMaintenanceModeの詳細は、Javadocを参照してください。)
デフォルトでは、問合せの柔軟性と効率を最大限にするため、QueryOptions.ALLOW_QUERY_INVALID_AND_DUPとInferenceMaintenanceMode.NO_UPDATEが設定されます。

7.2.2.1 クライアント識別子

Jena Adapterによって作成または使用されたデータベース接続ごとに、クライアント識別子が関連付けられます。クライアント識別子は、特にReal Application Cluster (Oracle RAC)環境で、パフォーマンス分析とチューニングを実行しているときに、他のデータベース・アクティビティからJena Adapter関連のアクティビティを分離するために役立ちます。

デフォルトで割り当てられるクライアント識別子は、JenaAdapterです。ただし、次の形式を使用してJava VM clientIdentifierプロパティを設定することによって、異なる値を指定できます。

-Doracle.spatial.rdf.client.jena.clientIdentifier=<identificationString>

データベース側でJena Adapter関連のアクティビティのみのトレースを開始するには、DBMS_MONITOR.CLIENT_ID_TRACE_ENABLEプロシージャを使用します。次に例を示します。

SQL> EXECUTE DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE('JenaAdapter', true, true);

7.2.2.2 アプリケーション表およびステージング表に対するOLTP圧縮の使用

デフォルトでは、Jena Adapterは、次の構文に従った基本的な表圧縮を使用して、アプリケーション表と任意のステージング表(後者は7.11項で説明されているようにバルク・ロードに使用される)を作成します。

CREATE TABLE .... (... column definitions ...) ... compress;

ただし、データベースにOracle Advanced Compressionオプションの使用がライセンスされている場合は、次のJVMプロパティを設定してOLTP圧縮をオンにできますので、これによって基礎となるアプリケーション表とステージング表に対するすべてのDML操作時にデータが圧縮されます。

-Doracle.spatial.rdf.client.jena.advancedCompression="compress for oltp"

7.2.3 長時間にわたるSPARQL問合せの終了

一部のアプリケーションでは長時間にわたるSPARQL問合せを終了できるようにする必要があるため、Jena AdapterとJosekiの設定で強制終了のフレームワークが導入されています。基本的に、実行に時間がかかる可能性がある問合せに対しては、それぞれに一意の問合せID (qid)値を指定する必要があります。

たとえば、次のSPARQL問合せでは、すべてのトリプルの主語を選択します。リクエストに応じてこの問合せを終了できるように、問合せID (qid)が設定されます。

PREFIX ORACLE_SEM_FS_NS:  <http://example.com/semtech#qid=8761>
SELECT ?subject WHERE {?subject ?property ?object }

qid属性値は、長整数型です。qidの値は、独自のアプリケーション・ニーズに基づき、特定の問合せにあわせて選択できます。

qid値とともに送信されたSPARQL問合せを終了するには、アプリケーションから次の形式で強制終了リクエストをサーブレットに送信し、一致するQID値を指定します。

http://<hostname>:7001/joseki/querymgt?abortqid=8761

7.2.4 非ASCII文字のN-Tripleエンコーディング

RDFリソースの字句表現において、文字がOracle Databaseに挿入される際に、非ASCII文字に対して\uHHHH N-Tripleエンコーディングが使用されます。(N-Tripleエンコーディングの詳細は、http://www.w3.org/TR/rdf-testcases/#ntrip_grammarを参照してください。)SPARQL問合せにおける定数リソースのエンコーディングは、同じように処理されます。

\uHHHH N-Tripleエンコーディングを使用することによって、サポートされるUnicodeキャラクタ・セットがOracle Databaseで使用されていない場合でも、国際的な文字(ノルウェー語とスウェーデンの文字の混在など)のサポートが可能になります。

7.3 セマンティク・テクノロジ環境の設定

Jena Adapterを使用して問合せを実行するには、(適切な権限を持つ)任意のユーザーで接続し、セマンティク・ネットワークで任意のモデルを使用します。セマンティク・テクノロジ環境が要件をすでに満たしている場合は、Jena Adapterを使用するJavaコードを直接コンパイルして実行できます。Jena Adapterを使用できるようにセマンティク・テクノロジ環境を設定していない場合は、次の例のような手順を実行します。

1. SYSDBAロールを持つSYSとして接続します。

sqlplus sys/<password-for-sys> as sysdba

2. システム表の表領域を作成します。次に例を示します。

CREATE TABLESPACE rdf_users datafile 'rdf_users01.dbf'
size 128M reuse autoextend on next 64M
maxsize unlimited segment space management auto;

3. セマンティク・ネットワークを作成します。次に例を示します。

EXECUTE sem_apis.create_sem_network('RDF_USERS');

4. (セマンティク・ネットワークとJena Adapterを使用するデータベースに接続するための)データベース・ユーザーを作成します。次に例を示します。

CREATE USER rdfusr IDENTIFIED BY <password-for-udfusr>
DEFAULT TABLESPACE rdf_users;

5. このデータベース・ユーザーに必要な権限を付与します。次に例を示します。

GRANT connect, resource TO rdfusr;

6. 独自のセマンティク・データとともにJena Adapterを使用するには、1.10項「セマンティク・データを使用するためのクイック・スタート」の説明のとおり、適切な手順を実行してデータを格納し、モデルを作成して、データベース索引を作成します。その後、Javaコードをコンパイルして実行することで問合せを実行します(問合せの例については、7.15項を参照してください)。
Jena Adapterと提供されたサンプル・データを使用する場合は、7.15項を参照してください。

7.4 SEM_MATCHとJena Adapter問合せの比較

Oracle Databaseに格納されているセマンティク・データを問い合せるには、SEM_MATCHベースのSQL文と、Jena Adapterを介したSPARQL問合せの2つの方法があります。それぞれの方法での問合せは、表面的には類似していますが、動作には重要な違いがあります。アプリケーションの動作を一貫性のあるものにするには、SEM_MATCH問合せとSPARQL問合せの違いを理解し、その問合せ結果を処理する際に注意を払う必要があります。

2つの方法を次の簡単な例で示します。

問合せ1 (SEM_MATCHベース)

select s, p, o
from table(sem_match('{?s ?p ?o}', sem_models('Test_Model'), ....))

問合せ2 (Jena Adapterを介したSPARQL問合せ)

select ?s ?p ?o
where {?s ?p ?o}

これらの2つの問合せは、同じ種類の機能を実行しますが、いくつか重要な違いがあります。問合せ1 (SEM_MATCHベース)は次のようになります。

- Test_Modelからすべてのトリプルを読み取ります。

- URI、bNode、プレーン・リテラルおよび型付きリテラルを区別せず、長いリテラルを処理しません。

- 特定の文字('\n'など)はエスケープ解除しません。

問合せ2 (Jena Adapterを介して実行されるSPARQL問合せ)もTest_Modelからすべてのトリプルを読み取ります(同じ基礎となるTest_Modelを参照しているModelOracleSemに対してコールを実行したと想定します)。ただし、問合せ2は次のようになります。

- (SEM_MATCHテーブル・ファンクションにおけるs、pおよびo列のみではなく)追加の列を読み取り、URI、bNodes、プレーン・リテラル、型付きリテラルおよび長いリテラルを区別します。これによって、Jena Nodeオブジェクトを適切に作成できるようになります。

- Oracle Databaseに格納される際にエスケープされる文字をエスケープ解除します。

2つの方法でのもう1つの違いは、空白ノード処理です。

- SEM_MATCHベースの問合せにおいて、空白ノードは常に定数とみなされます。

- SPARQL問合せにおいて、<と>で囲まれていない空白ノードは、問合せがJena Adapterを介して実行されるときに変数とみなされます。これは、SPARQL標準セマンティクと一致します。ただし、<と>で囲まれた空白ノードは、問合せが実行されるときに定数とみなされ、空白ノード・ラベルには、基礎となるデータのモデル化で必要とされる適切な接頭辞が、Jena Adapterによって追加されます。

Jena Adapter APIを使用して作成されるセマンティク・モデルの名前の最大長は、22文字です。

7.5 SPARQL問合せ処理の最適化

この項では、SPARQL問合せ処理を強化できる、Jena Adapterのいくつかのパフォーマンス関連機能について説明します。これらの機能は、デフォルトでは自動的に実行されます。

この項では、CONSTRUCT機能やプロパティ・パスなど、SPARQLについての知識があることを前提としています。

7.5.1 単一のSEM_MATCHコールへのSPARQL問合せのコンパイル

DISTINCT、OPTIONAL、FILTER、UNION、ORDER BYおよびLIMITを含むSPARQL問合せは、単一のOracle SEM_MATCHテーブル・ファンクションに変換されます。SEM_MATCHでサポートされないSPARQL機能(CONSTRUCTなど)を使用しているために、問合せを直接SEM_MATCHに変換できない場合、Jena Adapterは、ハイブリッドな方法を採用し、単一のSEM_MATCHファンクションを使用して問合せの最も大きな部分を実行しながら、Jena ARQ問合せエンジンを使用して残りの部分の実行を試みます。

たとえば、次のSPARQL問合せは、単一のSEM_MATCHテーブル・ファンクションに直接変換されます。

PREFIX dc:  <http://purl.org/dc/elements/1.1/>
PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?person ?name
WHERE {
{?alice foaf:knows ?person . }
UNION {
?person ?p ?name. OPTIONAL { ?person ?x ?name1 }
}
}

一方、次の問合せ例は、CONSTRUCTキーワードのため、単一のSEM_MATCHテーブル・ファンクションに直接変換できません。

PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>
CONSTRUCT  { <http://example.org/person#Alice> vcard:FN ?obj }
WHERE  { { ?x <http://pred/a> ?obj.}
UNION
{ ?x <http://pred/b> ?obj.}  }

この場合、Jena Adapterは、内側のUNION問合せを単一のSEM_MATCHテーブル・ファンクションに変換し、次にその結果セットをさらに評価するため、Jena ARQ問合せエンジンに渡します。

7.5.2 プロパティ・パスの処理の最適化

Jenaに定義されているとおり、プロパティ・パスは2つのグラフ・ノード間でRDFグラフを介して使用可能なルートです。プロパティ・パスはSPARQLの拡張機能であり、RDFグラフのパターン・マッチングでプロパティに正規表現を使用できるため、基本的なグラフ・パターン問合せよりも表現力が豊かです。プロパティ・パスの詳細は、Jena ARQ問合せエンジンのドキュメントを参照してください。

Jena Adapterは、Jena ARQ問合せエンジンとの統合によって、すべてのJenaプロパティ・パス・タイプをサポートしますが、いくつかの一般的なパス・タイプは、パフォーマンスを向上するため、(SEM_MATCHベースではない)ネイティブSQL階層問合せに直接変換されます。次のタイプのプロパティ・パスは、トリプル・データを処理する際、Jena AdapterによってSQLに直接変換されます。

- 述語選択肢: (p1 | p2 | … | pn) piはプロパティURIです。

- 述語順序: (p1 / p2 / … / pn) piはプロパティURIです。

- 逆パス: ( ^ p ) pは述語URIです。

- 複雑なパス: p+、p*、p{0, n} pは選択肢、順序、逆パスまたはプロパティURIです。

この文法で対応できないパス表現は、Jena AdapterによってSQLに直接変換することができず、Jena問合せエンジンを使用して応答されます。

次の例では、パス順序を使用したプロパティ・パス表現を使用するコード・スニペットが含まれます。

String m = "PROP_PATH";

ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, m);

GraphOracleSem graph = new GraphOracleSem(oracle, m);

// populate the RDF Graph
graph.add(Triple.create(Node.createURI("http://a"),
Node.createURI("http://p1"),
Node.createURI("http://b")));

graph.add(Triple.create(Node.createURI("http://b"),
Node.createURI("http://p2"),
Node.createURI("http://c")));

graph.add(Triple.create(Node.createURI("http://c"),
Node.createURI("http://p5"),
Node.createURI("http://d")));

String query =
" SELECT ?s  " +
" WHERE {?s (<http://p1>/<http://p2>/<http://p5>)+ <http://d>.}";

QueryExecution qexec =
QueryExecutionFactory.create(QueryFactory.create(query,
Syntax.syntaxARQ), model);

try {
ResultSet results = qexec.execSelect();
ResultSetFormatter.out(System.out, results);
}
finally {
if (qexec != null)
qexec.close();
}

OracleUtils.dropSemanticModel(oracle, m);
model.close();

7.6 他の機能をサポートするためのSPARQL構文への追加

Jena Adapterにより、ヒントや追加の問合せオプションを渡すことができます。問合せオプションを含むOracle固有の名前空間を使用してSPARQL名前空間接頭辞の構文をオーバーロードすることで、これらの機能を実装できます。名前空間の形式はPREFIX ORACLE_SEM_xx_NSであり、xxの部分に機能のタイプ(ヒントならHT、APなら追加の述語など)が表されています。

7.6.1 SQLヒント

SQLヒントは、次の形式の行を含むSEM_MATCH問合せに渡すことができます。

PREFIX ORACLE_SEM_HT_NS: <http://oracle.com/semtech#hint>

ここでのhintは、SEM_MATCHによってサポートされる任意のヒントです。次に例を示します。

PREFIX ORACLE_SEM_HT_NS: <http://oracle.com/semtech#leading(t0,t1)>
SELECT ?book ?title ?isbn
WHERE { ?book <http://title> ?title. ?book <http://ISBN> ?isbn }

この例で、t0,t1は、問合せの1番目と2番目のパターンを指します。

SEM_MATCHと比較すると、ヒントの指定に若干違いがあることに注意してください。名前空間の値の構文の制限により、t0とt1 (または他のヒント・コンポーネント)を区切るには、空白ではなく、カンマ(,)を使用する必要があります。

SQLヒントの使用の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」、特にoptions属性でのHINT0キーワードに関する資料を参照してください。

7.6.2 SPARQL問合せでのバインド変数の使用

Oracle Databaseでバインド変数を使用すると、問合せの解析時間を削減し、問合せ効率と同時実行性を向上させることができます。SPARQL問合せにおけるバインド変数のサポートは、ORACLE_SEM_FS_NSと同様の名前空間プラグマ指定を通して提供されます。

アプリケーションが2つのSPARQL問合せを実行する事例について考えます(2番目(問合せ2)は、1番目(問合せ1)の結果の一部または全部に応じて異なります)。バインド変数を必要としないいくつかの方法を次に示します。

- 問合せ1の結果を繰り返して、1組の問合せを生成します。(ただし、この方法は、問合せ1の結果の数と同数の問合せを必要とします。)

- 問合せ1の結果に基づいて、SPARQLフィルタ式を構築します。

- 問合せ1を副問合せとみなします。

この場合のもう1つの方法は、次のサンプル・シナリオのように、バインド変数を使用することです。

Query 1:

SELECT ?x
WHERE { ... <some complex query> ... };

Query 2:

SELECT ?subject ?x
WHERE {?subject <urn:related> ?x .};

次の例は、Jena Adapterでバインド変数を使用するための構文を含む問合せ2を示します。

PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#no_fall_back,s2s>
PREFIX ORACLE_SEM_UEAP_NS: <http://oracle.com/semtech#x$RDFVID%20in(?,?,?)>
PREFIX ORACLE_SEM_UEPJ_NS: <http://oracle.com/semtech#x$RDFVID>
PREFIX ORACLE_SEM_UEBV_NS: <http://oracle.com/semtech#1,2,3>
SELECT ?subject ?x
WHERE {
?subject <urn:related>  ?x
};

この構文では、次の名前空間が使用されています。

- ORACLE_SEM_UEAP_NSはORACLE_SEM_AP_NSと同様ですが、ORACLE_SEM_UEAP_NSの値の部分はURLエンコードされています。値の部分は、使用する前にURLデコードされている必要があり、それによってSPARQL問合せへの追加述語とみなされます。
この例では、URLデコードの後に、このORACLE_SEM_UEAP_NS接頭辞の値部分(#文字の後)が「x$RDFVID in(?,?,?)」になります。3つの疑問符は、問合せ1の3つの値に対する暗黙的なバインディングを示します。

- ORACLE_SEM_UEPJ_NSは、関係する追加の投影を指定します。この場合、ORACLE_SEM_UEAP_NSがx$RDFVID列(問合せのSELECT句には出現しません)を参照するため、指定する必要があります。複数の投影は、カンマで区切ります。

- ORACLE_SEM_UEBV_NSは、最初にURLエンコードされ、次に連結されてカンマで区切られたバインド値のリストを指定します。

前述の問合せ例は、次の非SPARQL構文の問合せと概念的に同じであり、1、2および3はバインド値とみなされます。

SELECT ?subject ?x
WHERE {
?subject <urn:related>  ?x
}
AND ?x$RDFVID in (1,2,3);

前述の問合せ2のSPARQLの例では、3つの整数1、2および3は問合せ1からのものです。oext:build-uri-for-idファンクションを使用して、そのような内部の整数IDをRDFリソースのために生成できます。次の例は、問合せ1からの内部整数IDを取得します。

PREFIX oext: <http://oracle.com/semtech/jena-adaptor/ext/function#>
SELECT ?x  (oext:build-uri-for-id(?x) as ?xid)
WHERE { ... <some complex query> ... };

?xidの値は、<rdfvid:integer-value>の形式です。アプリケーションは、山カッコと文字列rdfvid:を無視して整数値を取り出し、これらを問合せ2に渡します。

もう1つの例として、単一の問合せ構造だが、多数の異なる定数がある可能性がある場合について考えてみます。たとえば、次のSPARQL問合せは、趣味を持っており、アプリケーションにログインしている各ユーザーの趣味を検索します。アプリケーションのユーザーは異なるURIを使用して表現されるため、このSPARQL問合せに対して様々なユーザーから様々な<uri>値が提供されます。

SELECT ?hobby
WHERE { <uri> <urn:hasHobby> ?hobby };

1つの方法(バインド変数を使用しない)は、異なる<uri>値ごとに異なるSPARQL問合せを生成することです。たとえば、ユーザーJane Doeが、次のSPARQL問合せの実行をトリガーするとします。

SELECT ?hobby WHERE {
<http://www.example.com/Jane_Doe> <urn:hasHobby> ?hobby };

一方、もう1つの方法は、ユーザーJane Doeを指定している次の例のように、バインド変数を使用することです。

PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#no_fall_back,s2s>
PREFIX ORACLE_SEM_UEAP_NS: <http://oracle.com/semtech#subject$RDFVID%20in(ORACLE_ORARDF_RES2VID(?))>
PREFIX ORACLE_SEM_UEPJ_NS: <http://oracle.com/semtech#subject$RDFVID>
PREFIX ORACLE_SEM_UEBV_NS: <http://oracle.com/semtech#http%3a%2f%2fwww.example.com%2fJohn_Doe>
SELECT ?subject ?hobby
WHERE {
?subject <urn:hasHobby>  ?hobby
};

前述の問合せ例は、次の非SPARQL構文の問合せと概念的に同じであり、http://www.example.com/Jane_Doeはバインド変数とみなされます。

SELECT ?subject ?hobby
WHERE {
?subject <urn:hasHobby>  ?hobby
}
AND ?subject$RDFVID in (ORACLE_ORARDF_RES2VID('http://www.example.com/Jane_Doe'));

この例で、ORACLE_ORARDF_RES2VIDは、URIとリテラルを内部整数ID表現に変換するファンクションです。このファンクションは、Oracle Databaseへの接続にJena Adapterが使用される際、自動的に作成されます。

7.6.3 追加のWHERE句述語

SEM_MATCH filter属性は、WHEREキーワードのないWHERE句の形式の文字列として、追加の選択基準を指定できます。追加のWHERE句述語は、次の形式の行を含むSEM_MATCH問合せに渡すことができます。

PREFIX ORACLE_SEM_AP_NS: <http://oracle.com/semtech#pred>

predは、問合せに追加されるWHERE句の内容を反映します。次に例を示します。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ORACLE_SEM_AP_NS:<http://www.oracle.com/semtech#label$RDFLANG='fr'>
SELECT DISTINCT ?inst ?label
WHERE { ?inst a <http://someCLass>. ?inst rdfs:label ?label . }
ORDER BY (?label) LIMIT 20

この例では、ラベル変数の言語タイプが'fr'である必要がある問合せに、制限事項が追加されます。

7.6.4 追加の問合せオプション

追加の問合せオプションは、次の形式の行を含むSEM_MATCH問合せに渡すことができます。

PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#option>

optionは、問合せに追加される問合せオプション(またはカンマで区切られた複数の問合せオプション)を反映します。次に例を示します。

PREFIX ORACLE_SEM_FS_NS:
<http://oracle.com/semtech#timeout=3,dop=4,INF_ONLY,ORDERED,ALLOW_DUP=T>
SELECT * WHERE {?subject ?property ?object }

次の問合せオプションがサポートされています。

- ALLOW_DUP=tは、結果が重複する場合がありますが、複数のセマンティク・モデルを問い合せるための、より高速な方法を選択します。

- TIMEOUT=nオプションを使用する場合、BEST_EFFORT_QUERY=tは、SPARQL問合せに対してn秒以内に検出されるすべての一致を戻します。

- DEGREE=nは、問合せに対して並列度(n)を文レベルで指定します。マルチコアまたはマルチCPUのプロセッサでは、異なるDOP値(4または8など)を試すと、パフォーマンスが向上する場合があります。
DEGREEと比較すると、DOPはセッション・レベルで並列度を指定します。DEGREEはDOPよりも処理オーバーヘッドが少ないため、Jena Adapterでの使用にはDEGREEが推奨されます。

- DOP=nは、問合せに対して並列度(n)をセッション・レベルで指定します。マルチコアまたはマルチCPUのプロセッサでは、異なるDOP値(4または8など)を試すと、パフォーマンスが向上する場合があります。

- INF_ONLYを指定すると、推論されたモデルのみが問い合せられます。

- JENA_EXECUTORは、SEM_MATCH (またはネイティブSQL)に対してSPARQL問合せのコンパイルを無効にし、かわりにJenaネイティブ問合せエグゼキュータが使用されます。

- JOIN=nは、SPARQL SERVICEコールからフェデレーテッド問合せへの結果を、どのように問合せの他の部分と結合できるかを指定します。フェデレーテッド問合せとJOINオプションの詳細は、7.6.4.1項を参照してください。

- NO_FALL_BACKは、SQL例外が発生した場合に、基礎となる問合せ実行エンジンがJena実行メカニズムにフォール・バックしないようにします。

- ODS=nは、動的なサンプリングのレベルを、文レベルで指定します。(動的なサンプリングの説明については、『Oracle Databaseパフォーマンス・チューニング・ガイド』の動的なサンプリングによる統計の見積りに関する説明を参照してください。)nの有効値は1から10までです。たとえば、複雑な問合せにはODS=3を試すことができます。

- ORDEREDは、最後に必要なRDF_VALUE$結合を実行している間、問合せトリプル・パターン結合のために主要なSQLヒントに変換されます。

- PLAIN_SQL_OPT=Fは、問合せを直接SQLにネイティブ・コンパイルする機能を無効にします。

- QID=nは、問合せID番号を指定します(この機能は、問合せに応答がない場合、その問合せを取り消すために使用できます)。

- RESULT_CACHEは、問合せにOracle RESULT_CACHEディレクティブを使用します。

- REWRITE=Fは、SEM_MATCHテーブル・ファンクションに対してODCI_Table_Rewriteを無効にします。

- SKIP_CLOB=Tは、問合せに対してCLOB値が戻されないようにします。

- S2S (SPARQL to pure SQL)は、基礎となるSEM_MATCHベースの問合せ、またはSPARQL問合せに基づいて生成された問合せを、SEM_MATCHテーブル・ファンクションを使用しないで、さらにSQL問合せに変換します。結果として生成されたSQL問合せはOracleコストベース・オプティマイザによって実行され、その結果はクライアントに渡される前にJena Adapterによって処理されます。S2Sオプションの利点と使用方法などの詳細は、7.6.4.2項を参照してください。
S2Sは、すべてのSPARQL問合せに対してデフォルトで有効化されています。S2Sを無効にするには、次のJVMシステム・プロパティを設定します。

-Doracle.spatial.rdf.client.jena.defaultS2S=false

- TIMEOUT=n (問合せタイムアウト)は、問合せが終了されるまでに実行される秒数(n)を指定します。SPARQL問合せから生成される基礎となるSQLは、多数の一致を戻し、副問合せおよび割当てと同様の機能を使用することができ、これらのすべてには、多くの時間がかかることがあります。TIMEOUTオプションとBEST_EFFORT_QUERY=tオプションは、問合せに過度な処理時間がかからないようにするために使用できます。

7.6.4.1 JOINオプションとフェデレーテッド問合せ

SPARQLフェデレーテッド問合せは、W3Cドキュメントの説明のとおり、分散データ上の問合せであり、そのために、1つのソースを問い合せて、取得した情報を使用して次のソースの問合せを制約します。詳細は、SPARQL 1.1 Federation Extensions (http://www.w3.org/2009/sparql/docs/fed/service)を参照してください。

JOINオプション(7.6.4項を参照)とSERVICEキーワードは、Jena Adapterを使用するフェデレーテッド問合せで使用できます。たとえば、次の問合せを考えてみます。

SELECT ?s ?s1 ?o
WHERE { ?s1 ?p1 ?s .
{
SERVICE <http://sparql.org/books> { ?s ?p ?o }
}
}

ローカルの問合せ部分(?s1 ?p1 ?s,)が非常に選択的である場合、次の問合せに示すように、join=2を指定します。

PREFIX ORACLE_SEM_FS_NS:   <http://oracle.com/semtech#join=2>
SELECT ?s ?s1 ?o
WHERE { ?s1 ?p1 ?s .
{
SERVICE <http://sparql.org/books> { ?s ?p ?o }
}
}

この場合、ローカルの問合せ部(?s1 ?p1 ?s,)は、Oracle Databaseに対してローカルに実行されます。その後、結果からの?sの各バインディングは、SERVICE部分(リモート問合せ部)にプッシュされ、コールはエンドポイントが指定したサービスに行われます。この方法は、概念的にはネステッド・ループ結合と似ています。

リモートの問合せ部(?s ?s1 ?o)が非常に選択的である場合、次の問合せに示すように、join=3を指定することで、リモート部分は最初に実行され、結果はローカルの部分の実行をドライブするために使用されます。

PREFIX ORACLE_SEM_FS_NS:   <http://oracle.com/semtech#join=3>
SELECT ?s ?s1 ?o
WHERE { ?s1 ?p1 ?s .
{
SERVICE <http://sparql.org/books> { ?s ?p ?o }
}
}

この場合、単一のコールはリモートのサービス・エンドポイントに対して行われ、?sの各バインディングは、ローカルの問合せをトリガーします。join=2と同様に、この方法は概念的にはネステッド・ループ・ベースの結合ですが、違いは順序が切り替えられるということです。

ローカルの問合せ部もリモートの問合せ部もあまり選択的でない場合、次の問合せに示すように、join=1を選択できます。

PREFIX ORACLE_SEM_FS_NS:   <http://oracle.com/semtech#join=1>
SELECT ?s ?s1 ?o
WHERE { ?s1 ?p1 ?s .
{
SERVICE <http://sparql.org/books> { ?s ?p ?o }
}
}

この場合、リモートの問合せ部とローカルの部分は独立して実行され、結果はJenaによって結合されます。この方法は、概念的にはハッシュ結合と似ています。

フェデレーテッド問合せをデバッグまたはトレースするには、Oracle JDeveloperのHTTPアナライザを使用して、基礎となるSERVICEコールを調べます。

7.6.4.2 S2Sオプションの利点と使用方法の情報

S2Sオプション(7.6.4項参照)には、潜在的に次の利点があります。

- RESULT_CACHEオプションと連携し、問合せパフォーマンスを向上します。S2SとRESULT_CACHEオプションを使用すると、頻繁に実行される問合せに対して特に有用です。

- SEM_MATCHテーブル・ファンクションの解析時間を削減し、多くの動的に生成されたSPARQL問合せを含むアプリケーションに有用です。

- 問合せ本体の4000バイトの制限(SEM_MATCHテーブル・ファンクションの最初のパラメータ)を除外し、より長く複雑な問合せがサポートされます。

S2Sオプションは、内部のインメモリー・キャッシュを、変換されたSQL問合せ文で使用されるようにします。この内部キャッシュのデフォルト・サイズは1024(つまり1024のSQL問合せ)ですが、サイズは、次のJava VMプロパティを使用して調整できます。

-Doracle.spatial.rdf.client.jena.queryCacheSize=<size>

7.6.5 中間層リソース・キャッシング

セマンティク・データが格納されると、すべてのリソース値がIDにハッシュされ、トリプル表に格納されます。値IDからの完全なリソース値へのマッピングは、MDSYS.RDF_VALUE$表に格納されます。問合せ時、選択された変数ごとにOracle DatabaseでRDF_VALUE$表による結合を実行し、リソースを取得する必要があります。

ただし、結合の数を減らすため、中間層キャッシュ・オプションを使用して、値IDとリソース値の間のマッピングを格納するために中間層でのインメモリー・キャッシュが使用されるようにできます。この機能を使用するには、SPARQL問合せに次のPREFIXプラグマを含めます。

PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#midtier_cache>

インメモリー・キャッシュの最大サイズ(バイト)を制御するには、oracle.spatial.rdf.client.jena.cacheMaxSizeシステム・プロパティを使用します。デフォルトの最大キャッシュ・サイズは1GBです。

中間層リソース・キャッシングは、ORDER BYまたはDISTINCT(あるいはその両方の)構造体を使用した問合せ、または複数の投影変数による問合せに最も効果的です。中間層キャッシュは、7.6.4項で指定したその他のオプションと組み合せることができます。

モデルのすべてのリソースをキャッシュに事前挿入するには、GraphOracleSem.populateCacheメソッドまたはDatasetGraphOracleSem.populateCacheメソッドを使用します。どちらのメソッドも、内部の中間層キャッシュを構築するために使用されるスレッドの数を指定するパラメータをとります。どちらかのメソッドをパラレルに実行すると、複数のCPU (コア)を搭載したマシンで、キャッシュ構築パフォーマンスを大幅に向上させることができます。

7.7 Jena Adapterを介してSPARQL問合せでサポートされるファンクション

Jena Adapterを介したSPARQL問合せは、次の種類のファンクションを使用できます。

- Jena ARQ問合せエンジンのファンクション・ライブラリにあるファンクション

- 投影変数に関するOracle Databaseのネイティブ・ファンクション

- ユーザー定義ファンクション

7.7.1 ARQファンクション・ライブラリのファンクション

Jena Adapterを介したSPARQL問合せは、Jena ARQ問合せエンジンのファンクション・ライブラリにあるファンクションを使用できます。これらの問合せは、中間層で実行されます。

次の例は、upper-caseファンクションとnamespaceファンクションを使用します。これらの例で、接頭辞fnは<http://www.w3.org/2005/xpath-functions#>、接頭辞afnは<http://jena.hpl.hp.com/ARQ/function#>です。

PREFIX  fn: <http://www.w3.org/2005/xpath-functions#>
PREFIX  afn: <http://jena.hpl.hp.com/ARQ/function#>
SELECT (fn:upper-case(?object) as ?object1)
WHERE { ?subject dc:title ?object }

PREFIX  fn: <http://www.w3.org/2005/xpath-functions#>
PREFIX  afn: <http://jena.hpl.hp.com/ARQ/function#>
SELECT ?subject (afn:namespace(?object) as ?object1)
WHERE { ?subject <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?object }

7.7.2 投影変数に関するOracle Databaseのネイティブ・ファンクション

Jena Adapterを介したSPARQL問合せは、投影変数に関するOracle Databaseのネイティブ・ファンクションを使用できます。これらの問合せとファンクションは、データベース内部で実行されます。この項で説明したファンクションは、(7.7.1項で説明した)ARQファンクションとともに使用できないことに注意してください。

この項では、サポートされるネイティブ・ファンクションの一覧と、いくつかの例を示します。例で、接頭辞oextは、<http://oracle.com/semtech/jena-adaptor/ext/function#>です。

注意:
前述のURLで、jena-adaptorの綴りに注意してください(これは、既存のアプリケーションとの互換性のために保持されており、問合せではこれを使用する必要があります)。Oracleドキュメントのスタイル・ガイドに従い、通常のテキストではadapterという綴りを使用します。

- oext:upper-literalは、リテラル値(長いリテラルを除く)を大文字に変換します。次に例を示します。

PREFIX  oext: <http://oracle.com/semtech/jena-adaptor/ext/function#>
SELECT (oext:upper-literal(?object) as ?object1)
WHERE { ?subject dc:title ?object }

- oext:lower-literalは、リテラル値(長いリテラルを除く)を小文字に変換します。次に例を示します。

PREFIX  oext: <http://oracle.com/semtech/jena-adaptor/ext/function#>
SELECT (oext:lower-literal(?object) as ?object1)
WHERE { ?subject dc:title ?object }

- oext:build-uri-for-idは、URI、bNodeまたはリテラルの値IDをURIフォームに変換します。次に例を示します。

PREFIX  oext: <http://oracle.com/semtech/jena-adaptor/ext/function#>
SELECT (oext:build-uri-for-id(?object) as ?object1)
WHERE { ?subject dc:title ?object }

出力の例としては、<rdfvid:1716368199350136353>のようになります。

このファンクションの1つの用途は、Javaアプリケーションがメモリー内で、それらの値IDからURI、bNodeまたはリテラルの字句形式へのマッピングを保持できるようにすることです。MDSYS.RDF_VALUE$表は、Oracle Databaseでこのようなマッピングを提供します。

指定された変数?varについて、oext:build-uri-for-id(?var)のみが投影される場合、問合せへの応答に必要な内部表の結合操作がより少なくなるため、問合せのパフォーマンスがより高速になる可能性があります。

- oext:literal-strlenは、リテラル値(長いリテラルを除く)の長さを戻します。次に例を示します。

PREFIX  oext: <http://oracle.com/semtech/jena-adaptor/ext/function#>
SELECT (oext:literal-strlen(?object) as ?objlen)
WHERE { ?subject dc:title ?object }

7.7.3 ユーザー定義ファンクション

Jena Adapterを介したSPARQL問合せでは、データベースに格納されているユーザー定義ファンクションを使用できます。

次の例で、長いリテラル(CLOB)および短いリテラルを処理する文字列長ファンクション(my_strlen)を定義するとします。SPARQL問合せ側では、このファンクションをouext (http://oracle.com/semtech/jena-adaptor/ext/user-def-function#)という名前空間の下で参照できます。

PREFIX  ouext: <http://oracle.com/semtech/jena-adaptor/ext/user-def-function#>
SELECT ?subject ?object (ouext:my_strlen(?object) as ?obj1)
WHERE { ?subject dc:title ?object }

データベース内では、この機能を実装するために、my_strlen、my_strlen_cl、my_strlen_la、my_strlen_ltおよびmy_strlen_vtのファンクションを定義します。概念的に、これらのファンクションの戻り値は、表7-1に示すようにマップされます。

表7-1 my_strlenのファンクションと戻り値の例

ファンクション名

戻り値

my_strlen

<VAR>

my_strlen_cl

<VAR>$RDFCLOB

my_strlen_la

<VAR>$RDFLANG

my_strlen_lt

<VAR>$RDFLTYP

my_strlen_vt

<VAR>$RDFVTYP

SPARQLから参照できる1つのユーザー定義ファンクションは、(MDSYS.RDF_VALUE$内の)RDFリソースの内部表現で位置合せするため、これを実装するために一連のファンクション(合計5つ)が使用されます。RDFリソースの値、言語、リテラル・タイプ、LONG値および値タイプに関して記述する5つの主要な列があり、これらの5つの列はSEM_MATCHを使用して選択されます。この場合、ユーザー定義ファンクションは、5つの列で表される1つのRDFリソースをもう1つのRDFリソースに単純に変換します。

これらのファンクションは、次のように定義されます。

create or replace function my_strlen(rdfvtyp in varchar2,
rdfltyp in varchar2,
rdflang in varchar2,
rdfclob in clob,
value   in varchar2
) return varchar2
as
ret_val  varchar2(4000);
begin
-- value
if (rdfvtyp = 'LIT') then
if (rdfclob is null) then
return length(value);
else
return dbms_lob.getlength(rdfclob);
end if;
else
-- Assign -1 for non-literal values so that application can
-- easily differentiate
return '-1';
end if;
end;
/

create or replace function my_strlen_cl(rdfvtyp in varchar2,
rdfltyp in varchar2,
rdflang in varchar2,
rdfclob in clob,
value   in varchar2
) return clob
as
begin
return null;
end;
/

create or replace function my_strlen_la(rdfvtyp in varchar2,
rdfltyp in varchar2,
rdflang in varchar2,
rdfclob in clob,
value   in varchar2
) return varchar2
as
begin
return null;
end;
/

create or replace function my_strlen_lt(rdfvtyp in varchar2,
rdfltyp in varchar2,
rdflang in varchar2,
rdfclob in clob,
value   in varchar2
) return varchar2
as
ret_val  varchar2(4000);
begin
-- literal type
return 'http://www.w3.org/2001/XMLSchema#integer';
end;
/

create or replace function my_strlen_vt(rdfvtyp in varchar2,
rdfltyp in varchar2,
rdflang in varchar2,
rdfclob in clob,
value   in varchar2
) return varchar2
as
ret_val  varchar2(3);
begin
return 'LIT';
end;
/

ユーザー定義ファンクションには、VARCHAR2タイプのパラメータを指定することもできます。次の5つのファンクションはともに、部分文字列に整数(VARCHAR2形式)を受け入れ、部分文字列を戻すmy_shorten_strファンクションを定義します。(この例の部分文字列は12文字で、4000バイト以下である必要があります。)

-- SPARQL query that returns the first 12 characters of literal values.
--
PREFIX  ouext: <http://oracle.com/semtech/jena-adaptor/ext/user-def-function#>
SELECT (ouext:my_shorten_str(?object, "12") as ?obj1) ?subject
WHERE { ?subject dc:title ?object }

create or replace function my_shorten_str(rdfvtyp in varchar2,
rdfltyp in varchar2,
rdflang in varchar2,
rdfclob in clob,
value   in varchar2,
arg     in varchar2
) return varchar2
as
ret_val  varchar2(4000);
begin
-- value
if (rdfvtyp = 'LIT') then
if (rdfclob is null) then
return substr(value, 1, to_number(arg));
else
return dbms_lob.substr(rdfclob, to_number(arg), 1);
end if;
else
return null;
end if;
end;
/

create or replace function my_shorten_str_cl(rdfvtyp in varchar2,
rdfltyp in varchar2,
rdflang in varchar2,
rdfclob in clob,
value   in varchar2,
arg     in varchar2
) return clob
as
ret_val  clob;
begin
-- lob
return null;
end;
/

create or replace function my_shorten_str_la(rdfvtyp in varchar2,
rdfltyp in varchar2,
rdflang in varchar2,
rdfclob in clob,
value   in varchar2,
arg     in varchar2
) return varchar2
as
ret_val  varchar2(4000);
begin
-- lang
if (rdfvtyp = 'LIT') then
return rdflang;
else
return null;
end if;
end;
/

create or replace function my_shorten_str_lt(rdfvtyp in varchar2,
rdfltyp in varchar2,
rdflang in varchar2,
rdfclob in clob,
value   in varchar2,
arg     in varchar2
) return varchar2
as
ret_val  varchar2(4000);
begin
-- literal type
ret_val := rdfltyp;
return ret_val;
end;
/

create or replace function my_shorten_str_vt(rdfvtyp in varchar2,
rdfltyp in varchar2,
rdflang in varchar2,
rdfclob in clob,
value   in varchar2,
arg     in varchar2
) return varchar2
as
ret_val  varchar2(3);
begin
return 'LIT';
end;
/

7.8 SPARQLの更新のサポート

Jena Adapterは、SPARULとも呼ばれる、SPARQLの更新(http://www.w3.org/TR/sparql11-update/)をサポートします。主要なプログラミングAPIには、(パッケージcom.hp.hpl.jena.updateの) JenaクラスUpdateAction、Jena AdapterクラスGraphOracleSemおよびDatasetGraphOracleSemが含まれます。例7-1は、SPARQLの更新操作によって、名前付きグラフ<http://example/graph>のすべてのトリプルが、データベースに格納されている関連したモデルから削除されることを示しています。

例7-1 単純なSPARQLの更新

GraphOracleSem graphOracleSem = .... ;
DatasetGraphOracleSem dsgos = DatasetGraphOracleSem.createFrom(graphOracleSem);

// SPARQL Update operation
String szUpdateAction = "DROP GRAPH <http://example/graph>";

// Execute the Update against a DatasetGraph instance (can be a Jena Model as well)
UpdateAction.parseExecute(szUpdateAction, dsgos);

Oracle Databaseでは、空の名前付きグラフに関する情報は保持されないことに注意してください。このことは、このグラフにトリプルを追加せずにCREATE GRAPH <graph_name>を起動した場合、アプリケーション表または基礎となるRDF_LINK$表に、追加の行が作成されないことを意味します。Oracle Databaseに対しては、例7-1の例に示すとおり、CREATE GRAPHの手順を安全にスキップできます。

例7-2は、複数の挿入操作と削除操作を含む(ARQ 2.8.8からの)SPARQLの更新操作を示しています。

例7-2 挿入と削除の操作によるSPARQLの更新

PREFIX : <http://example/>
CREATE GRAPH <http://example/graph> ;
INSERT DATA { :r :p 123 } ;
INSERT DATA { :r :p 1066 } ;
DELETE DATA { :r :p 1066 } ;
INSERT DATA {
GRAPH <http://example/graph> { :r :p 123 . :r :p 1066 }
} ;
DELETE DATA {
GRAPH <http://example/graph>  { :r :p 123 }
}

空のDatasetGraphOracleSemに対して例7-2での更新操作を実行した後、SPARQL問合せSELECT ?s ?p ?o WHERE {?s ?p ?o}を実行すると、次のレスポンスが生成されます。

-----------------------------------------------------------------------------------------------
| s                  | p                  | o                                                 |
===============================================================================================
| <http://example/r> | <http://example/p> | "123"^^<http://www.w3.org/2001/XMLSchema#decimal> |
-----------------------------------------------------------------------------------------------

同じデータを使用して、SPARQL問合せSELECT ?g ?s ?p ?o where {GRAPH ?g {?s ?p ?o}}を実行すると、次のレスポンスが生成されます。

-------------------------------------------------------------------------------------------------------------------------
| g                      | s                  | p                  | o                                                  |
=========================================================================================================================
| <http://example/graph> | <http://example/r> | <http://example/p> | "1066"^^<http://www.w3.org/2001/XMLSchema#decimal> |
-------------------------------------------------------------------------------------------------------------------------

SPARQLの更新操作にJava APIを使用する以外に、joseki-config.ttlファイルの次の行の最初にあるコメント(##)文字を削除することによって、SPARQLの更新操作を受け入れるようにJosekiを構成できます。

## <#serviceUpdate>
##     rdf:type            joseki:Service ;
##     rdfs:label          "SPARQL/Update" ;
##     joseki:serviceRef   "update/service" ;
##     # dataset part
##     joseki:dataset      <#oracle>;
##     # Service part.
##     # This processor will not allow either the protocol,
##     # nor the query, to specify the dataset.
##     joseki:processor    joseki:ProcessorSPARQLUpdate
##     .
##
## <#serviceRead>
##     rdf:type            joseki:Service ;
##     rdfs:label          "SPARQL" ;
##     joseki:serviceRef   "sparql/read" ;
##     # dataset part
##     joseki:dataset      <#oracle> ;     ## Same dataset
##     # Service part.
##     # This processor will not allow either the protocol,
##     # nor the query, to specify the dataset.
##     joseki:processor    joseki:ProcessorSPARQL_FixedDS ;
##     .

joseki-config.ttlファイルを編集したら、Joseki Webアプリケーションを再起動する必要があります。その後、次のようにして単純な更新操作を試行できます。

1. ブラウザで、http://<hostname>:7001/joseki/update.htmlを表示します。

2. テキスト・ボックスで次の内容を入力するか、または貼り付けます。

PREFIX : <http://example/>
INSERT DATA {
GRAPH <http://example/g1> { :r :p 455 }
}

3. 「Perform SPARQL Update」をクリックします。

更新操作が成功したことを確認するには、http://<hostname>:7001/josekiに移動し、次の問合せを入力します。

SELECT *
WHERE
{  GRAPH <http://example/g1> {?s ?p ?o}};

レスポンスには、次のトリプルが含まれます。

<http://example/r>     <http://example/p>    "455"^^<http://www.w3.org/2001/XMLSchema#decimal>

SPARQLの更新は、HTTP POST操作を使用してhttp://<hostname>:7001/joseki/update/サービスに送信することもできます。たとえば、curl (http://en.wikipedia.org/wiki/CURL)を使用して更新操作を実行するHTTP POSTリクエストを送信できます。

curl --data "request=PREFIX%20%3A%20%3Chttp%3A%2F%2Fexample%2F%3E%20%0AINSERT%20DATA%20%7B%0A%20%20GRAPH%20%3Chttp%3A%2F%2Fexample%2Fg1%3E%20%7B%20%3Ar%20%3Ap%20888%20%7D%0A%7D%0A"  http://hostname:7001/joseki/update/service

前述の例で、URLエンコードされた文字列は、名前付きグラフへの単純なINSERT操作です。デコーディングの後、次のように読み取ります。

PREFIX : <http://example/>
INSERT DATA {
GRAPH <http://example/g1> { :r :p 888 }

7.9 RDFデータの解析ファンクション

oracle.spatial.rdf.client.jenaパッケージのSemNetworkAnalystクラスを使用して、RDFデータで解析ファンクションを実行できます。このサポートは、Oracle Spatialのネットワーク・データ・モデル(NDM)のロジックを基礎となるRDFデータ構造体に統合します。そのため、RDFデータでの解析ファンクションを使用するには、『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』に説明されている、Oracle SpatialのNDMについても理解しておく必要があります。

必要なNDM Javaライブラリ(sdonm.jarとsdoutl.jarを含む)は、ディレクトリ$ORACLE_HOME/md/jlibの下にあります。($ORACLE_HOME/xdk/lib下にある) xmlparserv2.jarをclasspath定義に含める必要があることに注意してください。

例7-3では、SemNetworkAnalystクラス(NDM NetworkAnalyst APIを内部的に使用)を使用します。

例7-3 RDFデータでの解析ファンクションの実行

Oracle oracle = new Oracle(jdbcUrl, user, password);
GraphOracleSem graph = new GraphOracleSem(oracle, modelName);

Node nodeA = Node.createURI("http://A");
Node nodeB = Node.createURI("http://B");
Node nodeC = Node.createURI("http://C");
Node nodeD = Node.createURI("http://D");
Node nodeE = Node.createURI("http://E");
Node nodeF = Node.createURI("http://F");
Node nodeG = Node.createURI("http://G");
Node nodeX = Node.createURI("http://X");

// An anonymous node
Node ano = Node.createAnon(new AnonId("m1"));

Node relL = Node.createURI("http://likes");
Node relD = Node.createURI("http://dislikes");
Node relK = Node.createURI("http://knows");
Node relC = Node.createURI("http://differs");

graph.add(new Triple(nodeA, relL, nodeB));
graph.add(new Triple(nodeA, relC, nodeD));
graph.add(new Triple(nodeB, relL, nodeC));
graph.add(new Triple(nodeA, relD, nodeC));

graph.add(new Triple(nodeB, relD, ano));
graph.add(new Triple(nodeC, relL, nodeD));
graph.add(new Triple(nodeC, relK, nodeE));
graph.add(new Triple(ano,   relL, nodeD));
graph.add(new Triple(ano,   relL, nodeF));
graph.add(new Triple(ano,   relD, nodeB));

// X only likes itself
graph.add(new Triple(nodeX, relL, nodeX));

graph.commitTransaction();
HashMap<Node, Double> costMap = new HashMap<Node, Double>();
costMap.put(relL, Double.valueOf((double)0.5));
costMap.put(relD, Double.valueOf((double)1.5));
costMap.put(relC, Double.valueOf((double)5.5));

graph.setDOP(4); // this allows the underlying LINK/NODE tables
// and indexes to be created in parallel.

SemNetworkAnalyst sna = SemNetworkAnalyst.getInstance(
graph,   // network data source
true,    // directed graph
true,    // cleanup existing NODE and LINK table
costMap
);

psOut.println("From nodeA to nodeC");
Node[] nodeArray = sna.shortestPathDijkstra(nodeA, nodeC);
printNodeArray(nodeArray, psOut);

psOut.println("From nodeA to nodeD");
nodeArray = sna.shortestPathDijkstra( nodeA, nodeD);
printNodeArray(nodeArray, psOut);

psOut.println("From nodeA to nodeF");
nodeArray = sna.shortestPathAStar(nodeA, nodeF);
printNodeArray(nodeArray, psOut);

psOut.println("From ano to nodeC");
nodeArray = sna.shortestPathAStar(ano, nodeC);
printNodeArray(nodeArray, psOut);

psOut.println("From ano to nodeX");
nodeArray = sna.shortestPathAStar(ano, nodeX);
printNodeArray(nodeArray, psOut);

graph.close();
oracle.dispose();
...
...

// A helper function to print out a path
public static void printNodeArray(Node[] nodeArray, PrintStream psOut)
{
if (nodeArray == null) {
psOut.println("Node Array is null");
return;
}
if (nodeArray.length == 0) {psOut.println("Node Array is empty"); }
int iFlag = 0;
psOut.println("printNodeArray: full path starts");
for (int iHops = 0; iHops < nodeArray.length; iHops++) {
psOut.println("printNodeArray: full path item " + iHops + " = "
+ ((iFlag == 0) ? "[n] ":"[e] ") + nodeArray[iHops]);
iFlag = 1 - iFlag;
}
}

例7-3の内容:

- GraphOracleSemオブジェクトが構築され、少数のトリプルがGraphOracleSemオブジェクトに追加されます。これらのトリプルは、複数の個人と、好き(likes)、嫌い(dislikes)、知人(knows)および他人(differs)などの関係を記述します。

- コスト・マッピングは、数値コストの値を(RDFグラフの)異なるリンクおよび述語に割り当てるために作成されます。この場合、0.5、1.5および5.5は、それぞれ述語likes、dislikesおよびdiffersに割り当てられます。このコスト・マッピングはオプションです。このマッピングがない場合、すべての述語は同じコスト1に割り当てられることになります。コスト・マッピングが指定される場合、このマッピングは完全である必要はなく、コスト・マッピングに含まれない述語には、デフォルト値の1が割り当てられます。

例7-3の出力は、次のようになります。この出力には、指定された開始ノードと終了ノードの最短パスが示されます。これらの2つのノード間にはパスがないため、sna.shortestPathAStar(ano, nodeX)の戻り値はNULLになることに注意してください。

From nodeA to nodeC
printNodeArray: full path starts
printNodeArray: full path item 0 = [n] http://A           ## "n" denotes Node
printNodeArray: full path item 1 = [e] http://likes       ## "e" denotes Edge (Link)
printNodeArray: full path item 2 = [n] http://B
printNodeArray: full path item 3 = [e] http://likes
printNodeArray: full path item 4 = [n] http://C

From nodeA to nodeD
printNodeArray: full path starts
printNodeArray: full path item 0 = [n] http://A
printNodeArray: full path item 1 = [e] http://likes
printNodeArray: full path item 2 = [n] http://B
printNodeArray: full path item 3 = [e] http://likes
printNodeArray: full path item 4 = [n] http://C
printNodeArray: full path item 5 = [e] http://likes
printNodeArray: full path item 6 = [n] http://D

From nodeA to nodeF
printNodeArray: full path starts
printNodeArray: full path item 0 = [n] http://A
printNodeArray: full path item 1 = [e] http://likes
printNodeArray: full path item 2 = [n] http://B
printNodeArray: full path item 3 = [e] http://dislikes
printNodeArray: full path item 4 = [n] m1
printNodeArray: full path item 5 = [e] http://likes
printNodeArray: full path item 6 = [n] http://F

From ano to nodeC
printNodeArray: full path starts
printNodeArray: full path item 0 = [n] m1
printNodeArray: full path item 1 = [e] http://dislikes
printNodeArray: full path item 2 = [n] http://B
printNodeArray: full path item 3 = [e] http://likes
printNodeArray: full path item 4 = [n] http://C

From ano to nodeX
Node Array is null

基礎となるRDFグラフ・ビュー(SEMM_<model_name>またはRDFM_<model_name>)はNDMファンクションで直接使用することができないため、SemNetworkAnalystにより、必要な表(指定されたRDFグラフから導出されたノードとリンクを含む)が作成されます。これらの表は、RDFグラフが変更されても自動更新されないため、SemNetworkAnalyst.getInstanceのcleanupパラメータにtrueを設定して、古いノードとリンクを含む表を削除し、更新された表を再構築します。

例7-4は、セマンティク・データでのNDM nearestNeighborsファンクションを実装します。これによってSemNetworkAnalystインスタンスからNetworkAnalystオブジェクトを取得し、ノードIDを取得してPointOnNetオブジェクトを作成し、LogicalSubPathオブジェクトを処理します。

例7-4 セマンティク・データでのNDM nearestNeighborsファンクションの実装

%cat TestNearestNeighbor.java

import java.io.*;
import java.util.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.util.iterator.*;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.update.*;
import com.hp.hpl.jena.sparql.core.DataSourceImpl;

import oracle.spatial.rdf.client.jena.*;

import oracle.spatial.rdf.client.jena.SemNetworkAnalyst;
import oracle.spatial.network.lod.LODGoalNode;
import oracle.spatial.network.lod.LODNetworkConstraint;
import oracle.spatial.network.lod.NetworkAnalyst;
import oracle.spatial.network.lod.PointOnNet;
import oracle.spatial.network.lod.LogicalSubPath;

/**
* This class implements a nearestNeighbors function on top of semantic data
* using public APIs provided in SemNetworkAnalyst and Oracle Spatial NDM
*/
public class TestNearestNeighbor
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];

PrintStream psOut = System.out;

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);

String szModelName = "test_nn";
// First construct a TBox and load a few axioms
ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName);
String insertString =
" PREFIX my:  <http://my.com/> " +
" INSERT DATA "                             +
" { my:A   my:likes my:B .                " +
"   my:A   my:likes my:C .                " +
"   my:A   my:knows my:D .                " +
"   my:A   my:dislikes my:X .             " +
"   my:A   my:dislikes my:Y .             " +
"   my:C   my:likes my:E .                " +
"   my:C   my:likes my:F .                " +
"   my:C   my:dislikes my:M .             " +
"   my:D   my:likes my:G .                " +
"   my:D   my:likes my:H .                " +
"   my:F   my:likes my:M .                " +
" }   ";
UpdateAction.parseExecute(insertString,  model);

GraphOracleSem g = model.getGraph();
g.commitTransaction();
g.setDOP(4);

HashMap<Node, Double> costMap = new HashMap<Node, Double>();
costMap.put(Node.createURI("http://my.com/likes"),    Double.valueOf(1.0));
costMap.put(Node.createURI("http://my.com/dislikes"), Double.valueOf(4.0));
costMap.put(Node.createURI("http://my.com/knows"),    Double.valueOf(2.0));

SemNetworkAnalyst sna = SemNetworkAnalyst.getInstance(
g,     // source RDF graph
true,  // directed graph
true,  // cleanup old Node/Link tables
costMap
);

Node nodeStart = Node.createURI("http://my.com/A");
long origNodeID = sna.getNodeID(nodeStart);

long[] lIDs = {origNodeID};

// translate from the original ID
long nodeID = (sna.mapNodeIDs(lIDs))[0];

NetworkAnalyst networkAnalyst = sna.getEmbeddedNetworkAnalyst();

LogicalSubPath[] lsps = networkAnalyst.nearestNeighbors(
new PointOnNet(nodeID),      // startPoint
6,                           // numberOfNeighbors
1,                           // searchLinkLevel
1,                           // targetLinkLevel
(LODNetworkConstraint) null, // constraint
(LODGoalNode) null           // goalNodeFilter
);

if (lsps != null) {
for (int idx = 0; idx < lsps.length; idx++) {
LogicalSubPath lsp = lsps[idx];
Node[] nodePath = sna.processLogicalSubPath(lsp, nodeStart);
psOut.println("Path " + idx);
printNodeArray(nodePath, psOut);
}
}

g.close();
sna.close();
oracle.dispose();
}

public static void printNodeArray(Node[] nodeArray, PrintStream psOut)
{
if (nodeArray == null) {
psOut.println("Node Array is null");
return;
}
if (nodeArray.length == 0) {
psOut.println("Node Array is empty");
}
int iFlag = 0;
psOut.println("printNodeArray: full path starts");
for (int iHops = 0; iHops < nodeArray.length; iHops++) {
psOut.println("printNodeArray: full path item " + iHops + " = "
+ ((iFlag == 0) ? "[n] ":"[e] ") + nodeArray[iHops]);
iFlag = 1 - iFlag;
}
}
}

例7-4の出力は、次のようになります。

Path 0
printNodeArray: full path starts
printNodeArray: full path item 0 = [n] http://my.com/A
printNodeArray: full path item 1 = [e] http://my.com/likes
printNodeArray: full path item 2 = [n] http://my.com/C

Path 1
printNodeArray: full path starts
printNodeArray: full path item 0 = [n] http://my.com/A
printNodeArray: full path item 1 = [e] http://my.com/likes
printNodeArray: full path item 2 = [n] http://my.com/B

Path 2
printNodeArray: full path starts
printNodeArray: full path item 0 = [n] http://my.com/A
printNodeArray: full path item 1 = [e] http://my.com/knows
printNodeArray: full path item 2 = [n] http://my.com/D

Path 3
printNodeArray: full path starts
printNodeArray: full path item 0 = [n] http://my.com/A
printNodeArray: full path item 1 = [e] http://my.com/likes
printNodeArray: full path item 2 = [n] http://my.com/C
printNodeArray: full path item 3 = [e] http://my.com/likes
printNodeArray: full path item 4 = [n] http://my.com/E

Path 4
printNodeArray: full path starts
printNodeArray: full path item 0 = [n] http://my.com/A
printNodeArray: full path item 1 = [e] http://my.com/likes
printNodeArray: full path item 2 = [n] http://my.com/C
printNodeArray: full path item 3 = [e] http://my.com/likes
printNodeArray: full path item 4 = [n] http://my.com/F

Path 5
printNodeArray: full path starts
printNodeArray: full path item 0 = [n] http://my.com/A
printNodeArray: full path item 1 = [e] http://my.com/knows
printNodeArray: full path item 2 = [n] http://my.com/D
printNodeArray: full path item 3 = [e] http://my.com/likes
printNodeArray: full path item 4 = [n] http://my.com/H

7.9.1 グラフ内のパスに関する文脈情報の生成

パスそのものに加え、グラフ内のパスに関する文脈情報を参照することは、有用な場合があります。SemNetworkAnalystクラスのbuildSurroundingSubGraphメソッドは、DOTファイル(グラフ記述言語ファイル、拡張子.gv)を、指定されたWriterオブジェクトに出力できます。パスのノードごとに、最大10の直接の隣接が、パス周辺のサブグラフを生成するために使用されます。例7-5に使用方法(具体的には例7-3「RDFデータでの解析ファンクションの実行」で使用されている解析ファンクションの出力)を示します。

例7-5 文脈情報によるDOTファイルの生成

nodeArray = sna.shortestPathDijkstra(nodeA, nodeD);
printNodeArray(nodeArray, psOut);

FileWriter dotWriter = new FileWriter("Shortest_Path_A_to_D.gv");
sna.buildSurroundingSubGraph(nodeArray, dotWriter);

例7-5で生成される出力DOTファイルは、次の例に示すとおり、単純な内容です。

% cat Shortest_Path_A_to_D.gv
digraph { rankdir = LR; charset="utf-8";

"Rhttp://A" [ label="http://A" shape=rectangle,color=red,style = filled, ];
"Rhttp://B" [ label="http://B" shape=rectangle,color=red,style = filled, ];
"Rhttp://A" -> "Rhttp://B" [ label="http://likes"  color=red, style=bold, ];
"Rhttp://C" [ label="http://C" shape=rectangle,color=red,style = filled, ];
"Rhttp://A" -> "Rhttp://C" [ label="http://dislikes" ];
"Rhttp://D" [ label="http://D" shape=rectangle,color=red,style = filled, ];
"Rhttp://A" -> "Rhttp://D" [ label="http://differs" ];
"Rhttp://B" -> "Rhttp://C" [ label="http://likes"  color=red, style=bold, ];
"Rm1" [ label="m1" shape=ellipse,color=blue, ];
"Rhttp://B" -> "Rm1" [ label="http://dislikes" ];
"Rm1" -> "Rhttp://B" [ label="http://dislikes" ];
"Rhttp://C" -> "Rhttp://D" [ label="http://likes"  color=red, style=bold, ];
"Rhttp://E" [ label="http://E" shape=ellipse,color=blue, ];
"Rhttp://C" -> "Rhttp://E" [ label="http://knows" ];
"Rm1" -> "Rhttp://D" [ label="http://likes" ];
}

SemNetworkAnalystクラスとGraphOracleSemクラスのメソッドを使用して、より洗練されたビジュアル表現で解析ファンクション出力を生成することもできます。

前述のDOTファイルを、様々なイメージ形式に変換できます。図7-1は、前述のDOTファイルの情報を表現するイメージです。

図7-1 解析ファンクション出力のビジュアル表示

7.10 サーバー側APIのサポート

この項では、Jena Adapterによって使用可能になるOracle Databaseのセマンティク・テクノロジ機能の一部について説明します。使用可能な機能をサポートするAPIコールの包括的なドキュメントについては、Jena Adapterのリファレンス情報(Javadoc)を参照してください。Jena Adapterによって使用可能なサーバー側機能の詳細は、このマニュアルの関連する章を参照してください。

7.10.1 仮想モデルのサポート

仮想モデル(1.3.8項を参照)は、GraphOracleSemコンストラクタで指定され、透過的に処理されます。仮想モデルがモデルとルールベースの組合せのために存在している場合には、問合せの応答に使用されます(そのような仮想モデルが存在しない場合には、データベースに作成されます)。

注意:
Jena Adapterを介した仮想モデルのサポートは、Oracle Databaseリリース11.2以上でのみ使用可能です。

次の例では、既存の仮想モデルを再利用します。

String modelName = "EX";
String m1 = "EX_1";

ModelOracleSem defaultModel =
ModelOracleSem.createOracleSemModel(oracle, modelName);

// create these models in case they don't exist
ModelOracleSem model1 = ModelOracleSem.createOracleSemModel(oracle, m1);

String vmName = "VM_" + modelName;

//create a virtual model containing EX and EX_1
oracle.executeCall(
"begin sem_apis.create_virtual_model(?,sem_models('"+ m1 + "','"+ modelName+"'),null); end;",vmName);

String[] modelNames = {m1};
String[] rulebaseNames = {};

Attachment attachment = Attachment.createInstance(modelNames, rulebaseNames,
InferenceMaintenanceMode.NO_UPDATE, QueryOptions.ALLOW_QUERY_VALID_AND_DUP);

// vmName is passed to the constructor, so GraphOracleSem will use the virtual
// model named vmname (if the current user has read privileges on it)
GraphOracleSem graph = new GraphOracleSem(oracle, modelName, attachment, vmName);
graph.add(Triple.create(Node.createURI("urn:alice"),
Node.createURI("http://xmlns.com/foaf/0.1/mbox"),
Node.createURI("mailto:alice@example")));
ModelOracleSem model = new ModelOracleSem(graph);

String queryString =

" SELECT ?subject ?object WHERE { ?subject ?p ?object } ";

Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;

try {
ResultSet results = qexec.execSelect() ;
for ( ; results.hasNext() ; ) {
QuerySolution soln = results.nextSolution() ;
psOut.println("soln " + soln);
}
}
finally {
qexec.close() ;
}

OracleUtils.dropSemanticModel(oracle, modelName);
OracleUtils.dropSemanticModel(oracle, m1);

oracle.dispose();

また、次の例のように、GraphOracleSemコンストラクタを使用して仮想モデルを作成することもできます。

GraphOracleSem graph = new GraphOracleSem(oracle, modelName, attachment, true);

この例で、4番目のパラメータ(true)は、指定されたmodelNameとattachmentのために仮想モデルを作成する必要があることを示しています。

7.10.2 接続プーリングのサポート

Oracle Databaseの接続プーリングは、Jena AdapterのOraclePoolクラスを介して提供されます。このクラスが初期化されると、使用可能な接続のプールからOracleオブジェクトを戻せます。Oracleオブジェクトは、基本的にデータベース接続ラッパーです。disposeがOracleオブジェクトでコールされた後、接続がプールに戻されますOraclePoolの使用の詳細は、APIリファレンス情報(Javadoc)を参照してください。

次の例では、5つの初期接続を使用するOraclePoolオブジェクトを設定します。

public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

// test with connection properties
java.util.Properties prop = new java.util.Properties();
prop.setProperty("MinLimit", "2");     // the cache size is 2 at least
prop.setProperty("MaxLimit", "10");
prop.setProperty("InitialLimit", "2"); // create 2 connections at startup
prop.setProperty("InactivityTimeout", "1800");    //  seconds
prop.setProperty("AbandonedConnectionTimeout", "900");  //  seconds
prop.setProperty("MaxStatementsLimit", "10");
prop.setProperty("PropertyCheckInterval", "60"); // seconds

System.out.println("Creating OraclePool");
OraclePool op = new OraclePool(szJdbcURL, szUser, szPasswd, prop,
"OracleSemConnPool");
System.out.println("Done creating OraclePool");

// grab an Oracle and do something with it
System.out.println("Getting an Oracle from OraclePool");
Oracle oracle = op.getOracle();
System.out.println("Done");
System.out.println("Is logical connection:" +
oracle.getConnection().isLogicalConnection());
GraphOracleSem g = new GraphOracleSem(oracle, szModelName);
g.add(Triple.create(Node.createURI("u:John"),
Node.createURI("u:parentOf"),
Node.createURI("u:Mary")));
g.close();
// return the Oracle back to the pool
oracle.dispose();

// grab another Oracle and do something else
System.out.println("Getting an Oracle from OraclePool");
oracle = op.getOracle();
System.out.println("Done");
System.out.println("Is logical connection:" +
oracle.getConnection().isLogicalConnection());
g = new GraphOracleSem(oracle, szModelName);
g.add(Triple.create(Node.createURI("u:John"),
Node.createURI("u:parentOf"),
Node.createURI("u:Jack")));
g.close();

OracleUtils.dropSemanticModel(oracle, szModelName);

// return the Oracle object back to the pool
oracle.dispose();
}

7.10.3 セマンティク・モデルのPL/SQLインタフェース

Jena Adapterを介して、複数のセマンティクPL/SQLサブプログラムを使用できます。表7-2に、サブプログラムと、対応するJavaクラスおよびメソッドを示します。

表7-2 PL/SQLサブプログラムと、対応するJena AdapterのJavaクラスおよびメソッド

PL/SQLサブプログラム

対応するJavaクラスとメソッド

SEM_APIS.DROP_SEM_MODEL

OracleUtils.dropSemanticModel

SEM_APIS.MERGE_MODELS

OracleUtils.mergeModels

SEM_APIS.SWAP_NAMES

OracleUtils.swapNames

SEM_APIS.REMOVE_DUPLICATES

OracleUtils.removeDuplicates

SEM_APIS.RENAME_MODEL

OracleUtils.renameModels

これらのPL/SQLユーティリティ・サブプログラムの詳細は、第9章のリファレンス情報を参照してください。対応するJavaクラスとメソッドの詳細は、Jena AdapterのAPIリファレンス・ドキュメント(Javadoc)を参照してください。

7.10.4 推論オプション

(パッケージoracle.spatial.rdf.client.jena内にある) Attachmentクラスの次のメソッドを使用し、伴意コールにオプションを追加できます。

public void setUseLocalInference(boolean useLocalInference)
public boolean getUseLocalInference()

public void setDefGraphForLocalInference(String defaultGraphName)
public String getDefGraphForLocalInference()

public String getInferenceOption()
public void setInferenceOption(String inferenceOption)

これらのメソッドの詳細は、Javadocを参照してください。

例7-6では、伴意の作成時に、パラレル推論(並列度4を使用)とRAW形式を有効化しています。また、伴意の作成にperformInferenceメソッドを使用します(SEM_APIS.CREATE_ENTAILMENT PL/SQLプロシージャの使用に相当します)。

例7-6 推論オプションの指定

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.util.iterator.*;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.update.*;
import com.hp.hpl.jena.sparql.core.DataSourceImpl;

public class TestNewInference
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];

PrintStream psOut = System.out;

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);

String szTBoxName = "test_new_tbox";
{
// First construct a TBox and load a few axioms
ModelOracleSem modelTBox = ModelOracleSem.createOracleSemModel(oracle, szTBoxName);
String insertString =
" PREFIX my:  <http://my.com/> " +
" PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#> " +
" INSERT DATA "                                     +
" { my:C1  rdfs:subClassOf my:C2 .                " +
"   my:C2  rdfs:subClassOf my:C3 .                " +
"   my:C3  rdfs:subClassOf my:C4 .                " +
" }   ";
UpdateAction.parseExecute(insertString,  modelTBox);
modelTBox.close();
}

String szABoxName = "test_new_abox";
{
// Construct an ABox and load a few quads
ModelOracleSem modelABox = ModelOracleSem.createOracleSemModel(oracle, szABoxName);
DatasetGraphOracleSem dataset = DatasetGraphOracleSem.createFrom(modelABox.getGraph());
modelABox.close();

String insertString =
" PREFIX my:    <http://my.com/> " +
" PREFIX rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
" INSERT DATA                                                 " +
" { GRAPH my:G1 { my:I1  rdf:type my:C1 .                     " +
"                 my:I2  rdf:type my:C2 .                     " +
"               }                                             " +
" };                                                          " +
" INSERT DATA                                                 " +
" { GRAPH my:G2 { my:J1  rdf:type my:C3 .                     " +
"               }                                             " +
" }    ";
UpdateAction.parseExecute(insertString,  dataset);
dataset.close();
}

String[] attachedModels = new String[1];
attachedModels[0] = szTBoxName;

String[] attachedRBs = {"OWL2RL"};

Attachment attachment = Attachment.createInstance(
attachedModels, attachedRBs,
InferenceMaintenanceMode.NO_UPDATE,
QueryOptions.ALLOW_QUERY_INVALID);

// We are going to run named graph based local inference
attachment.setUseLocalInference(true);

// Set the default graph (TBox)
attachment.setDefGraphForLocalInference(szTBoxName);

// Set the inference option to use parallel inference
// with a degree of 4, and RAW format.
attachment.setInferenceOption("DOP=4,RAW8=T");

GraphOracleSem graph = new GraphOracleSem(
oracle,
szABoxName,
attachment
);
DatasetGraphOracleSem dsgos = DatasetGraphOracleSem.createFrom(graph);
graph.close();

// Invoke create_entailment PL/SQL API
dsgos.performInference();

psOut.println("TestNewInference: # of inferred graph " +
Long.toString(dsgos.getInferredGraphSize()));

String queryString =
" SELECT ?g ?s ?p ?o WHERE {  GRAPH ?g {?s ?p ?o } } " ;

Query query = QueryFactory.create(queryString, Syntax.syntaxARQ);
QueryExecution qexec = QueryExecutionFactory.create(
query, DataSourceImpl.wrap(dsgos));
ResultSet results = qexec.execSelect();

ResultSetFormatter.out(psOut, results);

dsgos.close();
oracle.dispose();
}
}

例7-6の出力は、次のようになります。

TestNewInference: # of inferred graph 9

--------------------------------------------------------------------------------------------------------------------
| g                  | s                  | p                                                 | o                  |
====================================================================================================================
| <http://my.com/G1> | <http://my.com/I2> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://my.com/C3> |
| <http://my.com/G1> | <http://my.com/I2> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://my.com/C2> |
| <http://my.com/G1> | <http://my.com/I2> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://my.com/C4> |
| <http://my.com/G1> | <http://my.com/I1> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://my.com/C3> |
| <http://my.com/G1> | <http://my.com/I1> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://my.com/C1> |
| <http://my.com/G1> | <http://my.com/I1> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://my.com/C2> |
| <http://my.com/G1> | <http://my.com/I1> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://my.com/C4> |
| <http://my.com/G2> | <http://my.com/J1> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://my.com/C3> |
| <http://my.com/G2> | <http://my.com/J1> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://my.com/C4> |
--------------------------------------------------------------------------------------------------------------------

OWL推論の使用の詳細は、2.2項を参照してください。

7.10.5 非推奨となったPelletInfGraphクラスのサポート

Jena Adapter内でのPelletInfGraphクラスのサポートは、非推奨になりました。かわりに、Oracle Database 11g向けの推論機能PelletDb OWL 2を介して、より最適化されたOracle/Pellet統合を使用する必要があります。(PelletDbの詳細は、http://clarkparsia.com/pelletdb/を参照してください。)

7.11 Jena Adapterを使用したバルク・ロード

数千から数十万ものRDF/OWLデータ・ファイルをOracle Databaseにロードするには、OracleBulkUpdateHandler JavaクラスのprepareBulkメソッドとcompleteBulkメソッドを使用してタスクを簡略化します。

OracleBulkUpdateHandlerクラスのaddInBulkメソッドは、グラフまたはモデルのトリプルをOracle Databaseにバルク・ロード方式でロードできます。グラフまたはモデルがJenaインメモリー・グラフまたはモデルである場合、操作は物理メモリーのサイズによって制限されます。prepareBulkメソッドは、Jenaのインメモリー・グラフまたはモデルをバイパスし、RDFデータ・ファイルへの直接入力ストリームを取得してデータを解析し、基礎となるステージング表にトリプルをロードします。ステージング表および長いリテラルを格納するための添付表がまだ存在しない場合は、自動的に作成されます。

prepareBulkメソッドは、複数のデータ・ファイルを同じ基礎となるステージング表へロードするために複数回コールできます。ハードウェア・システムがロードバランシングされており、複数のCPUコアおよび十分なI/O容量が確保されている場合には、同時にコールすることもできます。

すべてのデータ・ファイルがprepareBulkメソッドによって処理されると、completeBulkを起動して、すべてのデータをセマンティク・ネットワークにロードできます。

例7-7に、ディレクトリdir_1のすべてデータ・ファイルを、基礎となるステージング表へロードする方法を示します。長いリテラルがサポートされ、別々の表に格納されます。記憶域容量を節約するため、GZIPを使用してデータ・ファイルを圧縮することができ、データ・ファイルがGZIPを使用して圧縮されているかどうかをprepareBulkメソッドで自動的に検出できます。

例7-7 ステージング表へのデータのロード(prepareBulk)

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
GraphOracleSem graph = new GraphOracleSem(oracle, szModelName);

PrintStream psOut = System.out;

String dirname = "dir_1";
File fileDir = new File(dirname);
String[] szAllFiles = fileDir.list();

// loop through all the files in a directory
for (int idx = 0; idx < szAllFiles.length; idx++) {
String szIndFileName = dirname + File.separator + szAllFiles[idx];
psOut.println("process to [ID = " + idx + " ] file " + szIndFileName);
psOut.flush();

try {
InputStream is = new FileInputStream(szIndFileName);
graph.getBulkUpdateHandler().prepareBulk(
is,                    // input stream
"http://example.com",  // base URI
"RDF/XML",             // data file type: can be RDF/XML, N-TRIPLE, etc.
"SEMTS",               // tablespace
null,                  // flags
null,                  // listener
null                   // staging table name.
);
is.close();
}
catch (Throwable t) {
psOut.println("Hit exception " + t.getMessage());
}
}

graph.close();
oracle.dispose();

例7-7のコード(新しいOracleオブジェクトの作成から、そのOracleオブジェクトを破棄して終了するまで)は、パラレルで実行できます。データベースのハードウェア・システム上にクワッドコアCPUと十分なI/O容量があると想定した場合、すべてのデータ・ファイルを4つの別々のディレクトリ(dir_1、dir_2、dir_3およびdir_4)に分割して保存できます。4つのJavaプロセス・スレッドを起動し、それらのディレクトリで別々に同時に動作させることができます。(詳細は、7.11.1項「パラレル(マルチスレッド)・モードでのprepareBulkの使用」を参照してください。)

すべてのデータ・ファイルが処理された後、1回のみcompleteBulkメソッドを起動し、例7-8に示すとおり、ステージング表のデータをセマンティク・ネットワークにロードできます。長いリテラルを持つトリプルもロードされます。

例7-8 ステージング表からセマンティク・ネットワークへのデータのロード(completeBulk)

graph.getBulkUpdateHandler().completeBulk(
null,  // flags for invoking SEM_APIS.bulk_load_from_staging_table
null   // staging table name
);

また、prepareBulkメソッドは、Jenaモデルも入力データ・ソースとして取得でき、この場合は、そのJenaモデルのトリプルが基礎となるステージング表にロードされます。詳細は、Javadocを参照してください。

Jenaモデルとデータ・ファイルからトリプルをロードする以外に、prepareBulkメソッドは、例7-9に示すとおり、RDFaをサポートします。(RDFaについては、http://www.w3.org/TR/xhtml-rdfa-primer/を参照してください。)

例7-9 prepareBulkでのRDFaの使用

graph.getBulkUpdateHandler().prepareBulk(
rdfaUrl,   // url to a web page using RDFa
"SEMTS",   // tablespace
null,      // flags
null,      // listener
null       // staging table name
);

RDFaを解析するには、関連するjava-rdfaライブラリをクラスパスに含める必要があります。その他の設定やAPIコールは必要ありません。(java-rdfaの詳細は、http://www.rootdev.net/maven/projects/java-rdfa/およびProject Informationの下のその他のトピックを参照してください。)

rdfaUrlがファイアウォールの外側にある場合は、次のHTTPプロキシ関連のJava VMプロパティを設定する必要がある場合があります。

-Dhttp.proxyPort=...
-Dhttp.proxyHost=...

この項の前述の例では、トリプル・データを単一のグラフにロードします。(NQUADS形式のデータなど)複数の名前付きグラフにわたる場合があるクワッド・データのロードには、DatasetGraphOracleSemクラスを使用する必要があります。例7-10に示すとおり、DatasetGraphOracleSemクラスはBulkUpdateHandler APIを使用しませんが、類似するprepareBulkおよびcompleteBulkインタフェースを提供します。

例7-10 DatasetGraphへのクワッドのロード

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);

// Can only create DatasetGraphOracleSem from an existing GraphOracleSem
GraphOracleSem graph = new GraphOracleSem(oracle, szModelName);
DatasetGraphOracleSem dataset = DatasetGraphOracleSem.createFrom(graph);

// Don't need graph anymore, close it to free resources
graph.close();

try {
InputStream is = new FileInputStream(szFileName);
// load NQUADS file into a staging table. This file can be gzipp'ed.
dataset.prepareBulk(
is,                // input stream
"http://my.base/", // base URI
"N-QUADS",         // data file type; can be "TRIG"
"SEMTS",           // tablespace
null,              // flags
null,              // listener
null,              // staging table name
false              // truncate staging table before load
);
// Load quads from staging table into the dataset
dataset.completeBulk(
null, // flags; can be "PARSE PARALLEL_CREATE_INDEX PARALLEL=4
//                mbv_method=shadow" on a quad core machine
null  // staging table name
);
}
catch (Throwable t) {
System.out.println("Hit exception " + t.getMessage());
}
finally {
dataset.close();
oracle.dispose();
}

7.11.1 パラレル(マルチスレッド)・モードでのprepareBulkの使用

例7-7「ステージング表へのデータのロード(prepareBulk)」には、ファイル・システム・ディレクトリ下の一連のファイルを、Oracle Database表(ステージング表)へ、順番にロードする方法が示されていました。例7-11では、一連のファイルを同時にOracle表(ステージング表)にロードします。並列度は、入力パラメータiMaxThreadsによって制御されます。

4つ以上のCPUコアを使用するロードバランシングされたハードウェア設定で、iMaxThreadsに8 (または16)を設定すると、多数のデータ・ファイルが処理される場合に、prepareBulk操作の速度を大幅に向上できます。

例7-11 prepareBulkでのiMaxThreadsの使用

public void testPrepareInParallel(String jdbcUrl, String user,
String password, String modelName,
String lang,
String tbs,
String dirname,
int iMaxThreads,
PrintStream psOut)
throws SQLException, IOException,  InterruptedException
{
File dir = new File(dirname);
File[] files = dir.listFiles();

// create a set of physical Oracle connections and graph objects
Oracle[] oracles = new Oracle[iMaxThreads];
GraphOracleSem[] graphs = new GraphOracleSem[iMaxThreads];
for (int idx = 0; idx < iMaxThreads; idx++) {
oracles[idx] = new Oracle(jdbcUrl, user, password);
graphs[idx] = new GraphOracleSem(oracles[idx], modelName);
}

PrepareWorker[] workers = new PrepareWorker[iMaxThreads];
Thread[] threads = new Thread[iMaxThreads];
for (int idx = 0; idx < iMaxThreads; idx++) {
workers[idx] = new PrepareWorker(
graphs[idx],
files,
idx,
iMaxThreads,
lang,
tbs,
psOut
);
threads[idx] = new Thread(workers[idx], workers[idx].getName());
psOut.println("testPrepareInParallel: PrepareWorker " + idx + " running");
threads[idx].start();
}

psOut.println("testPrepareInParallel: all threads started");

for (int idx = 0; idx < iMaxThreads; idx++) {
threads[idx].join();
}
for (int idx = 0; idx < iMaxThreads; idx++) {
graphs[idx].close();
oracles[idx].dispose();
}
}

static class PrepareWorker implements Runnable
{
GraphOracleSem graph = null;
int idx;
int threads;
File[] files = null;
String lang = null;
String tbs  = null;
PrintStream psOut;

public void run()
{
long lStartTime = System.currentTimeMillis();
for (int idxFile = idx; idxFile < files.length; idxFile += threads) {
File file = files[idxFile];
try {
FileInputStream fis = new FileInputStream(file);
graph.getBulkUpdateHandler().prepareBulk(
fis,
"http://base.com/",
lang,
tbs,
null,                   // flags
new MyListener(psOut),  // listener
null                    // table name
);
fis.close();
}
catch (Exception e) {
psOut.println("PrepareWorker: thread ["+getName()+"] error "+ e.getMessage());
}
psOut.println("PrepareWorker: thread ["+getName()+"] done to "
+ idxFile + ", file = " + file.toString()
+ " in (ms) " + (System.currentTimeMillis() - lStartTime));
}
}

public PrepareWorker(GraphOracleSem graph,
File[] files,
int idx,
int threads,
String lang,
String tbs,
PrintStream psOut)
{
this.graph   = graph;
this.files   = files;
this.psOut   = psOut;
this.idx     = idx;
this.threads = threads;
this.files   = files;
this.lang    = lang;
this.tbs     = tbs ;
}

public String getName()
{
return "PrepareWorker" + idx;
}
}

static class MyListener implements StatusListener
{
PrintStream m_ps = null;
public MyListener(PrintStream ps) { m_ps = ps; }
long lLastBatch = 0;

public void statusChanged(long count)
{
if (count - lLastBatch >= 10000) {
m_ps.println("process to " + Long.toString(count));
lLastBatch = count;
}
}

public int illegalStmtEncountered(Node graphNode, Triple triple, long count)
{
m_ps.println("hit illegal statement with object " + triple.getObject().toString());
return 0; // skip it
}
}

7.11.2 データ・ロード中の無効な構文の処理

prepareBulkを使用すると、無効なトリプルとクワッドをスキップできます。この機能は、ソースのRDFデータに構文エラーが含まれる可能性がある場合に有用です。例7-12では、(パッケージoracle.spatial.rdf.client.jenaで定義される) StatusListenerインタフェースのカスタマイズされた実装が、prepareBulkへのパラメータとして渡されます。この例で、illegalStmtEncounteredメソッドは、prepareBulkが無効なトリプルをスキップして進むことができるように、その無効なトリプルのオブジェクト・フィールドを出力し、0を戻します。

例7-12 無効な構文によるトリプルのスキップ

....

Oracle oracle = new Oracle(jdbcUrl, user, password);
GraphOracleSem graph = new GraphOracleSem(oracle, modelName);
PrintStream psOut = System.err;

graph.getBulkUpdateHandler().prepareBulk(
new FileInputStream(rdfDataFilename),
"http://base.com/",    // base
lang,                  // data format, can be "N-TRIPLES" "RDF/XML" ...
tbs,                   // tablespace name
null,                  // flags
new MyListener(psOut), // call back to show progress and also process illegal triples/quads
null,                  // tableName, if null use default names
false                  // truncate existing staging tables
);

graph.close();
oracle.dispose();
....

// A customized StatusListener interface implementation
public class MyListener implements StatusListener
{
PrintStream m_ps = null;
public MyListener(PrintStream ps) { m_ps = ps; }

public void statusChanged(long count)
{
// m_ps.println("process to " + Long.toString(count));
}

public int illegalStmtEncountered(Node graphNode, Triple triple, long count)
{
m_ps.println("hit illegal statement with object " + triple.getObject().toString());
return 0; // skip it
}
}

7.12 自動的な変数の名前変更

以前、SPARQL問合せで使用された変数名は、SQL文の一部としてOracle Databaseに直接渡されました。変数名にSQLまたはPL/SQLの予約済キーワードを含めると、その問合せは実行できませんでした。たとえば、次のSPARQL問合せは、dateという語がOracle DatabaseのSQL処理エンジンにとって特別な意味であることが理由で失敗していました。

select ?date { :event  :happenedOn ?date }

現在ではこの問合せは失敗しませんが、これは問合せが実行のためにOracle Databaseに送信される前に、スマート・スキャンが実行され、特定の予約済変数名(あるいは非常に長い変数名)の自動置換が実行されるためです。置換は予約済キーワードのリストに基づいて実行され、このリストはsdordfclient.jarに組み込まれた次のファイルに格納されています。

oracle/spatial/rdf/client/jena/oracle_sem_reserved_keywords.lst

このファイルには100以上のエントリが含まれており、必要に応じてファイルを編集し、エントリを追加できます。

次は、SQLまたはPL/SQLの予約済キーワードを変数として使用するSPARQL問合せの例で、変数名が自動的に変更されるため、正常に実行されます。

- 変数名にSELECTを使用する問合せ:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
select ?SELECT ?z
where
{    ?SELECT foaf:name ?y.
optional {?SELECT foaf:knows ?z.}
}

- 変数名にARRAYとDATEを使用する問合せ:

PREFIX x:    <http://example.com#>
construct {
?ARRAY x:date ?date .
}
where {
?ARRAY x:happenedOn ?date .
}

7.13 JavaScript Object Notation (JSON)形式のサポート

JavaScript Object Notation (JSON)形式は、SPARQL問合せのレスポンスのためにサポートされます。JSONデータ形式は単純、コンパクトで、JavaScriptプログラムに適しています。

たとえば、ResultSetFormatter.outputAsJSONメソッドをコールする次のようなJavaコード・スニペットがあるとします。

Oracle oracle = new Oracle(jdbcUrl, user, password);

GraphOracleSem graph = new GraphOracleSem(oracle, modelName);
ModelOracleSem model = new ModelOracleSem(graph);

graph.add(new Triple(
Node.createURI("http://ds1"),
Node.createURI("http://dp1"),
Node.createURI("http://do1")
)
);

graph.add(new Triple(
Node.createURI("http://ds2"),
Node.createURI("http://dp2"),
Node.createURI("http://do2")
)
);
graph.commitTransaction();

Query q = QueryFactory.create("select ?s ?p ?o where {?s ?p ?o}",
Syntax.syntaxARQ);
QueryExecution qexec = QueryExecutionFactory.create(q, model);

ResultSet results = qexec.execSelect();
ResultSetFormatter.outputAsJSON(System.out, results);

JSON出力は次のとおりです。

{
"head": {
"vars": [ "s" , "p" , "o" ]
} ,
"results": {
"bindings": [
{
"s": { "type": "uri" , "value": "http://ds1" } ,
"p": { "type": "uri" , "value": "http://dp1" } ,
"o": { "type": "uri" , "value": "http://do1" }
} ,
{
"s": { "type": "uri" , "value": "http://ds2" } ,
"p": { "type": "uri" , "value": "http://dp2" } ,
"o": { "type": "uri" , "value": "http://do2" }
}
]
}
}

前述の例を、Oracle Databaseに対して直接ではなく、リモートのSPARQLエンドポイントを問い合せるようにするには、次のように変更します。(リモートのSPARQLエンドポイントがファイアウォールの外側にある場合、HTTPプロキシを設定する必要があります。)

Query q = QueryFactory.create("select ?s ?p ?o where {?s ?p ?o}",
Syntax.syntaxARQ);
QueryExecution qe = QueryExecutionFactory.sparqlService(sparqlURL, q);

ResultSet results = qexec.execSelect();
ResultSetFormatter.outputAsJSON(System.out, results);

この項の最初の例を名前付きグラフに拡張するため、次のコード・スニペットでは、同じOracleモデルに2つのクワッドを追加し、名前付きグラフベースのSPARQL問合せを実行して、問合せ出力をJSON形式にシリアライズします。

DatasetGraphOracleSem dsgos = DatasetGraphOracleSem.createFrom(graph);
graph.close();

dsgos.add(new Quad(Node.createURI("http://g1"),
Node.createURI("http://s1"),
Node.createURI("http://p1"),
Node.createURI("http://o1")
)
);
dsgos.add(new Quad(Node.createURI("http://g2"),
Node.createURI("http://s2"),
Node.createURI("http://p2"),
Node.createURI("http://o2")
)
);

Query q1 = QueryFactory.create(
"select ?g ?s ?p ?o where { GRAPH ?g {?s ?p ?o} }");

QueryExecution qexec1 = QueryExecutionFactory.create(q1,
DataSourceImpl.wrap(dsgos));

ResultSet results1 = qexec1.execSelect();
ResultSetFormatter.outputAsJSON(System.out, results1);

dsgos.close();
oracle.dispose();

JSON出力は次のとおりです。

{
"head": {
"vars": [ "g" , "s" , "p" , "o" ]
} ,
"results": {
"bindings": [
{
"g": { "type": "uri" , "value": "http://g1" } ,
"s": { "type": "uri" , "value": "http://s1" } ,
"p": { "type": "uri" , "value": "http://p1" } ,
"o": { "type": "uri" , "value": "http://o1" }
} ,
{
"g": { "type": "uri" , "value": "http://g2" } ,
"s": { "type": "uri" , "value": "http://s2" } ,
"p": { "type": "uri" , "value": "http://p2" } ,
"o": { "type": "uri" , "value": "http://o2" }
}
]
}
}

また、次の例のように、JosekiベースのSPARQLエンドポイントに対してHTTPを介してJSONレスポンスを取得することもできます。通常、SPARQL Webサービス・エンドポイントに対してSPARQL問合せを実行する場合、Accept request-headフィールドはapplication/sparql-results+xmlに設定されます。JSON出力形式の場合は、Accept request-headフィールドをapplication/sparql-results+jsonに置き換えます。

http://hostname:7001/joseki/oracle?query=<URL_ENCODED_SPARQL_QUERY>&output=json

7.14 その他の推奨事項とガイドライン

この項では、SPARQL問合せに関連する様々な推奨事項およびその他の情報について説明します。

7.14.1 EXISTSやNOT EXISTSにかわるBOUNDや!BOUNDの使用

パフォーマンスをさらに向上するには、EXISTSやNOT EXISTSのかわりに、BOUNDや!BOUNDを使用します。

7.14.2 SPARQL 1.1のSELECT表現

ファンクションが現在Oracle Databaseでサポートされていなくても、パフォーマンスに大きなオーバーヘッドを発生させることなく、SPARQL 1.1のSELECT表現を使用できます。例には次のものがあります。

-- Quyery using MD5 and SHA1 functions
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX xsd:  <http://www.w3.org/2001/XMLSchema#>
PREFIX eg:   <http://biometrics.example/ns#>
SELECT ?name (md5(?name) as ?name_in_md5) (sha1(?email) as ?sha1)
WHERE
{
?x foaf:name  ?name ; eg:email ?email .
}

-- Quyery using CONCAT function
PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
SELECT ( CONCAT(?G, " ", ?S) AS ?name )
WHERE
{
?P foaf:givenName ?G ; foaf:surname ?S
}

7.14.3 bnode (空白ノード)を含む構文

bnodeを含む構文を問合せパターンの中で自由に使用できます。たとえば、次のbnode関連の構文はパーサー・レベルでサポートされるため、各構文はそのトリプル問合せパターンベースの完全なバージョンと同等です。

:x :q [ :p "v" ] .

(1 ?x 3 4) :p "w" .

(1 [:p :q] ( 2 ) ) .

7.14.4 SERVICE句の制限

SPARQL 1.1のフェデレーテッド問合せを記述する際に、SERVICE句内の副問合せで戻される行に対して制限を設定できます。これによって、ローカルのリポジトリとリモートのSPARQLエンドポイントの間で転送されるデータ量を効果的に制限できます。

たとえば、次の問合せでは、SERVICE句の副問合せでlimit 100を指定しています。

PREFIX : <http://example.com/>
SELECT ?s ?o
WHERE
{
?s :name "CA"
SERVICE <http://REMOTE_SPARQL_ENDPOINT_HERE>
{
select ?s  ?o
{?s :info ?o}
limit 100
}
}

7.14.5 OracleGraphWrapperForOntModelクラスによるパフォーマンス向上

Jena OntModelクラスを使用すると、Jenaモデルに格納されているオントロジを作成、変更および分析できます。ただし、OntModelの実装は、データベースに格納されているセマンティク・データにとって最適とはいえません。OracleモデルでOntModelを使用する場合は、次善のパフォーマンスとなりますしたがって、このようなパフォーマンスの問題を軽減するために、クラスOracleGraphWrapperForOntModelが作成されました。

OracleGraphWrapperForOntModelクラスは、Jena Graphインタフェースを実装し、Jena OntModel APIで使用するためのOracle RDF/OWLモデルに基づくグラフを表します。OracleGraphWrapperForOntModelクラスは、2つのセマンティク・ストアをハイブリッドな方法で使用して、変更の永続化と問合せに対する応答を行います。どちらのセマンティク・ストアにも同じデータが含まれますが、一方はメモリーに存在し、他方はOracle Databaseに存在します。

OntModelを介して問合せがあると、OracleGraphWrapperForOntModelグラフは、パフォーマンスを向上させるためにインメモリー・ストアに対して問合せを実行します。ただし、OracleGraphWrapperForOntModelクラスでは、クラスの追加または削除などのOntModelを介した変更の永続化を、両方のストアに変更を適用することによって行います。

ハイブリッドな方法を使用していることから、OracleGraphWrapperForOntModelグラフでは、メモリーにオントロジのコピーを格納するため、十分なメモリーがJVMに割り当てられている必要があります。内部の実験では、およそ3,000,000のトリプルによるオントロジで、6GB以上の物理メモリーを必要とすることがわかっています。

例7-13では、OntModel APIとOracleモデルに格納されている既存のオントロジを使用する方法を表示します。

例7-13 OntModelとOracle Databaseに格納されたオントロジの使用

// Set up connection to Oracle semantic store and the Oracle model
// containing the ontology
Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
GraphOracleSem oracleGraph = new GraphOracleSem(oracle, szModelName);

// Create a new hybrid graph using the oracle graph to persist
// changes.  This method will copy all the data from the oracle graph
// into an in-memory graph, which may significantly increase JVM memory
// usage.
Graph hybridGraph = OracleGraphWrapperForOntModel.getInstance(oracleGraph);

// Build a model around the hybrid graph and wrap the model with Jena's
// OntModel
Model model = ModelFactory.createModelForGraph(hybridGraph);
OntModel ontModel = ModelFactory.createOntologyModel(ontModelSpec, model);

// Perform operations on the ontology
OntClass personClass = ontModel.createClass("<http://someuri/person>");
ontModel.createIndividual(personClass);

// Close resources (will also close oracleGraph)!
hybridGraph.close();
ontModel.close();

OracleGraphWrapperForOntModelを使用して作成されたOntModelオブジェクトは、(別のOntModelを介した、または同じ基礎となるモデルを参照する別のOracleグラフを介した)別のプロセスによって行われた、基礎となるOracleモデルへの変更を反映しません。オントロジへのすべての変更は、モデルまたはグラフが閉じられるまで、単一のOntModelオブジェクトと、その基礎となるOracleGraphWrapperForOntModelグラフを介して実行される必要があります。

OracleGraphWrapperForOntModelによって使用されるデフォルトのインメモリー・セマンティク・ストアが、オントロジとシステムにとって十分ではない場合、インメモリー・ストアとして使用するカスタム・グラフを指定するためのインタフェースがクラスによって提供されます。例7-14に、カスタム・インメモリー・グラフを使用してOntModelからの問合せに応答するOracleGraphWrapperForOntModelを作成する方法を示します。

例7-14 カスタム・インメモリー・グラフの使用

// Set up connection to Oracle semantic store and the Oracle model
// containing the ontology
Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
GraphOracleSem oracleGraph = new GraphOracleSem(oracle, szModelName);

// Create a custom in-memory graph to use instead of the default
// Jena in-memory graph for quickly answering OntModel queries.
// Note that this graph does not *need* to be in-memory, but in-memory
// is preferred.
GraphBase queryGraph = new CustomInMemoryGraphImpl();

// Create a new hybrid graph using the oracle graph to persist
// changes and the custom in-memory graph to answer queries.
// Also set the degree of parallelism to use when copying data from
// the oracle graph to the querying graph.
int degreeOfParallelism = 4;
Graph hybridGraph = OracleGraphWrapperForOntModel.getInstance(oracleGraph, queryGraph, degreeOfParallelism);

// Build a model and wrap the model with Jena's OntModel
Model model = ModelFactory.createModelForGraph(hybridGraph);
OntModel ontModel = ModelFactory.createOntologyModel(ontModelSpec, model);

// Perform operations on the ontology
// ...

// Close resources (will close oracleGraph and queryGraph)!
hybridGraph.close();
ontModel.close();

7.15 Jena Adapterを使用した問合せ例

この項では、Jena Adapterを使用した問合せの例を示します。各例は自己完結型で、通常はモデルの作成、トリプルの作成、推論を含む可能性のある問合せの実行、結果の表示およびモデルの削除を行います。

この項では、次の手順を実行する問合せについて説明します。

- URLによるオントロジの参照、およびローカル・ファイルからオントロジをバルク・ロードする方法の両方によって、universityオントロジの例で表明されたトリプルと表明に加えて推論されたトリプルをカウントします。

- familyオントロジを使用して複数のSPARQL問合せを実行します(LIMIT、OFFSET、TIMEOUT、DOP (並列度)、ASK、DESCRIBE、CONSTRUCT、GRAPH、ALLOW_DUP (複数のモデルによる重複トリプル)、SPARUL (データの挿入)などの機能が含まれます)。

- ARQ組込みファンクションを使用します。

- SELECTキャスト問合せを使用します。

- OracleConnectionを使用してOracle Databaseをインスタンス化します。

- Oracle Database接続プーリングを使用します。

問合せを実行するには、次の手順を実行する必要があります。

1. コードをJavaソース・ファイルに含めます。この項で使用される例は、Jena Adapterダウンロードのexamplesディレクトリのファイルで提供されています。

2. Javaソース・ファイルをコンパイルします。次に例を示します。

> javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test.java

注意:
javacコマンドおよびjavaコマンドは、それぞれ1行のコマンドラインである必要があります。

3. コンパイルされたファイルを実行します。次に例を示します。

> java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1

7.15.1 Test.java: 家族関係の問合せ

例7-15では、JohnがMaryの父であることを指定し、次に各fatherOf関係で主語と目的語を選択して表示します。

例7-15 家族関係の問合せ

import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.query.*;
public class Test {

public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
Model model = ModelOracleSem.createOracleSemModel(
oracle, szModelName);

model.getGraph().add(Triple.create(
Node.createURI("http://example.com/John"),
Node.createURI("http://example.com/fatherOf"),
Node.createURI("http://example.com/Mary")));
Query query = QueryFactory.create(
"select ?f ?k WHERE {?f <http://example.com/fatherOf> ?k .}");
QueryExecution qexec = QueryExecutionFactory.create(query, model);
ResultSet results = qexec.execSelect();
ResultSetFormatter.out(System.out, results, query);
model.close();
oracle.dispose();
}
}

例7-15をコンパイルして実行するコマンドと、想定されるjavaコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1

---------------------------------------------------------
| f                         | k                         |
=========================================================
| <http://example.com/John> | <http://example.com/Mary> |
---------------------------------------------------------

7.15.2 Test6.java: OWLオントロジのロードとOWLPrime推論の実行

例7-16では、OWLオントロジをロードして、OWLPrime推論を実行します。OWLオントロジがRDF/XML形式であり、Oracleにロードされた後にN-triple形式でシリアライズされることに注意してください。また、この例は表明および推論されたトリプルの数を問い合せます。

この例のオントロジはhttp://swat.cse.lehigh.edu/onto/univ-bench.owlから入手することができ、これには、ロール、リソースおよび大学環境での関係について記述されています。

例7-16 OWLオントロジのロードとOWLPrime推論の実行

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import oracle.spatial.rdf.client.jena.*;
public class Test6 {
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
Model model = ModelOracleSem.createOracleSemModel(oracle, szModelName);

// load UNIV ontology
InputStream in = FileManager.get().open("./univ-bench.owl" );
model.read(in, null);
OutputStream os = new FileOutputStream("./univ-bench.nt");
model.write(os, "N-TRIPLE");
os.close();

String queryString =
" SELECT ?subject ?prop ?object WHERE { ?subject ?prop ?object } ";

Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;

try {
int iTriplesCount = 0;
ResultSet results = qexec.execSelect() ;
for ( ; results.hasNext() ; ) {
QuerySolution soln = results.nextSolution() ;
iTriplesCount++;
}
System.out.println("Asserted  triples count: " + iTriplesCount);
}
finally {
qexec.close() ;
}

Attachment attachment = Attachment.createInstance(
new String[] {}, "OWLPRIME",
InferenceMaintenanceMode.NO_UPDATE, QueryOptions.DEFAULT);

GraphOracleSem graph = new GraphOracleSem(oracle, szModelName, attachment);
graph.analyze();
graph.performInference();

query = QueryFactory.create(queryString) ;
qexec = QueryExecutionFactory.create(query,new ModelOracleSem(graph)) ;

try {
int iTriplesCount = 0;
ResultSet results = qexec.execSelect() ;
for ( ; results.hasNext() ; ) {
QuerySolution soln = results.nextSolution() ;
iTriplesCount++;
}
System.out.println("Asserted + Infered triples count: " + iTriplesCount);
}
finally {
qexec.close() ;
}
model.close();

OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-16をコンパイルして実行するコマンドと、想定されるjavaコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test6.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test6 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
Asserted  triples count: 294
Asserted + Infered triples count: 341

この出力には、以前のバージョンのLUBMオントロジが反映されていることに注意してください。最新バージョンのオントロジには、より多くのトリプルがあります。

7.15.3 Test7.java: OWLオントロジのバルク・ロードとOWLPrime推論の実行

例7-17では、7.15.2項と同じOWLオントロジ(バルク・ローダーを使用してローカル・ファイルに格納されるもの以外)をロードします。オントロジは増分およびバッチ・ローダーを使用してロードすることもでき、完全性を期すために例にはこれらの2つの方法も示されています。

例7-17 OWLオントロジのバルク・ロードとOWLPrime推論の実行

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.util.*;
import oracle.spatial.rdf.client.jena.*;

public class Test7
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];
// in memory Jena Model
Model model = ModelFactory.createDefaultModel();
InputStream is = FileManager.get().open("./univ-bench.owl");
model.read(is, "", "RDF/XML");
is.close();

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem modelDest = ModelOracleSem.createOracleSemModel(oracle,
szModelName);

GraphOracleSem g = modelDest.getGraph();
g.dropApplicationTableIndex();

int method = 2; // try bulk loader
String tbs = "SYSAUX"; // can be customized
if (method == 0) {
System.out.println("start incremental");
modelDest.add(model);
System.out.println("end size " + modelDest.size());
}
else if (method == 1) {
System.out.println("start batch load");
g.getBulkUpdateHandler().addInBatch(
GraphUtil.findAll(model.getGraph()), tbs);
System.out.println("end size " + modelDest.size());
}
else {
System.out.println("start bulk load");
g.getBulkUpdateHandler().addInBulk(
GraphUtil.findAll(model.getGraph()), tbs);
System.out.println("end size " + modelDest.size());
}
g.rebuildApplicationTableIndex();

long lCount = g.getCount(Triple.ANY);
System.out.println("Asserted  triples count: " + lCount);
model.close();
OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-17をコンパイルして実行するコマンドと、想定されるjavaのコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test7.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test7 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
start bulk load
end size 293
Asserted  triples count: 293

この出力には、以前のバージョンのLUBMオントロジが反映されていることに注意してください。最新バージョンのオントロジには、より多くのトリプルがあります。

7.15.4 Test8.java: SPARQL OPTIONAL問合せ

例7-18では、SPARQL OPTIONAL問合せを示します。この例では、次の条件を持つトリプルを挿入します。

- Johnは、Maryの親です。

- Johnは、Jackの親です。

- Maryは、Jillの親です。

次に親子関係を検出し、オプションで孫(gkid)の関係も含めます。

例7-18 SPARQL OPTIONAL問合せ

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;

public class Test8
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle,
szModelName);
GraphOracleSem g = model.getGraph();

g.add(Triple.create(
Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Mary")));
g.add(Triple.create(
Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Jack")));
g.add(Triple.create(
Node.createURI("u:Mary"), Node.createURI("u:parentOf"),
Node.createURI("u:Jill")));

String queryString =
" SELECT ?s ?o ?gkid " +
" WHERE { ?s <u:parentOf> ?o . OPTIONAL {?o <u:parentOf> ?gkid }} ";

Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;

try {
int iMatchCount = 0;
ResultSet results = qexec.execSelect() ;
ResultSetFormatter.out(System.out, results, query);
}
finally {
qexec.close() ;
}
model.close();

OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-18をコンパイルして実行するコマンドと、想定されるjavaコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test8.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test8 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
----------------------------------
| s        | o        | gkid     |
==================================
| <u:John> | <u:Mary> | <u:Jill> |
| <u:Mary> | <u:Jill> |          |
| <u:John> | <u:Jack> |          |
----------------------------------

7.15.5 Test9.java: LIMITおよびOFFSETを使用するSPARQL問合せ

例7-19では、LIMITおよびOFFSETを使用するSPARQL問合せを示します。この例では、次の条件を持つトリプルを挿入します。

- Johnは、Maryの親です。

- Johnは、Jackの親です。

- Maryは、Jillの親です。

次に、1つの親子関係(LIMIT 1)を検出し、検出された最初の2つの親子関係(OFFSET 2)をスキップして、オプションで検出された親子に対する孫(gkid)の関係を追加します。

例7-19 LIMITおよびOFFSETを使用するSPARQL問合せ

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;
public class Test9
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle,
szModelName);
GraphOracleSem g = model.getGraph();

g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Mary")));
g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Jack")));
g.add(Triple.create(Node.createURI("u:Mary"), Node.createURI("u:parentOf"),
Node.createURI("u:Jill")));

String queryString =
" SELECT ?s ?o ?gkid " +
" WHERE { ?s <u:parentOf> ?o . OPTIONAL {?o <u:parentOf> ?gkid }} " +
" LIMIT 1 OFFSET 2";

Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;

int iMatchCount = 0;
ResultSet results = qexec.execSelect() ;
ResultSetFormatter.out(System.out, results, query);
qexec.close() ;
model.close();

OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-19をコンパイルして実行するコマンドと、想定されるjavaコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test9.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test9 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
------------------------------
| s        | o        | gkid |
==============================
| <u:John> | <u:Jack> |      |
------------------------------

7.15.6 Test10.java: TIMEOUTおよびDOPを使用するSPARQL問合せ

例7-20では、7.15.5項のSPARQL問合せに、タイムアウト設定(TIMEOUT=1、秒単位)およびパラレル実行設定(DOP=4)などの機能を追加した例を示します。

例7-20 TIMEOUTおよびDOPを使用するSPARQL問合せ

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;

public class Test10 {
public static void main(String[] args) throws Exception  {
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName);
GraphOracleSem g = model.getGraph();

g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Mary")));
g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Jack")));
g.add(Triple.create(Node.createURI("u:Mary"), Node.createURI("u:parentOf"),
Node.createURI("u:Jill")));
String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#dop=4,timeout=1> "
+ " SELECT ?s ?o ?gkid WHERE { ?s <u:parentOf> ?o . "
+ " OPTIONAL {?o <u:parentOf> ?gkid }} "
+ " LIMIT 1 OFFSET 2";

Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;

int iMatchCount = 0;
ResultSet results = qexec.execSelect() ;
ResultSetFormatter.out(System.out, results, query);
qexec.close() ;
model.close();

OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-20をコンパイルして実行するコマンドと、想定されるjavaコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test10.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test10 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
------------------------------
| s        | o        | gkid |
==============================
| <u:Mary> | <u:Jill> |      |
------------------------------

7.15.7 Test11.java: 名前付きグラフを含む問合せ

例7-21では、名前付きグラフを含む問合せを示します。これには、名前付きグラフのURIとその作成者に関する情報を持つデフォルト・グラフが含まれます。この問合せは、グラフ名とそのグラフの作成者を検索し、各名前付きグラフでfoaf:mbox述語を使用してメールボックスの値を検索します。

例7-21 名前付きグラフ・ベースの問合せ

import java.io.*;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.sparql.core.*;
import com.hp.hpl.jena.query.*;
import oracle.spatial.rdf.client.jena.*;

public class Test11
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
GraphOracleSem graph = new GraphOracleSem(oracle, szModelName);
DatasetGraphOracleSem dataset = DatasetGraphOracleSem.createFrom(graph);

// don't need the GraphOracleSem anymore, release resources
graph.close();

// add data to the default graph
dataset.add(new Quad(
Quad.defaultGraphIRI, // specifies default graph
Node.createURI("http://example.org/bob"),
Node.createURI("http://purl.org/dc/elements/1.1/publisher"),
Node.createLiteral("Bob Hacker")));
dataset.add(new Quad(
Quad.defaultGraphIRI, // specifies default graph
Node.createURI("http://example.org/alice"),
Node.createURI("http://purl.org/dc/elements/1.1/publisher"),
Node.createLiteral("alice Hacker")));

// add data to the bob named graph
dataset.add(new Quad(
Node.createURI("http://example.org/bob"), // graph name
Node.createURI("urn:bob"),
Node.createURI("http://xmlns.com/foaf/0.1/name"),
Node.createLiteral("Bob")));
dataset.add(new Quad(
Node.createURI("http://example.org/bob"), // graph name
Node.createURI("urn:bob"),
Node.createURI("http://xmlns.com/foaf/0.1/mbox"),
Node.createURI("mailto:bob@example")));

// add data to the alice named graph
dataset.add(new Quad(
Node.createURI("http://example.org/alice"), // graph name
Node.createURI("urn:alice"),
Node.createURI("http://xmlns.com/foaf/0.1/name"),
Node.createLiteral("Alice")));
dataset.add(new Quad(
Node.createURI("http://example.org/alice"), // graph name
Node.createURI("urn:alice"),
Node.createURI("http://xmlns.com/foaf/0.1/mbox"),
Node.createURI("mailto:alice@example")));

DataSource ds = DatasetFactory.create(dataset);

String queryString =
" PREFIX foaf: <http://xmlns.com/foaf/0.1/> "
+ " PREFIX dc: <http://purl.org/dc/elements/1.1/> "
+ " SELECT ?who ?graph ?mbox "
+ " FROM NAMED <http://example.org/alice> "
+ " FROM NAMED <http://example.org/bob> "
+ " WHERE "
+ " { "
+ "    ?graph dc:publisher ?who . "
+ "    GRAPH ?graph { ?x foaf:mbox ?mbox } "
+ " } ";

Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.create(query, ds);

ResultSet results = qexec.execSelect();
ResultSetFormatter.out(System.out, results, query);

qexec.close();
dataset.close();

oracle.dispose();
}
}

例7-21をコンパイルして実行するコマンドと、想定されるjavaコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test11.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test11 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1

7.15.8 Test12.java: SPARQL ASK問合せ

例7-22では、SPARQL ASK問合せを示します。この例では、JohnがMaryの親であるという条件のトリプルを挿入します。次に、JohnがMaryの親かどうかを検索します。

例7-22 SPARQL ASK問合せ

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;
public class Test12
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle,
szModelName);
GraphOracleSem g = model.getGraph();

g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Mary")));
String queryString = " ASK { <u:John> <u:parentOf> <u:Mary> } ";

Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;
boolean b = qexec.execAsk();
System.out.println("ask result = " + ((b)?"TRUE":"FALSE"));
qexec.close() ;

model.close();
OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-22をコンパイルして実行するコマンドと、想定されるjavaコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test12.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test12 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
ask result = TRUE

7.15.9 Test13.java: SPARQL DESCRIBE問合せ

例7-23では、SPARQL DESCRIBE問合せを示します。この例では、次の条件を持つトリプルを挿入します。

- Johnは、Maryの親です。

- Johnは、Jackの親です。

- Amyは、Jackの親です。

次に、Jackの親を含むすべての関係を検索します。

例7-23 SPARQL DESCRIBE問合せ

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;

public class Test13
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName);
GraphOracleSem g = model.getGraph();

g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Mary")));
g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Jack")));
g.add(Triple.create(Node.createURI("u:Amy"), Node.createURI("u:parentOf"),
Node.createURI("u:Jack")));
String queryString = " DESCRIBE ?x WHERE {?x <u:parentOf> <u:Jack>}";

Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;
Model m = qexec.execDescribe();
System.out.println("describe result = " + m.toString());

qexec.close() ;
model.close();
OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-23をコンパイルして実行するコマンドと、想定されるjavaコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test13.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test13 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
describe result = <ModelCom   {u:Amy @u:parentOf u:Jack; u:John @u:parentOf u:Jack; u:John @u:parentOf u:Mary} | >

7.15.10 Test14.java: SPARQL CONSTRUCT問合せ

例7-24では、SPARQL CONSTRUCT問合せを示します。この例では、次の条件を持つトリプルを挿入します。

- Johnは、Maryの親です。

- Johnは、Jackの親です。

- Amyは、Jackの親です。

- それぞれの親は、自分の子ども全員を愛しています。

次に、だれがだれを愛しているかについての情報でRDFグラフを構築します。

例7-24 SPARQL CONSTRUCT問合せ

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;

public class Test14
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName);
GraphOracleSem g = model.getGraph();

g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Mary")));
g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Jack")));
g.add(Triple.create(Node.createURI("u:Amy"), Node.createURI("u:parentOf"),
Node.createURI("u:Jack")));
String queryString = " CONSTRUCT { ?s <u:loves> ?o } WHERE {?s <u:parentOf> ?o}";

Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;
Model m = qexec.execConstruct();
System.out.println("Construct result = " + m.toString());

qexec.close() ;
model.close();
OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-24をコンパイルして実行するコマンドと、想定されるjavaコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test14.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test14 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
Construct result = <ModelCom   {u:Amy @u:loves u:Jack; u:John @u:loves u:Jack; u:John @u:loves u:Mary} | >

7.15.11 Test15.java: 複数のモデルの問合せと重複の許可の指定

例7-25では、複数のモデルを問い合せ、重複の許可オプションを使用します。この例では、次の条件を持つトリプルを挿入します。

- Johnは、Jackの親です(モデル1)。

- Maryは、Jackの親です(モデル2)。

- それぞれの親は、自分の子ども全員を愛しています。

次に、だれがだれを愛しているかについて検索します。両方のモデルを検索し、モデルでの重複トリプルを(この例に重複はありませんが)許可します。

例7-25 複数のモデルの問合せと重複の許可の指定

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;

public class Test15
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName1 = args[3];
String szModelName2 = args[4];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem model1 = ModelOracleSem.createOracleSemModel(oracle, szModelName1);
model1.getGraph().add(Triple.create(Node.createURI("u:John"),
Node.createURI("u:parentOf"), Node.createURI("u:Jack")));
model1.close();

ModelOracleSem model2 = ModelOracleSem.createOracleSemModel(oracle, szModelName2);
model2.getGraph().add(Triple.create(Node.createURI("u:Mary"),
Node.createURI("u:parentOf"), Node.createURI("u:Jack")));
model2.close();

String[] modelNamesList = {szModelName2};
String[] rulebasesList  = {};
Attachment attachment = Attachment.createInstance(modelNamesList, rulebasesList,
InferenceMaintenanceMode.NO_UPDATE,
QueryOptions.ALLOW_QUERY_VALID_AND_DUP);

GraphOracleSem graph = new GraphOracleSem(oracle, szModelName1, attachment);
ModelOracleSem model = new ModelOracleSem(graph);

String queryString = " CONSTRUCT { ?s <u:loves> ?o } WHERE {?s <u:parentOf> ?o}";
Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;
Model m = qexec.execConstruct();
System.out.println("Construct result = " + m.toString());

qexec.close() ;
model.close();
OracleUtils.dropSemanticModel(oracle, szModelName1);
OracleUtils.dropSemanticModel(oracle, szModelName2);
oracle.dispose();
}
}

例7-25をコンパイルして実行するコマンドと、想定されるjavaコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test15.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test15 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 M2
Construct result = <ModelCom   {u:Mary @u:loves u:Jack; u:John @u:loves u:Jack} | >

7.15.12 Test16.java: SPARQLの更新

例7-26では、2つのトリプルをモデルに挿入します。

例7-26 SPARQLの更新

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.util.iterator.*;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.update.*;

public class Test16
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName);
GraphOracleSem g = model.getGraph();
String insertString =
" PREFIX dc: <http://purl.org/dc/elements/1.1/> "         +
" INSERT DATA "                                           +
" { <http://example/book3> dc:title    \"A new book\" ; " +
"                         dc:creator  \"A.N.Other\" . "   +
" }   ";

UpdateAction.parseExecute(insertString,  model);
ExtendedIterator ei = GraphUtil.findAll(g);
while (ei.hasNext()) {
System.out.println("Triple " + ei.next().toString());
}
model.close();
OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-26をコンパイルして実行するコマンドと、想定されるjavaのコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test16.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test16 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
Triple http://example/book3 @dc:title "A new book"
Triple http://example/book3 @dc:creator "A.N.Other"

7.15.13 Test17.java: ARQ組込みファンクションを使用するSPARQL問合せ

例7-27では、2冊の本に関するデータを挿入し、その本のタイトルをすべて大文字で表示して、各タイトル文字列の長さも表示します。

例7-27 ARQ組込みファンクションを使用するSPARQL問合せ

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.util.iterator.*;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.update.*;

public class Test17 {
public static void main(String[] args) throws Exception  {
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName);
GraphOracleSem g = model.getGraph();
String insertString =
" PREFIX dc: <http://purl.org/dc/elements/1.1/> "         +
" INSERT DATA "                                           +
" { <http://example/book3> dc:title    \"A new book\" ; " +
"                         dc:creator  \"A.N.Other\" . "   +
"   <http://example/book4> dc:title    \"Semantic Web Rocks\" ; " +
"                         dc:creator  \"TB\" . "   +
" }   ";

UpdateAction.parseExecute(insertString,  model);
String queryString = "PREFIX  dc:   <http://purl.org/dc/elements/1.1/> " +
" PREFIX  fn: <http://www.w3.org/2005/xpath-functions#> " +
" SELECT ?subject (fn:upper-case(?object) as ?object1)  " +
"                 (fn:string-length(?object) as ?strlen) " +
" WHERE { ?subject dc:title ?object } "
;
Query query = QueryFactory.create(queryString, Syntax.syntaxARQ);
QueryExecution qexec = QueryExecutionFactory.create(query, model);
ResultSet results = qexec.execSelect();
ResultSetFormatter.out(System.out, results, query);
model.close();
OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-27をコンパイルして実行するコマンドと、想定されるjavaのコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test17.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test17 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
----------------------------------------------------------
| subject                | object1              | strlen |
==========================================================
| <http://example/book3> | "A NEW BOOK"         | 10     |
| <http://example/book4> | "SEMANTIC WEB ROCKS" | 18     |
----------------------------------------------------------

7.15.14 Test18.java: SELECTキャスト問合せ

例7-28では、2つの華氏温度(18.1と32.0)を摂氏温度に変換します。

例7-28 SELECTキャスト問合せ

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.util.iterator.*;
import oracle.spatial.rdf.client.jena.*;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.update.*;

public class Test18 {
public static void main(String[] args) throws Exception  {
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle,
szModelName);
GraphOracleSem g = model.getGraph();
String insertString =
" PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> " +
" INSERT DATA "                                     +
" { <u:Object1> <u:temp>    \"18.1\"^^xsd:float ; " +
"               <u:name>    \"Foo... \" . "         +
"   <u:Object2> <u:temp>    \"32.0\"^^xsd:float ; " +
"               <u:name>    \"Bar... \" . "         +
" }   ";

UpdateAction.parseExecute(insertString,  model);
String queryString =
" PREFIX  fn: <http://www.w3.org/2005/xpath-functions#> " +
" SELECT ?subject ((?temp - 32.0)*5/9 as ?celsius_temp) " +
"WHERE { ?subject <u:temp> ?temp } "
;
Query query = QueryFactory.create(queryString, Syntax.syntaxARQ);
QueryExecution qexec = QueryExecutionFactory.create(query, model);
ResultSet results = qexec.execSelect();
ResultSetFormatter.out(System.out, results, query);

model.close();
OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-28をコンパイルして実行するコマンドと、想定されるjavaのコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test18.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test18 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
------------------------------------------------------------------------
| subject     | celsius_temp                                           |
========================================================================
| <u:Object1> | "-7.7222223"^^<http://www.w3.org/2001/XMLSchema#float> |
| <u:Object2> | "0.0"^^<http://www.w3.org/2001/XMLSchema#float>        |
------------------------------------------------------------------------

7.15.15 Test19.java: OracleConnectionを使用したOracle Databaseのインスタンス化

例7-29では、指定されたOracleConnectionオブジェクトを使用して、異なる方法でOracleオブジェクトをインスタンス化しています。(J2EE Webアプリケーションでは、ユーザーは通常、J2EEデータ・ソースからOracleConnectionオブジェクトを取得できます。)

例7-29 OracleConnectionを使用したOracle Databaseのインスタンス化

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.util.iterator.*;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.update.*;
import oracle.spatial.rdf.client.jena.*;
import oracle.jdbc.pool.*;
import oracle.jdbc.*;

public class Test19 {
public static void main(String[] args) throws Exception {
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

OracleDataSource ds = new OracleDataSource();
ds.setURL(szJdbcURL);
ds.setUser(szUser);
ds.setPassword(szPasswd);
OracleConnection conn = (OracleConnection) ds.getConnection();
Oracle oracle = new Oracle(conn);

ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle,
szModelName);
GraphOracleSem g = model.getGraph();

g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Mary")));
g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Jack")));
g.add(Triple.create(Node.createURI("u:Mary"), Node.createURI("u:parentOf"),
Node.createURI("u:Jill")));
String queryString =
" SELECT ?s ?o  WHERE { ?s <u:parentOf> ?o .} ";
Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, model) ;

ResultSet results = qexec.execSelect() ;
ResultSetFormatter.out(System.out, results, query);
qexec.close() ;
model.close();
OracleUtils.dropSemanticModel(oracle, szModelName);
oracle.dispose();
}
}

例7-29をコンパイルして実行するコマンドと、想定されるjavaのコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test19.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test19 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
-----------------------
| s        | o        |
=======================
| <u:John> | <u:Mary> |
| <u:John> | <u:Jack> |
| <u:Mary> | <u:Jill> |
-----------------------

7.15.16 Test20.java: Oracle Database接続プーリング

例7-30では、Oracle Database接続プーリングを使用します。

例7-30 Oracle Database接続プーリング

import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.util.iterator.*;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.update.*;
import oracle.spatial.rdf.client.jena.*;
import oracle.jdbc.pool.*;
import oracle.jdbc.*;

public class Test20
{
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser    = args[1];
String szPasswd  = args[2];
String szModelName = args[3];

// test with connection properties (taken from some example)
java.util.Properties prop = new java.util.Properties();
prop.setProperty("MinLimit", "2");     // the cache size is 2 at least
prop.setProperty("MaxLimit", "10");
prop.setProperty("InitialLimit", "2"); // create 2 connections at startup
prop.setProperty("InactivityTimeout", "1800");    //  seconds
prop.setProperty("AbandonedConnectionTimeout", "900");  //  seconds
prop.setProperty("MaxStatementsLimit", "10");
prop.setProperty("PropertyCheckInterval", "60"); // seconds

System.out.println("Creating OraclePool");
OraclePool op = new OraclePool(szJdbcURL, szUser, szPasswd, prop,
"OracleSemConnPool");
System.out.println("Done creating OraclePool");

// grab an Oracle and do something with it
System.out.println("Getting an Oracle from OraclePool");
Oracle oracle = op.getOracle();
System.out.println("Done");
System.out.println("Is logical connection:" +
oracle.getConnection().isLogicalConnection());
GraphOracleSem g = new GraphOracleSem(oracle, szModelName);
g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Mary")));
g.close();
// return the Oracle back to the pool
oracle.dispose();

// grab another Oracle and do something else
System.out.println("Getting an Oracle from OraclePool");
oracle = op.getOracle();
System.out.println("Done");
System.out.println("Is logical connection:" +
oracle.getConnection().isLogicalConnection());
g = new GraphOracleSem(oracle, szModelName);
g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),
Node.createURI("u:Jack")));
g.close();

OracleUtils.dropSemanticModel(oracle, szModelName);

// return the Oracle back to the pool
oracle.dispose();
}
}

例7-30をコンパイルして実行するコマンドと、想定されるjavaのコマンドの出力は次のとおりです。

javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:/slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test20.java
java -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar:./iri-0.8.jar:./icu4j-3.4.4.jar:./log4j-1.2.14.jar  Test20 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
Creating OraclePool
Done creating OraclePool
Getting an Oracle from OraclePool
Done
Is logical connection:true
Getting an Oracle from OraclePool
Done
Is logical connection:true

7.16 SPARQL Gatewayとセマンティク・データ

SPARQL Gatewayは、Jena Adapter for Oracle Databaseに含まれるJ2EE Webアプリケーションです。Oracle Business Intelligence Enterprise Edition (OBIEE) 11gなどの、リレーショナル・データおよびXMLデータで稼働するアプリケーションで、セマンティク・データ(RDF/OWL/SKOS)を簡単に使用できるように設計されています。

この項には、次の主要なトピックがあります。

- 7.16.1項「SPARQL Gatewayの機能および利点の概要」

- 7.16.2項「SPARQL Gatewayのインストールおよび構成」

- 7.16.3項「SPARQL Gatewayでのセマンティク・データの使用」

- 7.16.4項「デフォルトのXSLTファイルのカスタマイズ」

- 7.16.5項「SPARQL GatewayのJava APIの使用」

- 7.16.6項「SPARQL GatewayのグラフィカルなWebインタフェースの使用」

- 7.16.7項「OBIEEへのXMLデータ・ソースとしてのSPARQL Gatewayの使用」

7.16.1 SPARQL Gatewayの機能および利点の概要

SPQRQL Gatewayでは、セマンティク・データを非セマンティク・アプリケーションに公開する際の次のような課題に対処します。

- RDF構文、SPARQL問合せ構文およびSPARQLプロトコルについて理解しておく必要があること。

- SPARQL問合せのレスポンス構文を理解しておく必要があること。

- 変換で、SPARQL問合せのレスポンスを、アプリケーションが使用できる形に変更する必要があること。

このような課題に対処するため、SPARQL Gatewayは、SPARQL問合せとXSLT操作を管理し、標準準拠の任意のSPARQLエンドポイントに対してSPARQL問合せを実行して、必要なXSL変換を実行してから、アプリケーションへレスポンスを渡します。こうすると、アプリケーションは既存のデータ・ソースからの場合と同じようにセマンティク・データを使用できるようになります。

多くの場合、トリプル・ストアまたはクワッド・ストアごとに機能は異なります。たとえば、Oracle DatabaseによってサポートされるSPARQLエンドポイントは、指定された標準準拠のSPARQL問合せを解析して応答するというコア機能に加え、Jena AdapterおよびJosekiを使用して、パラレル実行、問合せタイムアウト、動的なサンプリング、結果キャッシュおよびその他の機能を実行できます。ただし、これらの機能は、指定された別のセマンティク・データ・ストアからは使用できない場合があります。

Oracleセマンティク・テクノロジのSPARQL Gatewayでは、実行時間の長い問合せに対するタイムアウトを設定する機能や、所定の時間で複雑な問合せから部分的な結果を取得する機能など、特に必要とされる特定の機能を利用できます。アプリケーションにレスポンス時間の制約があるように、問合せの終了をいつまでも待っていることはエンド・ユーザーにとって困難です。SPARQL Gatewayは、SPARQLエンドポイントにタイムアウト機能とベスト・エフォート型問合せ機能の両方を提供します。これによって、SPARQL問合せの実行を介してセマンティク・データを使用する際の不確実性がある程度は効率的に排除されます。(7.16.3.2項「タイムアウト値の指定」と7.16.3.3項「ベスト・エフォート型問合せ実行の指定」を参照してください。)

7.16.2 SPARQL Gatewayのインストールおよび構成

SPARQL Gatewayをインストールして構成するには、次の主要な手順を実行します(それぞれの手順については後に続く項で説明します)。

1. Jena Adapterの.zipファイルのダウンロード(まだ実行していない場合)

2. WebLogic ServerでのSPARQL Gatewayのデプロイ

3. プロキシ設定の変更(必要な場合)

4. OracleSGDSデータ・ソースの構成(必要な場合)

5. SparqlGatewayAdminGroupグループの追加と構成(必要な場合)

7.16.2.1 Jena Adapterの.zipファイルのダウンロード(まだ実行していない場合)

Jena Adapter (jena_adaptor_for_release11.2.0.3.zip)をまだダウンロードしていない場合は、7.1項の説明のとおり、Oracle Databaseセマンティク・テクノロジのページからダウンロードし、一時ディレクトリに解凍します。

SPARQL GatewayのJavaクラスの実装は、sdordfclient.jarに組み込まれています(7.16.5項「Using the SPARQL GatewayのJava APIの使用」を参照)。

7.16.2.2 WebLogic ServerでのSPARQL Gatewayのデプロイ

Oracle WebLogic Serverで、次のようにSPARQL Gatewayをデプロイします。

1. 一時ディレクトリ(/tmp/sgなど)を作成します。

2. ダウンロードしたSPARQL Gatewayファイルを解凍したディレクトリから、sparqlgatewayディレクトリおよびそのディレクトリ下にあるすべて(サブディレクトリを含む)を、手順1で作成した一時ディレクトリにコピーします。次に例を示します。

cd /tmp
cp -rf  sparqlgateway/*  /tmp/sg

(このサンプル・ディレクトリの構造は、後から説明する手順で使用されます。)

3. ARQ 2.8.8パッケージがまだない場合は、http://sourceforge.net/projects/jena/files/ARQ/ARQ-2.8.8/arq-2.8.8.zip/downloadからダウンロードします。

4. ARQ 2.8.8パッケージから次のライブラリを/tmp/sg/WEB-INF/libにコピーします。

arq-2.8.8.jar
icu4j-3.4.4.jar
iri-0.8.jar
jena-2.6.4.jar
junit-4.5.jar
log4j-1.2.14.jar
lucene-core-2.3.1.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
stax-api-1.0.1.jar
wstx-asl-3.2.9.jar
xercesImpl-2.7.1.jar

5. 次のライブラリを/tmp/sg/WEB-INF/libにコピーします。

ojdbc6.jar  (from $ORACLE_HOME/jdbc/lib/ojdbc6.jar )
sdordfclient.jar  (from jena_adaptor_for_release11.2.0.3.zip under the jar/ directory)
sdordf.jar  from $ORACLE_HOME/md/jlib/sdordf.jar )

6. 必要に応じて、/tmp/sg/WEB-INF/web.xmlファイルをカスタマイズします。sparql_gateway_repository_filedirパラメータおよびsparql_gateway_repository_urlパラメータに適切な値を指定してください。

7. 必要に応じて、XSLTファイルまたはSPARQL問合せファイルを/tmp/sgディレクトリに追加します。
このディレクトリにはOracle提供のファイルdefault.xslt、noop.xsltおよびqb1.sparqlがあります。default.xsltファイルの主な目的は、SPARQL問合せレスポンス(XML)をOracle Business Intelligence Enterprise Edition (OBIEE)で利用可能な形式に変換することです。

(これらのファイルについては7.16.3.1項「SPARQL問合せとXSL変換の格納」を、SPARQL GatewayでのOBIEEの使用については7.16.7項「OBIEEへのXMLデータ・ソースとしてのSPARQL Gatewayの使用」を参照してください。)

8. 次のように、WebLogic Serverのautodeployディレクトリに移動し、sparqlgateway.warディレクトリを作成し、ファイルをコピーします。(開発ドメインでの自動デプロイ・アプリケーションの詳細は、http://docs.oracle.com/cd/E11035_01/wls100/deployment/autodeploy.htmlを参照してください。)

cd <domain_name>/autodeploy
mkdir sparqlgateway.war
cp -rf  /tmp/sg/*  <domain_name>/autodeploy/sparqgateway.war

この例では、<domain_name>はWebLogic Serverドメインの名前です。

9. /tmp/sgディレクトリから.warファイルを作成する場合は、次のコマンドを入力します。

cd /tmp/sg
jar cvf /tmp/sparqlgateway.war *

10. WebLogic Serverを起動または再起動します。

11. Webブラウザを使用して、次の書式のURLに接続し、デプロイメントを確認します(Webアプリケーションはポート7001でデプロイされているとします)。

http://<hostname>:7001/sparqlgateway

7.16.2.3 プロキシ設定の変更(必要な場合)

SPARQL Gatewayがファイアウォールの内側にあり、SPARQL Gatewayでファイアウォール内部のみでなくインターネット上のSPARQLエンドポイントとも通信する必要がある場合は、次のJVM設定を使用する必要があります。

-Dhttp.proxyHost=<your_proxy_host>
-Dhttp.proxyPort=<your_proxy_port>
-Dhttp.nonProxyHosts=127.0.0.1|<hostname_1_for_sparql_endpoint_inside_firewall>|<hostname_2_for_sparql_endpoint_inside_firewall>|...|<hostname_n_for_sparql_endpoint_inside_firewall>

これらの設定は、startWebLogic.shスクリプトで指定できます。

7.16.2.4 OracleSGDSデータ・ソースの構成(必要な場合)

SPARQL GatewayのSPARQL問合せおよびXSL変換を格納してアクセスするためにOracle Databaseを使用する場合は、OracleSGDSという名前のデータ・ソースを構成する必要があります。

このデータ・ソースを作成するには、7.2.1項「WebLogic Serverを使用した必要なデータ・ソースの作成」の手順に従いますが、データ・ソース名にはOracleSemDSではなくOracleSGDSを指定します。

OracleSGDSデータ・ソースが構成されていて使用可能な場合、SPARQL Gatewayサーブレットは、すべての必要な表と索引を初期化時に自動作成します。

7.16.2.5 SparqlGatewayAdminGroupグループの追加と構成(必要な場合)

SPARQL Gatewayの次のJSPファイルは、Oracle Databaseに格納されているSPARQL問合せとXSL変換を表示、編集および更新するために役立ちます。

http://<host>:7001/sparqlgateway/admin/sparql.jsp
http://<host>:7001/sparqlgateway/admin/xslt.jsp

これらのファイルは、HTTP Basic認証によって保護されています。WEB-INF/weblogic.xmlに、SparqlGatewayAdminGroupという名前のプリンシパルが定義されます。

これらのJSPページのいずれにでもログインできるように、WebLogic Serverを使用してSparqlGatewayAdminGroupという名前のグループを追加し、新しいユーザーを作成するか、または既存ユーザーをこのグループに割り当てる必要があります。

7.16.3 SPARQL Gatewayでのセマンティク・データの使用

SPARQL Gatewayと対話するアプリケーションの主要なインタフェースには、次の形式のURLを使用します。

http://host:port/sparqlgateway/sg?<SPARQL_ENDPOINT>&<SPARQL_QUERY>&<XSLT>

前述の形式の説明:

- <SPARQL_ENDPOINT>ではeeパラメータを指定しますが、これにはURLエンコード形式のSPARQLエンドポイントが含まれます。
たとえば、ee=http%3A%2F%2Fsparql.org%2Fbooksは、http://sparql.org/booksというSPARQLエンドポイントをURLエンコードした文字列です。これは、SPARQL問合せがエンドポイントhttp://sparql.org/booksに対して実行されることを意味します。

- <SPARQL_QUERY>では、SPARQL問合せ、またはSPARQL問合せの場所を指定します。
アプリケーションで非常に長いURLを使用できる場合は、SPARQL問合せ全体をエンコードし、URLにeq=<encoded_SPARQL_query>を設定できます(非常に長いURLをアプリケーションで使用できない場合は、7.16.3.1項で説明される方法の1つを使用して、SPARQL問合せを格納し、これらをSPARQL Gatewayで使用できるようにすることが可能です)。

- <XSLT>では、XSL変換またはXSL変換の場所を指定します。
アプリケーションで非常に長いURLを使用できる場合は、XSL変換全体をエンコードし、URLにex=<encoded_XSLT>を設定できます(非常に長いURLをアプリケーションで使用できない場合は、7.16.3.1項で説明される方法の1つを使用して、XSL変換を格納し、これらをSPARQL Gatewayで使用できるようにすることが可能です)。

関連トピック:

- SPARQL問合せとXSL変換の格納

- タイムアウト値の指定

- ベスト・エフォート型問合せ実行の指定

- text/xml以外のコンテンツ・タイプの指定

7.16.3.1 SPARQL問合せとXSL変換の格納

非常に長いURLをアプリケーションで使用できない場合は、7.16.3項で説明されているURL形式のうち<SPARQL_QUERY>と<XSLT>の部分で、SPARQL問合せとXSL変換の場所を指定できますが、このとき、次のいずれかの方法を使用します。

- SPARQL問合せとXSL変換をSPARQL Gateway Webアプリケーション自体に格納します。
これを行うには、sparqlgateway.warファイルを解凍し、最上位ディレクトリにSPARQL問合せとXSL変換を格納した後、sparqlgateway.warファイルを圧縮して再デプロイします。

sparqlgateway.warファイルには、サンプル・ファイルqb1.sparql (SPARQL問合せ)およびdefault.xslt (XSL変換)が含まれています。

ヒント:
SPARQL問合せファイルにはファイル拡張子.sparqlを使用し、XSL変換ファイルにはファイル拡張子.xsltを使用します。

(提供されているサンプル・ファイルの名前を使用して)これらのファイルを指定する構文は、SPARQL問合せファイルについてはwq=qb1.sparql、XSL変換ファイルについてはwx=default.xsltです。

デフォルトのXSL変換をカスタマイズする必要がある場合は、7.16.4項「デフォルトのXSLTファイルのカスタマイズ」の例を参照してください。

wx=noop.xsltを指定すると、XSL変換は実行されず、SPARQLレスポンスはそのままでクライアントに戻されます。

- ファイル・システム・ディレクトリにSPARQL問合せとXSL変換を格納し、そのディレクトリがデプロイ済のSPARQL Gateway Webアプリケーションにアクセス可能なことを確認します。
デフォルトでは、次の<init-param>設定に示すとおり、そのディレクトリは/tmpに設定されています。

<init-param>
<param-name>sparql_gateway_repository_filedir</param-name>
<param-value>/tmp/</param-value>
</init-param>

SPARQL Gatewayをデプロイする前に、このディレクトリをカスタマイズすることをお薦めします。ディレクトリ設定を変更するには、<param-value>タグと</param-value>タグの間のテキストを編集します。

次の例では、sparql_gateway_repository_filedirの<init-param>要素で指定されたディレクトリのSPARQL問合せファイルとXSL変換ファイルを指定します。

fq=qb1.sparql
fx=myxslt1.xslt

- SPARQL問合せとXSL変換をWebサイトからアクセス可能にします。
デフォルトでは、次の<init-param>設定に示すとおり、そのWebサイト・ディレクトリはhttp://127.0.0.1/queries/に設定されています。

<init-param>
<param-name>sparql_gateway_repository_url</param-name>
<param-value>http://127.0.0.1/queries/</param-value>
</init-param>

このディレクトリは、SPARQL Gatewayをデプロイする前にカスタマイズします。Webサイト設定を変更するには、<param-value>タグと</param-value>タグの間のテキストを編集します。

次の例では、sparql_gateway_repository_urlの<init-param>要素で指定されたURLのSPARQL問合せファイルとXSL変換ファイルを指定します。

uq=qb1.sparql
ux=myxslt1.xslt

SPARQL Gatewayの内部では、適切で完全なURLを計算し、内容をフェッチして、問合せ実行を開始し、問合せのレスポンスXMLにXSL変換を適用します。

- SPARQL問合せとXSL変換をOracle Databaseに格納します。
この方法では、J2EEデータ・ソースOracleSGDSを定義しておく必要があります。SPARQL GatewayがOracleSGDSデータ・ソースからデータベース接続を取得すると、指定された整数IDを使用してデータベース表ORACLE_ORARDF_SG_QUERYからSPARQL問合せが読み取られます。

Oracle DatabaseからSPARQL問合せをフェッチするための構文はdq=<integer-id>で、Oracle DatabaseからXSL変換をフェッチするための構文はdx=<integer-id>です。

サーブレットの初期化時に、次の表がまだ存在しない場合は、自動的に作成されます(手動で作成する必要はありません)。

- 主キーがQID (整数型)のORACLE_ORARDF_SG_QUERY

- 主キーがXID (整数型)のORACLE_ORARDF_SG_XSLT

7.16.3.2 タイムアウト値の指定

実行に長時間かかりそうな問合せを7.16.3項で説明されているURL形式を使用して送信する場合には、タイムアウト値をミリ秒単位で指定して実行時間を制限できます。たとえば次の例では、SPARQL Gatewayから開始されたSPARQL問合せの実行が1000ミリ秒(1秒)後に終了するようにURL形式とタイムアウトを指定しています。

http://host:port/sparqlgateway/sg?<SPARQL_ENDPOINT>&<SPARQL_QUERY>&<XSLT>&t=1000

タイムアウトが発生したときに問合せが終了していない場合、空のSPARQLレスポンスがSPARQL Gatewayによって構築されます。

SPARQL GatewayがHTTP接続レベルで問合せ実行をタイムアウトしても、サーバー側では問合せの実行が続く場合もあることに注意してください。実際の動作はベンダーによって異なります。

7.16.3.3 ベスト・エフォート型問合せ実行の指定

注意:
ベスト・エフォート型問合せ実行は、タイムアウト値も指定する場合にのみ指定できます(7.16.3.2項参照)。

実行に長時間かかりそうな問合せを7.16.3項で説明されているURL形式を使用して送信する場合には、タイムアウト値を指定していれば、問合せに対してベスト・エフォートの制限も指定できます。たとえば、次に示すURL形式では、1000ミリ秒(1秒)のタイムアウトとベスト・エフォート型(&b=t)を指定しています。

http://host:port/sparqlgateway/sg?<SPARQL_ENDPOINT>&<SPARQL_QUERY>&<XSLT>&t=1000&b=t

web.xmlファイルには、ベスト・エフォート型オプションの動作に影響する2つのパラメータ設定(sparql_gateway_besteffort_maxroundsおよびsparql_gateway_besteffort_maxthreads)が含まれます。デフォルトの定義を次に示します。

<init-param>
<param-name>sparql_gateway_besteffort_maxrounds</param-name>
<param-value>10</param-value>
</init-param>

<init-param>
<param-name>sparql_gateway_besteffort_maxthreads</param-name>
<param-value>3</param-value>
</init-param>

SPARQL SELECT問合せがベスト・エフォート型方式で実行される場合、一連の問合せが実行され、SPARQL問合せ本体のLIMIT値設定が大きくなります。(中心となる概念は、LIMIT設定を小さくするほどSPARQL問合せの実行が速くなるという観察結果に基づいています。)SPARQL Gatewayは、LIMIT 1設定で問合せ実行を開始します。タイムアウトの前に、この問合せを完了できることが理想です。そうなると仮定すると、次の問合せではLIMIT設定が大きくなり、後続の問合せではさらに制限が高くなります。問合せ実行の最大数は、sparql_gateway_besteffort_maxroundsパラメータによって制御されます。

一連の問合せをパラレルで実行可能な場合、sparql_gateway_besteffort_maxthreadsパラメータで並列度を制御します。

7.16.3.4 text/xml以外のコンテンツ・タイプの指定

デフォルトでは、SPARQL GatewayはXSL変換がXMLを生成することを前提としているため、HTTPレスポンスに設定されているデフォルトのコンテンツ・タイプはtext/xmlです。ただし、アプリケーションでXML以外のレスポンス形式が必要である場合は、次の書式を使用して、その形式を追加のURLパラメータ(構文&rt=を使用)に指定できます。

http://host:port/sparqlgateway/sg?<SPARQL_ENDPOINT>&<SPARQL_QUERY>&<XSLT>&rt=<content_type>

<content_type>はURLエンコードされている必要があることに注意します。

7.16.4 デフォルトのXSLTファイルのカスタマイズ

デフォルトのXSL変換ファイル(wx=default.xsltを使用して参照されるファイル)をカスタマイズできます。この項では、いくつかのカスタマイズ例を示します。

次の例では、ある変数のバインディングがhttp://purl.org/goodrelations/v1#で始まるURIを戻す場合には、その部分がgr:によって置き換えられ、http://www.w3.org/2000/01/rdf-schema#で始まるURIを戻す場合には、その部分がrdfs:によって置き換えられる、という名前空間の接頭辞置換ロジックを実装します。

<xsl:when test="starts-with(text(),'http://purl.org/goodrelations/v1#')">
<xsl:value-of select="concat('gr:',substring-after(text(),'http://purl.org/goodrelations/v1#'))"/>
</xsl:when>
...
<xsl:when test="starts-with(text(),'http://www.w3.org/2000/01/rdf-schema#')">
<xsl:value-of select="concat('rdfs:',substring-after(text(),'http://www.w3.org/2000/01/rdf-schema#'))"/>
</xsl:when>

次の例では、先頭のhttp://localhost/または先頭のhttp://127.0.0.1/を切り捨てるロジックを実装します。

<xsl:when test="starts-with(text(),'http://localhost/')">
<xsl:value-of select="substring-after(text(),'http://localhost/')"/>
</xsl:when>
<xsl:when test="starts-with(text(),'http://127.0.0.1/')">
<xsl:value-of select="substring-after(text(),'http://127.0.0.1/')"/>
</xsl:when>

7.16.5 SPARQL GatewayのJava APIの使用

Webインタフェースに加え、SPARQL Gateway管理サービスには、SPARQL問合せと関連するXSL変換を管理するための便利なJavaアプリケーション・プログラミング・インタフェース(API)があります。このJava APIは、Jena Adapterライブラリ(sdordfclient.jar)に含まれています。

Java APIリファレンス情報は、SPARQL Gatewayの.zipファイル(7.16.2.1項を参照)に含まれるjavadoc_sparqlgateway.zipファイルで入手できます。

このAPIのメイン・エントリ・ポイントはoracle.spatial.rdf.client.jena.SGDBHandlerクラス(SPARQL Gatewayデータベース・ハンドラ)で、問合せと変換を管理するために次のような静的メソッドを提供します。

- deleteSparqlQuery(Connection, int)

- deleteXslt(Connection, int)

- insertSparqlQuery(Connection, int, String, String, boolean)

- insertXslt(Connection, int, String, String, boolean)

- getSparqlQuery(Connection, int, StringBuilder, StringBuilder)

- getXslt(Connection, int, StringBuilder, StringBuilder)

これらのメソッドは、Oracle Databaseインスタンスに格納されているSPARQL Gateway関連の表のエントリを操作し、取得します。これらのメソッドを使用するには、必要な関連表がすでに存在している必要があります。表が存在しない場合は、SPARQL GatewayをWebサーバーにデプロイし、次の形式でURLにアクセスします。

http://<host>:<port>/sparqlgateway/sg?

<host>はWebサーバーのホスト名で、<port>はWebサーバーのリスニング・ポートです。表がまだ存在しない場合、このURLにアクセスすると、必要な表が自動的に作成されます。

Java APIを介して行われた変更は、管理Webインタフェースを介して行われた変更と同様に、SPARQL GatewayのWebサービスに影響を及ぼします。これにより、最も都合のよいインタフェースを使用して柔軟に問合せと変換を管理できます。

Java APIにより提供される挿入メソッドでは、表に格納されている既存の問合せや変換を置き換えることができない点に注意してください。既存の問合せまたは変換を置換しようとすると失敗します。問合せまたは変換を置き換えるには、削除メソッドの1つを使用して表にある既存のエントリを削除した後に、挿入メソッドの1つを使用して新しい問合せまたは変換を挿入する必要があります。

次の例に、Java APIを使用して一般的な管理タスクを実行する方法を示します。この例では、SPARQL Gatewayの基盤である、基礎となるOracle Databaseインスタンスへの接続がすでに確立されていることを前提としています。

例7-31では、SPARQL Gatewayの基盤となるデータベースに、問合せとXSL変換を追加します。問合せと変換が追加された後、他のプログラムでは、リクエストURLで適切な問合せID (qid)とXSL変換ID (xid)を指定することで、ゲートウェイを介して問合せと変換を使用できます。

注意:
例7-31では、問合せと変換の両方を挿入していますが、問合せと変換は必ずしも関連がある必要はなく、SPARQL Gatewayにアクセスするときに同時に使用される必要もありません。SPARQL Gatewayにリクエストを送信するときは、データベースの任意の問合せをデータベースの任意の変換とともに使用できます。

例7-31 SPARQL問合せとXSL変換の格納

String query = "PREFIX ... SELECT ..."; // full SPARQL query text
String xslt  = "<?xml ...> ...";        // full XSLT transformation text

String queryDesc = "Conference attendee information"; // description of SPARQL query
String xsltDesc = "BIEE table widget transformation"; // description of XSLT transformation

int queryId = queryIdCounter++; // assign a unique ID to this query
int xsltId  = xsltIdCounter++;  // assign a unique ID to this transformation

// Inserting a query or transformation will fail if the table already contains
// an entry with the same ID.  Setting this boolean to true will ignore these
// exceptions (but the table will remain unchanged). Here we specify that we
// want an exception thrown if we encounter a duplicate ID.
boolean ignoreDupException = false;

// add the query
try {
// Delete query if one already exists with this ID (this will not throw an
// error if no such entry exists)
SGDBHandler.deleteSparqlQuery( connection, queryId );
SGDBHandler.insertSparqlQuery( connection, queryId, query, queryDesc, ignoreDupException );
} catch( SQLException sqle ) {
// Handle exception
} catch( QueryException qe ) {
// Handle query syntax exception
}

// add the XSLT
try {
// Delete xslt if one already exists with this ID (this will not throw an
// error if no such entry exists)
SGDBHandler.deleteXslt( connection, xsltId );
SGDBHandler.insertXslt( connection, xsltId, xslt, xsltDesc, ignoreDupException );
}  catch( SQLException sqle ) {
// Handle database exception
} catch( TransformerConfigurationException tce ) {
// Handle XSLT syntax exception
}

例7-32では、データベースから既存の問合せを取得し、それを変更した後、更新された問合せを再度データベースに格納します。これらの手順では、問合せの編集と変更の保存をシミュレートします。(問合せが存在しない場合は、例外がスローされます。)

例7-32 問合せの変更

StringBuilder query;
StringBuilder description;

// Populate these with the query text and description from the database
query = new StringBuilder( );
description = new StringBuilder( );

// Get the query from the database
try {
SGDBHandler.getSparqlQuery( connection, queryId, query, description );
} catch( SQLException sqle ) {
// Handle exception
// NOTE: exception is thrown if query with specified ID does not exist
}

// The query and description should be populated now

// Modify the query
String updatedQuery = query.toString( ).replaceAll("invite", "attendee");

// Insert the query back into the database
boolean ignoreDup = false;
try {
// First must delete the old query
SGDBHandler.deleteSparqlQuery( connection, queryId );
// Now we can add
SGDBHandler.insertSparqlQuery( connection, queryId, updatedQuery, description.toString( ), ignoreDup );
} catch( SQLException sqle ) {
// Handle exception
} catch( QueryException qe ) {
// Handle query syntax exception
}

例7-33では、既存のXSL変換を取得し、標準出力に出力します。(変換が存在しない場合は、例外がスローされます。)

例7-33 XSL変換の取得および出力

StringBuilder xslt;
StringBuilder description;

// Populate these with the XSLT text and description from the database
xslt = new StringBuilder( );
description = new StringBuilder( );

try {
SGDBHandler.getXslt( connection, xsltId, xslt, description );
} catch( SQLException sqle ) {
// Handle exception
// NOTE: exception is thrown if transformation with specified ID does not exist
}

// Print it to standard output
System.out.printf( "XSLT description: %s\n", description.toString( ) );
System.out.printf( "XSLT body:\n%s\n", xslt.toString( ) );

7.16.6 SPARQL GatewayのグラフィカルなWebインタフェースの使用

SPARQL Gatewayでは、問合せのテスト、セマンティク・データのナビゲート、SPQARQL問合せとXSLTファイルの管理に役立つブラウザベースのインタフェースがいくつか用意されています。

- メイン・ページ(index.html)

- ナビゲーションとブラウジングのページ(browse.jsp)

- XSLTの管理ページ(xslt.jsp)

- SPARQLの管理ページ(sparql.jsp)

7.16.6.1 メイン・ぺージ(index.html)

http://<host>:<port>/sparqlgateway/index.htmlは、SPARQL問合せを実行してからdefault.xsltファイルの変換をレスポンスに適用するための簡単なインタフェースを提供します。図7-2に、このインタフェースでの問合せの実行を示します。

図7-2 グラフィカル・インタフェースのメイン・ぺージ(index.html)

「SPARQL Endpoint」を入力または選択し、「SPARQL SELECT Query Body」を指定して「Submit Query」を押します。

たとえば、SPARQLエンドポイントとしてhttp://dbpedia.org/sparqlを指定し、図7-2に示したSPARQL問合せ本体を使用すると、レスポンスは図7-3のようになります。この図では、(default.xsltの)デフォルトの変換がXML出力に適用されていることに注意してください。

図7-3 SPARQL問合せメイン・ぺージのレスポンス

7.16.6.2 ナビゲーションとブラウジングのページ(browse.jsp)

http://<host>:<port>/sparqlgateway/browse.jspは、セマンティク・データ用のナビゲーション機能とブラウジング機能を提供します。標準に準拠したすべてのSPARQLエンドポイントに対して使用できます。図7-4に、このインタフェースでの問合せの実行を示します。

図7-4 グラフィカル・インタフェースによるナビゲーションとブラウジングのページ(browse.jsp)

「SPARQL Endpoint」を入力または選択し、「SPARQL SELECT Query Body」を指定し、オプションで「Timeout (ms)」値(ミリ秒)と「Best Effort」オプションを指定して、「Submit Query」を押します。

図7-5に示すとおり、SPARQLレスポンスが解析され、表形式で示されます。

図7-5 ブラウジングとナビゲーションのページ: レスポンス

図7-5で、URIはナビゲーションできるようにクリック可能であり、ユーザーがURI上にカーソルを移動すると、読みやすいように短縮されていたURIのツールチップが表示されることに注意してください(図ではdc:titleのツールチップとしてhttp://purl.org.dc/elements/1.1/titleが表示されています)。

図7-5に示されている出力のURI http://example.org/book/book5をクリックすると、新しいSPARQL問合せが自動的に生成され、実行されます。図7-6に示すとおり、この生成されたSPARQL問合せには、この特定のURIを主語、述語および目的語として使用する、3つの問合せパターンがあります。このような問合せによって、このURIがどのように使用されるか、およびデータセットの他のリソースとどのように関連するかを理解できます。

図7-6 URIリンクのクリックによる問合せとレスポンス

問合せの一致が多い場合には、結果がページ単位に編成され、任意のページをクリックできます。デフォルトでは50個の結果が1ページに表示されます。ブラウジングとナビゲーションのページ(browse.jsp)でのレスポンスを、ページ当たり50行よりも多く(あるいは少なく)表示するには、URLに&resultsPerPageパラメータを指定します。たとえば、ページ当たり100行を表示できるようにするには、URLに次を含めます。

&resultsPerPage=100

7.16.6.3 XSLTの管理ページ(xslt.jsp)

http://<host>:<port>/sparqlgateway/admin/xslt.jspは、単純なXSLT管理インタフェースを提供します。XSLT ID (整数)を入力して「Get XSLT」をクリックすると、説明とXSLT本体の両方を取得できます。XSLT本体のテキストを変更した後に「Save XSLT」をクリックすると、その変更を保存できます。使用可能なXSLT定義間のナビゲートに役立つプレビューアがあることに注意してください。

図7-7は、XSLTの管理ページを示しています。

図7-7 XSLTの管理ページ

7.16.6.4 SPARQLの管理ページ(sparql.jsp)

http://<host>:<port>/sparqlgateway/admin/xslt.jspは、単純なSPARQL管理インタフェースを提供します。SPARQL ID (整数)を入力して「Get SPARQL」をクリックすると、説明とSPARQL本体を取得できます。SPARQL本体のテキストを変更した後に「Save SPARQL」をクリックすると、その変更を保存できます。使用可能なSPARQL定義間のナビゲートに役立つプレビューアがあることに注意してください。

図7-8は、SPARQLの管理ページを示しています。

図7-8 SPARQLの管理ページ

7.16.7 OBIEEへのXMLデータ・ソースとしてのSPARQL Gatewayの使用

この項では、SPARQL Gatewayをブリッジとして使用してOBIEEとRDFを統合することによって、Oracle Business Intelligence Enterprise Edition (OBIEE)で使用するXMLデータ・ソースを作成する方法について説明します。(具体的な手順と図は、Oracle BI管理ツールのバージョン11.1.1.3.0.100806.0408.000に基づいています。)

1. Oracle BI管理ツールを起動します。

2. 「ファイル」と「メタデータのインポート」を順次クリックします。図7-9に示すとおり、メタデータのインポート・ウィザードの最初のページが表示されます。

図7-9 「メタデータのインポート」 - 「データ・ソースの選択」

接続タイプ: 「XML」を選択します。

URL: SPARQL Gatewayと対話するアプリケーションのURL (7.16.3項を参照してください)。タイムアウト・オプションおよびベスト・エフォート型オプションを含めることもできます。

「ユーザー名」フィールドと「パスワード」フィールドは無視します。

3. 「次」をクリックします。図7-10に示すとおり、メタデータのインポート・ウィザードの2番目のページが表示されます。

図7-10 「メタデータのインポート」 - 「メタデータ型の選択」

インポートする必要なメタデータ型を選択します。選択したタイプに「表」が含まれていることを確認します。

4. 「次」をクリックします。図7-11に示すとおり、メタデータのインポート・ウィザードの3番目のページが表示されます。

図7-11 「メタデータのインポート」 - 「メタデータ・オブジェクトの選択」

「データソース・ビュー」で、表アイコンを持つノードを展開し、(SPARQL SELECT構文に定義した投影変数からマップされた)列名を選択して右矢印(>)ボタンをクリックし、選択した列を「リポジトリ・ビュー」に移動します。

5. 「終了」をクリックします。

6. (SPARQL GatewayまたはRDFデータに固有ではない)通常のBIビジネス・モデルの作業およびマッピングと表現定義の作業について、残りの手順を実行します。

8 Sesame Adapter for Oracle Database

Sesame Adapter for Oracle Database (以降、Sesame Adapter)は、一般的なSesame Java APIをOracleセマンティク・テクノロジ・サポートに統合します。OpenRDF (http://www.openrdf.org/)によって作成されたSesameは、RDFデータの格納、推論および問合せのためのオープン・ソース・フレームワークです。

この章では、第1章「Oracle Databaseセマンティク・テクノロジの概要」および第2章「OWLの概念」で説明されている主要な概念について十分に理解していることが前提です。Sesame Javaフレームワークの全体的な機能および使用についても十分に理解していることを前提とします。Sesameフレームワークの詳細は、http://www.openrdf.org/documentation.jspのSesameドキュメントのページを参照してください。

Sesame Adapterは、Oracle Databaseリリース11.2のRDFおよびOWLのセマンティク・データ管理機能を拡張します。

この章には次の主要なトピックがあります。

- 8.1項「Sesame Adapterの概要」

- 8.2項「Sesame Adapterの設定と構成」

- 8.3項「SEM_MATCHとSesame Adapter問合せの比較」

- 8.4項「SPARQL問合せ処理の最適化」

- 8.5項「最適なパフォーマンスのための推奨事項」

- 8.6項「他の機能をサポートするためのSPARQL構文への追加」

- 8.7項「サーバー側APIのサポート」

- 8.8項「Sesame APIに対するOracle固有の拡張機能」

- 8.9項「Sesame AdapterによるSesame Consoleの使用」

- 8.10項「Sesame Adapterを使用した問合せ例」

8.1 Sesame Adapterの概要

Jena Adapter (第7章を参照)と同様、Sesame Adapterは、オープン・ソース・フレームワークおよび関連ツールを使用した、Oracleセマンティク・データへのJavaベースのインタフェースを提供します。ただし、Sesame Adapterでは、データにコンテキストのサポートが追加されています。

- Jena文では、トリプル(主語、述語、目的語)を処理します。

- Sesame文では、トリプルとコンテキストを処理します(Sesame文は、トリプルとコンテキストで構成されるクワッドです)。たとえば、病院の患者データの場合、コンテキストには患者のURIが含まれます。

Sesame Adapterは、Oracle Databaseに保存されたセマンティク・データと対話するためにJava APIを提供します。また、次のSesameツールとの統合も提供します。

- Sesame Server (HTTP SPARQLエンドポイントを提供します)。

- Sesame Console (リポジトリの作成と管理を行うためのコマンドライン・ツールです)。使用可能なコマンドには次のものがあります。

connect  Connects to a (local or remote) set of repositories
disconnect  Disconnects from the current set of repositories
create  Creates a new repository
drop  Drops a repository
open  Opens a repository to work on, takes a repository ID as argument
close  Closes the current repository
show  Displays an overview of various resources
load  Loads a data file into a repository, takes a file path or URL as argument
verify  Verifies the syntax of an RDF data file, takes a file path or URL as argument
clear  Removes data from a repository
serql  Evaluates the SeRQL query, takes a query as argument
sparql  Evaluates the SPARQL query, takes a query as argument
set  Allows various console parameters to be set
exit, quit  Exits the console

- OpenRDF Workbench (Sesame Serverへのグラフィカル・ユーザー・インタフェースです)。

Sesame Adapterによって提供される機能を次に示します。

- (コンテキスト付きおよびコンテキストなしの)文のロード(バルクおよび増分)、エクスポートおよび削除

- (コンテキスト付きおよびコンテキストなしの)データの問合せ

- 推論(推論データは(includeInferred=trueの場合)問合せ実行中に考慮され、推論トリプルのコンテキストはNULLです)

- 名前空間の管理

Sesame Adapter for Oracle Databaseは、Sesame Storage and Inference Layer (SAIL) APIの様々なインタフェースを実装しています。たとえば、クラスOracleSailConnectionは、Sesame SailConnectionインタフェースのOracle実装で、クラスOracleSailStoreは、Sesame SailインタフェースのOracle実装です。

Sesame Adapterの一般的な使用フローを、例8-1に抜粋して示します。

例8-1 Sesame Adapterの使用フローの例

String query =
" PREFIX foaf: <http://xmlns.com/foaf/0.1/> "
" PREFIX dc: <http://purl.org/dc/elements/1.1/> "
" select ?s ?p ?o ?name WHERE {?s ?p ?o . OPTIONAL {?o foaf:name ?name .} } ";

SailRepository sr = new SailRepository(
new OracleSailStore(oracle, modelName,…attachmentForInference));
RepositoryConnection repConn = sr.getConnection();
// Data loading can happen here.
repConn.add(alice, friendOf, bob, context1);

TupleQuery tq = repConn.prepareTupleQuery(QueryLanguage.SPARQL, query);
TupleQueryResult tqr = tq.evaluate();
while(tqr.hasNext()) {
psOut.print((tqr.next().toString()));
};
tqr.close()
repConn.close();
sr.shutDown();

8.2 Sesame Adapterの設定と構成

Sesame Adapter for Oracle Databaseの設定と構成には、次のアクションが含まれます。

1. ソフトウェア環境の設定

2. SPARQLサービスの設定

3. セマンティク・テクノロジ環境の設定

8.2.1 ソフトウェア環境の設定

Sesame Adapterを使用するには、システム環境に必要なソフトウェア(Oracle Database 11gリリース2 (SpatialオプションおよびPartitioningオプションを含み、セマンティク・テクノロジ・サポートが有効になっている)、Sesameバージョン2.3.1、Sesame AdapterおよびJDK 6)があることを最初に確認する必要があります。次のアクションを実行することによって、ソフトウェア環境を設定できます。

1. Oracle Databaseリリース11.2 Enterprise Editionと、Oracle SpatialオプションおよびOracle Partitioningオプションをインストールします。

2. A.1項の説明のとおり、セマンティク・テクノロジのサポートを有効にします。

3. Sesame 2.2のユーザー・ガイドのSesameライブラリを使用するための設定に関する説明のとおり、Sesame 2.3.1 onejarライブラリをダウンロードし、クラスパスに含めます。(http://openrdf.callimachus.net/sesame/2.7/docs/users.docbook?view、または使用可能な場合はより新しいバージョンを参照してください。)

4. Sesame 2.2のユーザー・ガイドのサーバー・ソフトウェアのインストールに関する説明のとおり、Sesame 2.3.1 Serverをインストールします。(http://openrdf.callimachus.net/sesame/2.7/docs/users.docbook?view、または使用可能な場合はより新しいバージョンを参照してください。)

5. Oracle Databaseセマンティク・テクノロジのページ(http://www.oracle.com/technetwork/database/options/semantic-tech/で「Downloads」をクリック)からSesame Adapter (sesame_adapter_for_release11.2.zip)をダウンロードして、(Linuxシステムの)/tmp/sesame_adapterなどの一時ディレクトリに解凍します。(この一時ディレクトリがまだ存在していない場合は、解凍操作の前に作成します。)
Sesame Adapterのディレクトリとファイルの構造は、次のとおりです。

examples/
examples/Example1.java
examples/Example2.java
.
.
.
lib/
lib/sdordfsesame.jar
web/
web/web.xml
javadoc/
javadoc/javadoc.zip

6. ojdbc6.jarを<Sesame_DIR>/lib (Linux)または<Sesame_DIR>\lib (Windows)にコピーします。(ojdbc6.jarは、$ORACLE_HOME/jdbc/libまたは%ORACLE_HOME%\jdbc\libにあります。)

7. sdordf.jarを<Sesame_DIR>/lib (Linux)または<Sesame_DIR>\lib (Windows)にコピーします。(sdordf.jarは、$ORACLE_HOME/md/jlibまたは%ORACLE_HOME%\md\jlibにあります。)

8. JDK 6がまだインストールされていない場合は、インストールします。

9. JAVA_HOME環境変数にJDK 6インストールが指定されていない場合は、適切に定義します。次に例を示します。

setenv JAVA_HOME /usr/local/packages/jdk16/

10. SPARQLプロトコルをサポートするためのSPARQLサービスが設定されていない場合は、8.2.2項の説明のとおりに設定します。

ソフトウェア環境を設定した後、8.2.3項の説明にあるとおり、セマンティク・テクノロジ環境でSesame Adapterを使用して問合せを実行できることを確認します。

8.2.2 SPARQLサービスの設定

Sesame Adapterを使用してSPARQLエンドポイントを設定するには、クライアント・アプリケーションがHTTPプロトコル経由で通信できるSesame Serverのダウンロードが必要です。Sesame Server (およびOpenRDF Workbench)は、Sesame 2.3.1リリース・パッケージにバンドルされています。この項では、WebLogic Serverにデプロイされるサーブレットを使用して、SPARQLサービスを設定する方法について説明します。Oracleではすべての依存するサードパーティ・ライブラリを.warまたは.earファイルにバンドルすることが許可されていないため、手順が多く複雑になっています。

1. Oracle WebLogic Server 11gリリース1 (10.3.1)をダウンロードしてインストールします。詳細は、http://www.oracle.com/technology/products/weblogic/を参照してください。

2. Sesameで必要なため、Java 6がインストールされていることを確認します。

3. http://sourceforge.net/projects/sesame/files/Sesame%202/からSesame 2.3.1リリース・パッケージ(.zip形式)をダウンロードします。

4. 一時ディレクトリに.zipファイルを解凍します。次に例を示します。

mkdir /tmp/sesame
cp openrdf-sesame-2.3.1-sdk.zip /tmp/sesame/
cd /tmp/sesame
unzip openrdf-sesame-2.3.1-sdk.zip

5. 8.2.1項の説明にあるとおり、Sesame Adapter for Oracle Databaseがダウンロードされ解凍されていることを確認します。

6. Sesame_adapterディレクトリと同じレベルにopenrdf-sesame.warという名前のディレクトリを作成し、そのディレクトリに移動します。次に例を示します。

/tmp/openrdf-sesame.war
cd /tmp/openrdf-sesame.war

7. 前述の手順で作成したディレクトリに必要なファイルを解凍します。

cd /tmp/openrdf-sesame.war
unzip /tmp/sesame/openrdf-sesame-2.3.1/war/openrdf-sesame.war

8. 次のように、必要なファイルをコピーします。(ORACLE_HOMEは、Oracle Databaseリリース11.2のホーム・ディレクトリを指しているとします。)

cp /tmp/Sesame_adapter/web/web.xml /tmp/openrdf-sesame.war/WEB-INF/web.xml
cp /tmp/Sesame_adapter/lib/*.jar   /tmp/openrdf-sesame.war/WEB-INF/lib
cp $ORACLE_HOME/md/jlib/sdordf.jar /tmp/openrdf-sesame.war/WEB-INF/lib
cp $ORACLE_HOME/jdbc/lib/ojdbc6.jar /tmp/openrdf-sesame.war/WEB-INF/lib

9. WebLogic Server管理コンソールを使用し、OracleSemDSという名前のJ2EEデータ・ソースを作成します。データ・ソースの作成中に、SPARQL問合せの実行対象になる関連セマンティク・データを含むデータベース・スキーマのユーザーとパスワードを指定できます。
このデータ・ソースの作成に関する情報は、8.2.2.1項「WebLogic Serverを使用した必要なデータ・ソースの作成」を参照してください。

10. 次のように、WebLogic Serverのautodeployディレクトリに移動し、ファイルをコピーします。(開発ドメインでの自動デプロイ・アプリケーションの詳細は、http://docs.oracle.com/cd/E11035_01/wls100/deployment/autodeploy.htmlを参照してください。)

cd <domain_name>/autodeploy
cp -rf  /tmp/openrdf-sesame.war  <domain_name>/autodeploy

前述の例で、<domain_name>はWebLogic Serverドメインの名前です。

WebLogic Serverドメインを2つの異なるモード(開発とプロダクション)で実行することはできますが、自動デプロイメント機能を使用できるのは開発モードのみであることに注意してください。

11. 次の例のとおり、ファイルとディレクトリの構造を確認します。

autodeploy/% ls -1R ./openrdf-sesame.war/

openrdf-sesame.war/:
favicon.ico
favicon.png
images
META-INF
styles
WEB-INF

openrdf-sesame.war/images:
DEBUG.png
ERROR.png
INFO.png
logo.png
productgroup.png
transparent.png
WARN.png

openrdf-sesame.war/META-INF:
MANIFEST.MF
maven

openrdf-sesame.war/META-INF/maven:
info.aduna.appbase
org.openrdf.sesame

openrdf-sesame.war/META-INF/maven/info.aduna.appbase:
aduna-appbase-webapp-system

openrdf-sesame.war/META-INF/maven/info.aduna.appbase/aduna-appbase-webapp-system:
pom.properties
pom.xml

openrdf-sesame.war/META-INF/maven/org.openrdf.sesame:
sesame-http-server

openrdf-sesame.war/META-INF/maven/org.openrdf.sesame/sesame-http-server:
pom.properties
pom.xml

openrdf-sesame.war/styles:
basic
default
msie-png-alpha.css
msie-png-alpha.png
w3-html40-recommended.css

openrdf-sesame.war/styles/basic:
all.css

openrdf-sesame.war/styles/default:
images
msie-minheight.css
print.css
screen.css

openrdf-sesame.war/styles/default/images:
bg_body.png
bg_header.png
bg_html.png
hr_menu.png

openrdf-sesame.war/WEB-INF:
aduna-webapp-servlet.xml
aduna-webapp-system-servlet.xml
classes
includes
lib
openrdf-http-server-servlet.xml
sample-web.xml
taglibs
tags
urlrewrite.xml
views
web.xml

openrdf-sesame.war/WEB-INF/classes:
logback.xml

openrdf-sesame.war/WEB-INF/includes:
components
stylesheets.html.jspf
taglibs.jspf

openrdf-sesame.war/WEB-INF/includes/components:
bodyStart.html.jspf
bodyStop.html.jspf
ContentHeader.html.jspf
Footer.html.jspf
Header.html.jspf
head.html.jspf
htmlStart.html.jspf
htmlStop.html.jspf
logfilterform.html.jspf
logpaginationfooter.html.jspf
logpaginationheader.html.jspf
Message.html.jspf
Navigation.html.jspf
page.html.jspf
tabs.html.jspf

openrdf-sesame.war/WEB-INF/lib:
activation-1.1.jar
aduna-appbase-core-3.9.0.jar
aduna-appbase-logging-api-3.9.0.jar
aduna-appbase-logging-file-3.9.0.jar
aduna-appbase-webapp-base-core-3.9.0.jar
aduna-appbase-webapp-system-core-3.9.0.jar
aduna-commons-collections-2.7.0.jar
aduna-commons-concurrent-2.6.0.jar
aduna-commons-i18n-1.3.0.jar
aduna-commons-io-2.8.0.jar
aduna-commons-iteration-2.7.0.jar
aduna-commons-lang-2.8.0.jar
aduna-commons-net-2.6.0.jar
aduna-commons-platform-info-2.8.0.jar
aduna-commons-text-2.6.0.jar
aduna-commons-webapp-core-2.8.0.jar
aduna-commons-xml-2.6.0.jar
aopalliance-1.0.jar
asm-1.5.3.jar
cglib-2.1_3.jar
commons-codec-1.3.jar
commons-dbcp-1.2.2.jar
commons-httpclient-3.1.jar
commons-pool-1.3.jar
jcl-over-slf4j-1.5.10.jar
jstl-1.1.2.jar
logback-classic-0.9.18.jar
logback-core-0.9.18.jar
ojdbc6.jar
sdordf.jar
sdordfsesame.jar
sesame-http-client-2.3.1.jar
sesame-http-protocol-2.3.1.jar
sesame-http-server-2.3.1.jar
sesame-http-server-spring-2.3.1.jar
sesame-model-2.3.1.jar
sesame-query-2.3.1.jar
sesame-queryalgebra-evaluation-2.3.1.jar
sesame-queryalgebra-model-2.3.1.jar
sesame-queryparser-api-2.3.1.jar
sesame-queryparser-serql-2.3.1.jar
sesame-queryparser-sparql-2.3.1.jar
sesame-queryresultio-api-2.3.1.jar
sesame-queryresultio-binary-2.3.1.jar
sesame-queryresultio-sparqljson-2.3.1.jar
sesame-queryresultio-sparqlxml-2.3.1.jar
sesame-queryresultio-text-2.3.1.jar
sesame-repository-api-2.3.1.jar
sesame-repository-contextaware-2.3.1.jar
sesame-repository-dataset-2.3.1.jar
sesame-repository-event-2.3.1.jar
sesame-repository-http-2.3.1.jar
sesame-repository-manager-2.3.1.jar
sesame-repository-sail-2.3.1.jar
sesame-rio-api-2.3.1.jar
sesame-rio-n3-2.3.1.jar
sesame-rio-ntriples-2.3.1.jar
sesame-rio-rdfxml-2.3.1.jar
sesame-rio-trig-2.3.1.jar
sesame-rio-trix-2.3.1.jar
sesame-rio-turtle-2.3.1.jar
sesame-runtime-2.3.1.jar
sesame-sail-api-2.3.1.jar
sesame-sail-inferencer-2.3.1.jar
sesame-sail-memory-2.3.1.jar
sesame-sail-nativerdf-2.3.1.jar
sesame-sail-rdbms-2.3.1.jar
slf4j-api-1.5.10.jar
spring-aop-2.5.6.jar
spring-beans-2.5.6.jar
spring-context-2.5.6.jar
spring-context-support-2.5.6.jar
spring-core-2.5.6.jar
spring-web-2.5.6.jar
spring-webmvc-2.5.6.jar
standard-1.1.2.jar
urlrewritefilter-3.0.4.jar

openrdf-sesame.war/WEB-INF/taglibs:
navigation.tld

openrdf-sesame.war/WEB-INF/tags:
errors.tag

openrdf-sesame.war/WEB-INF/views:
home
overview.jsp
system

openrdf-sesame.war/WEB-INF/views/home:
overview.jsp

openrdf-sesame.war/WEB-INF/views/system:
info
logging
overview.jsp

openrdf-sesame.war/WEB-INF/views/system/info:
debug.jsp
overview.jsp

openrdf-sesame.war/WEB-INF/views/system/logging:
overview.jsp

12. WebLogic Serverを起動または再起動します。

13. Webブラウザを使用して、書式http://<hostname>:7001/openrdf-sesame/querymgt?abortqid=0のURL (Webアプリケーションはポート7001でデプロイされているとします)に接続し、デプロイメントを確認します。
XMLレスポンスに、Sesame Adapter問合せ管理サーブレットによるSesame Serverのデプロイメントが成功したことが示されます。

また、OpenRDF Workbenchをインストールすることもできます(これは、Sesame Serverと通信するためのグラフィカル・ユーザー・インタフェース(GUI)です)。OpenRDF WorkbenchをOracle WebLogic Serverにデプロイするには、SPARQLエンドポイントを設定するための前述の手順(この項の冒頭で説明済)のうち少なくとも最初の7つの手順をあらかじめ実行しておく必要があります(その後で、次の手順を行います)。

1. 次のように、WebLogic Serverのautodeployディレクトリに移動し、ファイルをコピーします。(開発ドメインでの自動デプロイ・アプリケーションの詳細は、http://docs.oracle.com/cd/E11035_01/wls100/deployment/autodeploy.htmlを参照してください。)

cd <domain_name>/autodeploy
cp -rf  /tmp/openrdf-workbench.war  <domain_name>/autodeploy

前述の例で、<domain_name>はWebLogic Serverドメインの名前です。

2. 次の例のとおり、ファイルとディレクトリの構造を確認します。

autodeploy/% ls -1R ./openrdf-workbench.war/
openrdf-workbench.war/:

favicon.ico
favicon.png
images
locale
META-INF
scripts
styles
transformations
WEB-INF

openrdf-workbench.war/images:
affirmative.png
edit.png
logo.png
negative.png
productgroup.png
server_network.png
server.png
view.png

openrdf-workbench.war/locale:
messages.xsl

openrdf-workbench.war/META-INF:
MANIFEST.MF
maven

openrdf-workbench.war/META-INF/maven:
org.openrdf.sesame

openrdf-workbench.war/META-INF/maven/org.openrdf.sesame:
sesame-http-workbench

openrdf-workbench.war/META-INF/maven/org.openrdf.sesame/sesame-http-workbench:
pom.properties
pom.xml

openrdf-workbench.war/scripts:
cookies.html

openrdf-workbench.war/styles:
basic
default
msie-png-alpha.css
msie-png-alpha.png
w3-html40-recommended.css

openrdf-workbench.war/styles/basic:
all.css

openrdf-workbench.war/styles/default:
images
msie-minheight.css
print.css
screen.css

openrdf-workbench.war/styles/default/images:
bg_body.png
bg_header.png
bg_html.png
hr_menu.png

openrdf-workbench.war/transformations:
add.xsl
boolean.xsl
clear.xsl
contexts.xsl
create-memory-rdfs-dt.xsl
create-memory-rdfs.xsl
create-memory.xsl
create-mysql.xsl
create-native-rdfs-dt.xsl
create-native-rdfs.xsl
create-native.xsl
create-pgsql.xsl
create-remote.xsl
create.xsl
delete.xsl
explore.xsl
export.xsl
graph.xsl
information.xsl
list.xsl
namespaces.xsl
query.xsl
remove.xsl
repositories.xsl
server.xsl
summary.xsl
table.xsl
template.xsl
tuple.xsl
types.xsl
url-encode.xsl

openrdf-workbench.war/WEB-INF:
classes
lib
web.xml

openrdf-workbench.war/WEB-INF/classes:
org

openrdf-workbench.war/WEB-INF/classes/org:
openrdf

openrdf-workbench.war/WEB-INF/classes/org/openrdf:
workbench

openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench:
base
commands
exceptions
proxy
RepositoryServlet.class
util

openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench/base:
BaseRepositoryServlet.class
BaseServlet.class
TransformationServlet.class
TupleServlet.class

openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench/commands:
AddServlet.class
ClearServlet.class
ContextsServlet.class
CreateServlet.class
DeleteServlet.class
ExploreServlet.class
ExportServlet.class
InformationServlet.class
InfoServlet.class
NamespacesServlet.class
QueryServlet.class
RemoveServlet.class
RepositoriesServlet.class
SummaryServlet.class
TypesServlet.class

openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench/exceptions:
BadRequestException.class
MissingInitParameterException.class

openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench/proxy:
CookieCacheControlFilter$CacheAwareRequest.class
CookieCacheControlFilter$CacheAwareResponse.class
CookieCacheControlFilter.class
ProxyRepositoryServlet.class
RedirectFilter.class
WorkbenchGateway.class
WorkbenchServlet.class

openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench/util:
BasicServletConfig.class
ConfigTemplate.class
DynamicHttpRequest.class
TupleResultBuilder.class
WorkbenchRequest.class

openrdf-workbench.war/WEB-INF/lib:
aduna-appbase-core-3.9.0.jar
aduna-appbase-logging-api-3.9.0.jar
aduna-appbase-logging-file-3.9.0.jar
aduna-commons-collections-2.7.0.jar
aduna-commons-concurrent-2.6.0.jar
aduna-commons-i18n-1.3.0.jar
aduna-commons-io-2.8.0.jar
aduna-commons-iteration-2.7.0.jar
aduna-commons-lang-2.8.0.jar
aduna-commons-net-2.6.0.jar
aduna-commons-platform-info-2.8.0.jar
aduna-commons-text-2.6.0.jar
aduna-commons-xml-2.6.0.jar
commons-cli-1.1.jar
commons-codec-1.3.jar
commons-dbcp-1.2.2.jar
commons-fileupload-1.2.1.jar
commons-httpclient-3.1.jar
commons-io-1.3.2.jar
commons-pool-1.3.jar
jcl-over-slf4j-1.5.10.jar
sesame-console-2.3.1.jar
sesame-http-client-2.3.1.jar
sesame-http-protocol-2.3.1.jar
sesame-model-2.3.1.jar
sesame-query-2.3.1.jar
sesame-queryalgebra-evaluation-2.3.1.jar
sesame-queryalgebra-model-2.3.1.jar
sesame-queryparser-api-2.3.1.jar
sesame-queryparser-serql-2.3.1.jar
sesame-queryparser-sparql-2.3.1.jar
sesame-queryresultio-api-2.3.1.jar
sesame-queryresultio-binary-2.3.1.jar
sesame-queryresultio-sparqljson-2.3.1.jar
sesame-queryresultio-sparqlxml-2.3.1.jar
sesame-queryresultio-text-2.3.1.jar
sesame-repository-api-2.3.1.jar
sesame-repository-contextaware-2.3.1.jar
sesame-repository-dataset-2.3.1.jar
sesame-repository-event-2.3.1.jar
sesame-repository-http-2.3.1.jar
sesame-repository-manager-2.3.1.jar
sesame-repository-sail-2.3.1.jar
sesame-rio-api-2.3.1.jar
sesame-rio-n3-2.3.1.jar
sesame-rio-ntriples-2.3.1.jar
sesame-rio-rdfxml-2.3.1.jar
sesame-rio-trig-2.3.1.jar
sesame-rio-trix-2.3.1.jar
sesame-rio-turtle-2.3.1.jar
sesame-runtime-2.3.1.jar
sesame-sail-api-2.3.1.jar
sesame-sail-inferencer-2.3.1.jar
sesame-sail-memory-2.3.1.jar
sesame-sail-nativerdf-2.3.1.jar
sesame-sail-rdbms-2.3.1.jar
slf4j-api-1.5.10.jar
slf4j-jdk14-1.5.10.jar

3. WebLogic Serverを起動または再起動します。

4. Webブラウザを使用して、書式http://<hostname>:7001/openrdf-workbenchのURL (Webアプリケーションはポート7001でデプロイされているとします)に接続し、デプロイメントを確認します。
OpenRDF WorkbenchロゴのあるWebページが表示されます。左側にある「Repositories」リンクをクリックすると、リポジトリのリストが表示されます。

8.2.2.1 WebLogic Serverを使用した必要なデータ・ソースの作成

WebLogic Server管理コンソールを使用して必要なJ2EEデータ・ソースを作成するには、次の手順に従います。

1. http://<hostname>:7001/consoleにログインします。

2. 「ドメイン構造」パネルで、「サービス」をクリックします。

3. 「JDBC」をクリックします。

4. 「データ・ソース」をクリックします。

5. 「JDBCデータ・ソースのサマリー」パネルで、「データ・ソース」表の下の「新規」をクリックします。

6. 「新しいJDBCデータ・ソースの作成」パネルで、次の値を入力または選択します。
名前: OracleSemDS

JNDI名: OracleSemDS

データベースのタイプ: Oracle

データベース・ドライバ: Oracle's Driver (Thin) Versions: 9.0.1,9.2.0,10,11

7. 「次」を2回クリックします。

8. 「接続プロパティ」パネルで、「データベース名」、「ホスト名」、「ポート」、「データベース・ユーザー名」(セマンティク・データを含むスキーマ)、「パスワード」のフィールドに適切な値を入力します。

9. 「次」をクリックします。

10. このOracleSemDSデータ・ソースをデプロイするターゲット・サーバー(1つまたは複数)を選択します。

11. 「終了」をクリックします。
すべての変更がアクティブ化されており、再起動は必要ないというメッセージが表示されます。

8.2.2.2 SPARQLサービスの構成

OracleSailStore APIおよびその他の関連APIを使用してセマンティク・モデルを作成し、データを(増分またはバルク)ロードして論理推論を実行できます。

セマンティク・モデルがOracle Databaseに格納された後、Sesame Console (8.9項を参照)を使用してSesame Serverに接続し、Oracleのセマンティク・モデルベースのリポジトリを作成できます。たとえば、LUBMという名前のセマンティク・モデルとOWLPRIMEルールベースを使用する、リポジトリIDがmyOracleReposのリポジトリを作成できます。

この新しく作成されたリポジトリは、Sesame Server上の新しいサービス・エンドポイントを提供します。

8.2.2.3 長時間にわたるSPARQL問合せの終了

一部のアプリケーションでは長時間にわたるSPARQL問合せを終了できるようにする必要があるため、Sesame AdapterとSesame Serverの設定で強制終了のフレームワークが導入されています。基本的に、実行に時間がかかる可能性がある問合せに対しては、それぞれに一意の問合せID (qid)値を指定する必要があります。

たとえば、次のSPARQL問合せでは、すべてのトリプルの主語を選択します。リクエストに応じてこの問合せを終了できるように、問合せID (qid)が設定されます。

PREFIX ORACLE_SEM_FS_NS:  <http://example.com/semtech#qid=8761>
SELECT ?subject WHERE {?subject ?property ?object }

qid属性値は、長整数型です。qidの値は、独自のアプリケーション・ニーズに基づき、特定の問合せにあわせて選択できます。

qid値とともに送信されたSPARQL問合せを終了するには、アプリケーションから次の形式で強制終了リクエストをサーブレットに送信し、一致するQID値を指定します。

http://<hostname>:7001/openrdf-sesame/querymgt?abortqid=8761

8.2.3 セマンティク・テクノロジ環境の設定

Sesame Adapterを使用して問合せを実行するには、(適切な権限を持つ)任意のユーザーで接続し、セマンティク・ネットワークで任意のモデルを使用します。セマンティク・テクノロジ環境が要件をすでに満たしている場合は、Sesame Adapterを使用するJavaコードを直接コンパイルして実行できます。Sesame Adapterを使用できるようにセマンティク・テクノロジ環境を設定していない場合は、次の例のような手順を実行します。

1. SYSDBAロールを持つSYSとして接続します。

sqlplus sys/<password-for-sys> as sysdba

2. システム表の表領域を作成します。次に例を示します。

CREATE TABLESPACE rdf_users datafile 'rdf_users01.dbf'
size 128M reuse autoextend on next 64M
maxsize unlimited segment space management auto;

3. セマンティク・ネットワークを作成します。次に例を示します。

EXECUTE sem_apis.create_sem_network('RDF_USERS');

4. (セマンティク・ネットワークとSesame Adapterを使用するデータベースに接続するための)データベース・ユーザーを作成します。次に例を示します。

CREATE USER rdfusr IDENTIFIED BY <password-for-udfusr>
DEFAULT TABLESPACE rdf_users;

5. このデータベース・ユーザーに必要な権限を付与します。次に例を示します。

GRANT connect, resource TO rdfusr;

6. 自身のセマンティク・データとともにSesame Adapterを使用するには、1.10項「セマンティク・データを使用するためのクイック・スタート」の説明のとおり、適切な手順を実行してデータを格納し、モデルを作成して、データベース索引を作成します。その後、Javaコードをコンパイルして実行することで問合せを実行します(問合せの例については、8.10項を参照してください)。
Sesame Adapterと提供されたサンプル・データを使用する場合は、8.10項を参照してください。

8.3 SEM_MATCHとSesame Adapter問合せの比較

Oracle Databaseに格納されているセマンティク・データを問い合せるには、SEM_MATCHベースのSQL文と、Sesame Adapterを介したSPARQL問合せの2つの方法があります。それぞれの方法での問合せは、表面的には類似していますが、動作には重要な違いがあります。アプリケーションの動作を一貫性のあるものにするには、SEM_MATCH問合せとSPARQL問合せの違いを理解し、その問合せ結果を処理する際に注意を払う必要があります。

2つの方法を次の簡単な例で示します。

問合せ1 (SEM_MATCHベース)

select s, p, o
from table(sem_match('{?s ?p ?o}', sem_models('Test_Model'), ....))

問合せ2 (Sesame Adapterを介したSPARQL問合せ)

select ?s ?p ?o
where {?s ?p ?o}

これらの2つの問合せは、同じ種類の機能を実行しますが、いくつか重要な違いがあります。問合せ1 (SEM_MATCHベース)は次のようになります。

- Test_Modelからすべてのトリプルを読み取ります。

- URI、bNode、プレーン・リテラルおよび型付きリテラルを区別せず、長いリテラルを処理しません。

- 特定の文字('\n'など)はエスケープ解除しません。

問合せ2 (Sesame Adapterを介して実行されるSPARQL問合せ)もTest_Modelからすべてのトリプルを読み取ります(同じ基礎となるTest_Modelを参照しているModelOracleSemに対してコールを実行したと想定します)。ただし、問合せ2は次のようになります。

- (SEM_MATCHテーブル・ファンクションにおけるs、pおよびo列のみではなく)追加の列を読み取り、URI、bNodes、プレーン・リテラル、型付きリテラルおよび長いリテラルを区別します。これによって、Sesame Nodeオブジェクトを適切に作成できるようになります。

- Oracle Databaseに格納される際にエスケープされる文字をエスケープ解除します。

2つの方法でのもう1つの違いは、空白ノード処理です。

- SEM_MATCHベースの問合せにおいて、空白ノードは常に定数とみなされます。

- SPARQL問合せにおいて、<と>で囲まれていない空白ノードは、問合せがSesame Adapterを介して実行されるときに変数とみなされます。これは、SPARQL標準セマンティクと一致します。ただし、<と>で囲まれた空白ノードは、問合せが実行されるときに定数とみなされ、空白ノード・ラベルには、基礎となるデータのモデル化で必要とされる適切な接頭辞が、Sesame Adapterによって追加されます。

Sesame Adapter APIを使用して作成されるセマンティク・モデルの名前の最大長は、22文字です。

8.4 SPARQL問合せ処理の最適化

この項では、SPARQL問合せ処理を強化できる、Sesame Adapterのいくつかのパフォーマンス関連機能について説明します。これらの機能は、デフォルトでは自動的に実行されます。

8.4.1 単一のSEM_MATCHコールへのSPARQL問合せのコンパイル

DISTINCT、OPTIONAL、GRAPH、FILTER、UNION、ORDER BYおよびLIMITを含むSPARQL問合せは、SEM_MATCHテーブル・ファンクションに基づく単一のSQL問合せに変換されます。SPARQLのASK、DESCRIBEおよびCONSTRUCT問合せの場合、Sesame Adapterでは、追加の問合せ変換ロジックと中間層処理が使用されます。

SEM_MATCHに基づくSQL問合せの実行が失敗した場合、Sesame AdapterではSesameの評価戦略を使用してその問合せを実行します。

8.5 最適なパフォーマンスのための推奨事項

Sesame Adapterを使用した問合せのパフォーマンスを改善するための推奨事項は次のとおりです。

- アプリケーション表での追加の結合の数を減らすため、SPARQL問合せのGRAPH句には、関連するトリプル・パターンのみを記述します。(詳細は、8.5.1項を参照してください。)

- 名前付きグラフ問合せのGRAPH句内のトリプル・パターンに、NULLバインディングによる変数は使用しません。NULLバインディングは関連するアプリケーション表との結合でいずれの行も一致しないため、このバインディングは削除されます。

- 前述の理由により、GRAPH句内にOPTIONAL句、またはOPTIONAL句内にGRAPH句は記述しません。

- アプリケーション表のCONTEXT列(8.5.1項を参照)には、空白ノードを使用しません(これは、2つの異なるセマンティク・モデルの名前付きグラフの空白ノードが同じラベルを持つ場合、これらが同じリソースとみなされてしまうためです)。これは、トリプル内の空白ノードには該当しません(異なるモデルのものは別々に格納されます)。

8.5.1 文の格納とSesame Adapter問合せに対する影響

MDSYS.SEMM_model-nameビュー(1.3.1項の表1-2を参照)には、グラフ名または各モデルのコンテキストの列がないため、これらの2つの情報はそのOracleセマンティク・モデル内に格納されません。この情報は、ユーザーのアプリケーション表のCONTEXT列に保持されます。

セマンティク・ネットワーク内に存在しないモデル名を使用したOracleSailStoreオブジェクトが初めて作成されると、新しいアプリケーション表が自動的に作成され、次の列が含まれます。

- TRIPLE(タイプSDO_RDF_TRIPLE_S)

- CONTEXT(タイプVARCHAR2)

その後、指定されたモデル名を持つセマンティク・モデルが作成されます。名前付きグラフ問合せと文指向操作のパフォーマンスを強化するため、デフォルトの索引がアプリケーション表に作成され、この索引が、TRIPLE列のトリプルの主語、述語および目的語のフィールドの3つの数値ID属性と同様にCONTEXT列(先行列)も処理します。

SPARQL問合せがセマンティク・モデルに対して実行されたとき、問合せが名前付きグラフを使用しない(GRAPH句を含まない)場合、生成されたSQL文はそのモデルのアプリケーション表を使用しません。ただし、その問合せにGRAPH句がある場合、生成されたSQL文は、SEM_MATCHベースの副問合せとそのモデルのアプリケーション表を結合し、関連するコンテキストまたは名前付きグラフまで結果を調べます。アプリケーション表との結合の数は、GRAPH句にあるトリプル・パターンの数によって異なるため、アプリケーション表との追加の結合の数を減らすには、関連するトリプル・パターンのみをGRAPH句に記述することをお薦めします。

8.6 他の機能をサポートするためのSPARQL構文への追加

Sesame Adapterにより、ヒントや追加の問合せオプションを渡すことができます。問合せオプションを含むOracle固有の名前空間を使用してSPARQL名前空間接頭辞の構文をオーバーロードすることで、これらの機能を実装できます。名前空間の形式はPREFIX ORACLE_SEM_xx_NSであり、xxの部分に機能のタイプ(ヒントならHT、APなら追加の述語など)が表されています。

8.6.1 SQLヒント

SQLヒントは、次の形式の行を含むSEM_MATCH問合せに渡すことができます。

PREFIX ORACLE_SEM_HT_NS: <http://oracle.com/semtech#hint>

ここでのhintは、SEM_MATCHによってサポートされる任意のヒントです。次に例を示します。

PREFIX ORACLE_SEM_HT_NS: <http://oracle.com/semtech#leading(t0,t1)>
SELECT ?book ?title ?isbn
WHERE { ?book <http://title> ?title. ?book <http://ISBN> ?isbn }

この例で、t0,t1は、問合せの1番目と2番目のパターンを指します。

SEM_MATCHと比較すると、ヒントの指定に若干違いがあることに注意してください。名前空間の値の構文の制限により、t0とt1 (または他のヒント・コンポーネント)を区切るには、空白ではなく、カンマ(,)を使用する必要があります。

SQLヒントの使用の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」、特にoptions属性でのHINT0キーワードに関する資料を参照してください。

8.6.2 追加のWHERE句述語

SEM_MATCH filter属性は、WHEREキーワードのないWHERE句の形式の文字列として、追加の選択基準を指定できます。追加のWHERE句述語は、次の形式の行を含むSEM_MATCH問合せに渡すことができます。

PREFIX ORACLE_SEM_AP_NS: <http://oracle.com/semtech#pred>

predは、問合せに追加されるWHERE句の内容を反映します。次に例を示します。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ORACLE_SEM_AP_NS:<http://www.oracle.com/semtech#label$RDFLANG='fr'>
SELECT DISTINCT ?inst ?label
WHERE { ?inst a <http://someCLass>. ?inst rdfs:label ?label . }
ORDER BY (?label) LIMIT 20

この例では、ラベル変数の言語タイプが'fr'である必要がある問合せに、制限事項が追加されます。

8.6.3 追加の問合せオプション

追加の問合せオプションは、次の形式の行を含むSEM_MATCH問合せに渡すことができます。

PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#option>

optionは、問合せに追加される問合せオプション(またはカンマで区切られた複数の問合せオプション)を反映します。次に例を示します。

PREFIX ORACLE_SEM_FS_NS:
<http://oracle.com/semtech#timeout=3,dop=4,INF_ONLY,ORDERED,ALLOW_DUP=T>
SELECT * WHERE {?subject ?property ?object }

次の問合せオプションがサポートされています。

- ALLOW_DUP=tは、結果が重複する場合がありますが、複数のセマンティク・モデルを問い合せるための、より高速な方法を選択します。

- DOP=nは、問合せに対する並列度(n)を指定します。マルチコアまたはマルチCPUのプロセッサでは、異なるDOP値(4または8など)を試すと、パフォーマンスが向上する場合があります。

- INF_ONLYを指定すると、推論されたモデルのみが問い合せられます。(このオプションでは、問合せに対してincludeInferred=trueオプションも指定する必要があります。)

- ORDEREDは、最後に必要なRDF_VALUE$結合を実行している間、問合せトリプル・パターン結合のために主要なSQLヒントに変換されます。

- QID=nは、問合せID番号を指定します(この機能は、問合せに応答がない場合、その問合せを取り消すために使用できます)。

- REWRITE=Fは、SEM_MATCHテーブル・ファンクションに対してODCI_Table_Rewriteを無効にします。

- SKIP_CLOB=Tは、問合せに対してCLOB値が戻されないようにします。

- TIMEOUT=n (問合せタイムアウト)は、問合せが終了されるまでに実行される秒数(n)を指定します。

- USE_BIND_VAR(n)は、トリプル・パターンでn番目の定数の問合せ解析時に使用されるバインド変数を指定します。(この機能をOPTIONAL句内の定数に適用しないでください。)

8.7 サーバー側APIのサポート

この項では、Sesame Adapterによって使用可能になるOracle Databaseのセマンティク・テクノロジ機能の一部について説明します。使用可能な機能をサポートするAPIコールの包括的なドキュメントについては、Sesame Adapterのリファレンス情報(Javadoc)を参照してください。Sesame Adapterによって使用可能になるサーバー側機能の詳細は、このマニュアルの関連する章を参照してください。

8.7.1 仮想モデルのサポート

仮想モデル(1.3.8項を参照)は、OracleSailStoreコンストラクタで指定され、透過的に処理されます。仮想モデルがモデルとルールベースの組合せのために存在している場合には、問合せの応答に使用されます(そのような仮想モデルが存在しない場合には、データベースに作成されます)。

注意:
Sesame Adapterを介した仮想モデルのサポートは、Oracle Databaseリリース11.2以上でのみ使用可能です。

次の例では、既存の仮想モデルを再利用します。

public void vm(String jdbcUrl,
String user,
String password,
String model,
PrintStream psOut)
{
String m1 = "TEST_1";
String m2 = "TEST_2";
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));

// create the attachment semantic model in case it doesn't exist
// (constructor handles it)
OracleSailStore store = new OracleSailStore(op, m1);
store.shutDown();

store= new OracleSailStore(op, m2);
store.shutDown();

String vmName = "VM_" + m1;

// create a virtual model with name vmName that will be used in the
// OracleSailStore
Oracle oracle = op.getOracle();
oracle.executeCall(
"begin sem_apis.create_virtual_model(?,sem_models(?,?), null); end;",
vmName, m1, m2);
op.returnOracle(oracle);

String[] modelNames = {m2};
String[] rulebaseNames = {};

Attachment attachment = Attachment.createInstance(modelNames,
rulebaseNames);

store = new OracleSailStore(op, m1, attachment, vmName);

OracleSailConnection conn = store.getConnection();
conn.clear();
conn.addStatement(
store.getValueFactory().createURI("http://a1"),
store.getValueFactory().createURI("http://p1"),
store.getValueFactory().createURI("http://b1"));

CloseableIteration res = conn.getStatements(null, null, null, false);
while (res.hasNext()) {
Statement stmt = (Statement) res.next();
System.out.println(stmt);
}
conn.close();
store.shutDown();
}

また、次の例のように、OracleSailStoreコンストラクタを使用して仮想モデルを作成することもできます。

OracleSailStore store = new OracleSailStore(oracle, modelName, attachment, true);

この例で、4番目のパラメータ(true)は、指定されたmodelNameとattachmentのために仮想モデルを作成する必要があることを示しています。

8.7.2 接続プーリングのサポート

Oracle Databaseの接続プーリングは、Sesame AdapterのOraclePoolクラスを介して提供されます。通常、OraclePoolは、OraclePool (DataSource ods)コンストラクタを使用してDataSourceで初期化されます。この場合、OraclePoolはデータ・ソースの接続プーリング機能を使用しながら、DataSourceの拡張ラッパーとして動作します。OracleSailStoreオブジェクトを作成するときには、storeコンストラクタ内にOraclePoolオブジェクトを指定するのみで十分です(Sesame Adapterによりデータベース接続が自動的に管理されるようになります)。

Oracle接続オブジェクト(基本的にデータベース接続ラッパーである)を明示的に取得する必要がある場合は、OraclePool.getOracleメソッドを起動します。接続を終了した後は、OraclePool.returnOracleメソッドを起動して、接続プールにオブジェクトを戻します。

OraclePoolは、OracleConnectionオブジェクトを使用して初期化することもできます。この場合、このOraclePoolを参照するときに単一のデータベース接続のみが使用されます(複数のSesame SailConnectionオブジェクトが同じデータベース接続を使用することになるため、異なるSailConnectionオブジェクト間でダーティな読取りが起こり得ることを認識しておく必要があります)。

OraclePoolの使用の詳細は、Sesame AdapterのAPIリファレンス情報(Javadoc)を参照してください。

次の例では、2つの初期接続によるOraclePoolクラスを使用してOracleSailStoreオブジェクトを設定します。

public void op(String jdbcUrl,
String user,
String password,
String model,
PrintStream psOut)
throws Exception
{
// test with connection properties
java.util.Properties prop = new java.util.Properties();
prop.setProperty("MinLimit", "2");     // the cache size is 2 at least
prop.setProperty("MaxLimit", "10");
prop.setProperty("InitialLimit", "2"); // create 2 connections at startup
prop.setProperty("InactivityTimeout", "1800");    //  seconds
prop.setProperty("AbandonedConnectionTimeout", "900");  //  seconds
prop.setProperty("MaxStatementsLimit", "10");
prop.setProperty("PropertyCheckInterval", "60"); // seconds

System.out.println("Creating Data Source");
OracleDataSource ods =
OraclePool.getOracleDataSource(jdbcUrl, user, password,
prop, "OracleSemConnPool");
System.out.println("Done creating Data Source");

OraclePool op = new OraclePool(ods);

// create an OracleSailStore with the OraclePool
OracleSailStore store = new OracleSailStore(op, model);
store.shutDown();
op.close();
ods.close();
}

8.7.3 セマンティク・モデルのPL/SQLインタフェース

Sesame Adapterを介して、複数のセマンティクPL/SQLサブプログラムを使用できます。表8-1に、サブプログラムと、対応するJavaクラスおよびメソッドを示します。

表8-1 PL/SQLサブプログラムと、対応するSesame AdapterのJavaクラスおよびメソッド

PL/SQLサブプログラム

対応するJavaクラスとメソッド

SEM_APIS.DROP_SEM_MODEL

OracleUtils.dropSemanticModel

SEM_APIS.MERGE_MODELS

OracleUtils.mergeModels

SEM_APIS.SWAP_NAMES

OracleUtils.swapNames

SEM_APIS.REMOVE_DUPLICATES

OracleUtils.removeDuplicates

SEM_APIS.RENAME_MODEL

OracleUtils.renameModels

これらのPL/SQLユーティリティ・サブプログラムの詳細は、第9章のリファレンス情報を参照してください。対応するJavaクラスおよびメソッドの詳細は、Sesame AdapterのAPIリファレンス・ドキュメント(Javadoc)を参照してください。

8.7.4 推論オプション

setInferenceOption(String options)プロシージャとOracleSailConnectionオブジェクトを使用して、伴意コールにオプションを追加できます。次の例では、伴意を作成するときに増分推論を有効化し、並列度の値を4に指定します。

conn.setInferenceOption("INC=T,DOP=4");

推論の詳細は、2.2項を参照してください。

8.8 Sesame APIに対するOracle固有の拡張機能

この項では、Sesame Adapter for Oracle DatabaseがSesame SailConnectionおよびSail APIに提供する拡張機能について説明します。

8.8.1 文の一意性

Sesame 2.3.0における文の一意性は、コンテキスト・レベルで強制されます(同じトリプルを単一のコンテキストで2回は使用できません)。Oracle Sesame Adapterでは、そのような一意性がコンテキスト、述語、主語および目的語での一意の索引を介して強制されます。ただし、Sesame Adapterにおける文の一意性は、デフォルトでは有効になっていません。OracleSailStoreオブジェクトを構築するとき、文の一意性のデフォルト値はDONTCAREで、一意の索引がまだ存在していない場合に作成されないことを意味します。

OracleSailStoreコンストラクタ、またはenableUniquenessConstraintメソッドおよびdisableUniquenessConstraintメソッドのいずれかを使用した文の一意性に対する要件は、明示的に有効化することも無効化することもできます。

8.8.2 索引とJena Adapterとの相互運用性

OracleSailStoreオブジェクトに対してDML操作(特に削除)と名前付きグラフ問合せを実行する際に、パフォーマンスを改善するには、アプリケーション表の索引が重要です。新しいOracleSailStoreオブジェクトの作成時に、デフォルトのCPSO索引が作成されます(C、P、S、Oは、コンテキスト、述語、主語および目的語の列を表します)。

Sesame AdapterとJena Adapterを使用して作成されるOracleセマンティク・モデルの間には、格納にいくつかの相違があります。たとえば、デフォルトのアプリケーション表の索引は、Jena Adapterでは異なります。Sesame AdapterからJena Adapterモデルのデータにアクセスするには(逆も同様)、OracleUtils.migrateFromJenaメソッドとOracleUtils.migrateToJenaメソッドを使用します。これらのメソッドは、基礎となる記憶域構造の変更中に、セマンティク・データを保持します。特に、Sesame AdapterからJena Adapterへの移行、またその逆への移行の際、すべてのトリプルがそのコンテキスト情報とともに保持されます。

例8-2は、Sesame AdapterとJena Adapterを使用して作成されるモデル間の移行を示しています。

例8-2 Jena AdapterモデルとSesame Adapterモデル間の移行

public void migrate(String jdbcUrl,
String user,
String password,
String model,
PrintStream psOut)
throws Exception
{
OraclePool oraclePool= new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));

OracleSailStore store = new OracleSailStore(oraclePool, model);

OracleSailConnection conn = store.getConnection();
conn.clear();

// create a statement and add it to the store
URI subject =
store.getValueFactory().createURI("http://example.org/foo");
URI object = store.getValueFactory().createURI("http://example.org/bar");
URI ngURI = store.getValueFactory().createURI("http://example.org/bar");

conn.addStatement(subject, RDF.TYPE, object, ngURI);
conn.commit();

// convert it to a jena model
OracleUtils.migrateToJena(oraclePool, model);

Oracle newOra = oraclePool.getOracle();
oracle.spatial.rdf.client.jena.Oracle ora =
new oracle.spatial.rdf.client.jena.Oracle(newOra.getConnection());

GraphOracleSem graph = new GraphOracleSem(ora, model);

// check size of jena graph
System.out.print("GraphOracleSem size:" + graph.getSize());

store.shutDown();

// now convert it back to an Oracle sailstore.
OracleUtils.migrateFromJena(oraclePool, model);
conn = store.getConnection();

// check overall store size
System.out.println("Size of store :" +conn.size());
// check context size, should be 1
System.out.println("Size of context " + ngURI + ":" + conn.size(ngURI));
store.shutDown();
ora.dispose();
oraclePool.returnOracle(newOra);
}

8.8.3 推論

OracleSailConnection.performInferenceメソッドを使用して推論を実行できます。このメソッドは、ストアを構築するときに添付ファイルで指定されていたモデルおよびルールベースを指定して、OracleSailStoreオブジェクトの伴意を作成します。

伴意の作成の詳細は、1.3.7項「伴意(ルール索引)」を参照してください。

8.8.4 分析操作の実行

大量のセマンティク・データをデータベースにロードした後、推論を実行する前に、アプリケーション表、セマンティク・モデルおよび推論されたグラフ(存在する場合)を分析することを強くお薦めします。分析操作を実行することで統計情報が収集され、問合せの応答時にOracleオプティマイザが効率的な実行計画を選択しやすくなります。

関連する統計情報を収集するには、OracleSailConnectionクラスおよびOracleSailStoreクラスで、次のメソッドを使用します。

- OracleSailConnection.analyze

- OracleSailConnection.analyzeApplicationTable

- OracleSailConnection.analyzeInferredGraph

パラメータを含むこれらのメソッドの詳細は、Sesame Adapterのリファレンス情報(Javadoc)を参照してください。

8.9 Sesame AdapterでのSesame Consoleの使用

OpenRDF.orgの説明のとおり、Sesame Consoleは、Sesameと対話するためのコマンドライン・アプリケーションです。現時点で、SYSTEMリポジトリにリポジトリを作成し管理するための最適な方法は、Sesame Consoleを使用することです。Sesame Consoleに関する基本的な使用方法とリファレンス情報については、http://openrdf.callimachus.net/sesame/2.7/docs/users.docbook?viewのドキュメントを参照してください。

この項では、Sesame Adapter for Oracle DatabaseでSesame Consoleを使用する方法について説明します。

Sesame Consoleコマンドライン・ツールを使用して、新しいSAILリポジトリ(OracleSailStoreオブジェクト)を作成するには、次のコマンドを使用します。

create oracle.

パラメータの入力を求められたら、次の項目を指定します。

Repository ID

リポジトリに関連付けられているID文字列。例: myOracleRepos

Repository Title

リポジトリに関連付けられているタイトル文字列。例: My Oracle Repository

Model Name

このリポジトリに対応するOracleセマンティク・モデルの名前。すべてのDML操作は、このモデルに対して実行されます。

Additional Models

このリポジトリに含める追加のセマンティク・モデルのカンマ区切りリスト。推論と問合せの操作にのみ使用される追加のモデル。

Rulebases

このリポジトリの伴意閉包を構築するときに考慮されるルールベースのカンマ区切りリスト。デフォルトではルールベースはなく、推論は実行されません。

Use Virtual Model (TRUE|FALSE) [TRUE]

問合せに応答する際に、仮想モデルを使用するかどうかを指定します。デフォルトはTRUEで、仮想モデルが使用されます。

Virtual Model Name

Use Virtual ModelがTRUEの場合、リポジトリを所有するデータベース・ユーザーに、指定された仮想モデルでの読取り権限がある場合は、問合せの応答に使用される仮想モデルの名前を指定します。

Inference Maintenance Mode (NO_UPDATE|UPDATE_WHEN_COMMIT) [NO_UPDATE]

コミット操作ごとに伴意閉包を更新する(UPDATE_WHEN_COMMIT)か、OracleSailConnection.performInferenceメソッドが起動されたときにのみ更新する(NO_UPDATE)かを指定します。デフォルトはNO_UPDATEです。

Allow Duplicates in Query (TRUE|FALSE) [TRUE]

追加のモデルがあるリポジトリを問い合せるときに、問合せのレスポンスに異なるモデルにわたって重複を含めることができるかどうかを指定します。デフォルトはTRUEで、重複を含めることを許可し、問合せのパフォーマンスを高速化します。

Allow Query with Non-Valid Inference status (INVALID|VALID|INCOMPLETE) [INVALID]

伴意が更新されない(つまり、推論ステータスが無効である)場合に問合せを許可するかどうかを指定します。デフォルト値はINVALIDで、この場合、問合せの際の伴意ステータスはINVALIDです。

伴意ステータスが有効な場合にのみ問合せを許可するには、VALIDを指定します。伴意ステータスが有効または不完全な場合に問合せを許可するには、INCOMPLETEを指定します。

Application Table Indexes [CPSO]

このリポジトリのアプリケーション表に作成されるカスタム索引を指定します。C (コンテキスト)、P (プロパティ)、S (主語)、O (目的語)のうち最大4つの文字列を使用して、含める列(およびその順序)を指定できます。(これらの文字のみが使用可能で、どの文字も繰り返して使用できません。)デフォルトはCPSOで、先行列としてコンテキストを持つ4つの列すべてで索引を作成します。

Index Option: Degree of Parallelism [1]

アプリケーション表の索引に対するDOP (並列度)の値を指定します。マルチコアまたはマルチCPUのプロセッサでは、異なるDOP値(4または8など)を試すと、パフォーマンスが向上する場合があります。デフォルトは1 (並列度なし)です。

Index Option: Prefix Length to Compress [2]

アプリケーション表の索引でキー圧縮を使用するかどうかを指定します。デフォルトは2で、最初の2列での圧縮を指定します。値が0 (ゼロ)の場合、圧縮は使用されません。

Enforce Uniqueness (FALSE|TRUE) []

リポジトリ内の複数のコンテキストにわたって文の一意性を強制するかどうかを指定します。文の一意性は、アプリケーション表の一意の索引によって強制されることに注意してください。デフォルトは[] (値は指定されない)で、モデルが存在する場合は、一意性の設定がそのモデルから継承され、モデルが存在しない場合は、一意でない索引が作成されます。

FALSEを指定していて一意の索引が存在する場合、その索引は削除され、一意でない索引として再作成されます。

Data Source Name [OracleSemDS]

このリポジトリのOracleセマンティク・モデルとアプリケーション表にアクセスするためのデータベース接続設定を提供するJDBCデータ・ソースの名前。デフォルトはOracleSemDSです。

例8-3に、Sesame Consoleを使用するシナリオの例を示します。

例8-3 Sesame Consoleの使用

> connect http://localhost:8080/openrdf-sesame.
Disconnecting from default data directory
Connected to http://localhost:8080/openrdf-sesame
> create oracle.
Please specify values for the following variables:
Repository ID: model2Repos
Repository title: Repository for Model 2
Model Name: model2
Additional Models (comma separated):
Rulebases (comma separated): OWLPRIME    -- OWLPRIME inference will be performed when this model is created
Use Virtual Model (TRUE|FALSE) [TRUE]:  TRUE
Virtual Model Name:     -- a new virtual model will be created if nonexistent
Inference Maintenance Mode (UPDATE_WHEN_COMMIT|NO_UPDATE) [UPDATE_WHEN_COMMIT]: NO_UPDATE
Allow duplicates in query (TRUE|FALSE) [TRUE]: TRUE
Allow query with non-valid inference status (NONE|INCOMPLETE|INVALID) [NONE]: NONE – inference must be up to date before query
Application Table Index [CPSO]: CPSO      –- default, recommended index
Index option: Degree of parallelism [1]: 1
Index option: Leading columns to compress [2]: 2
Enforce Uniqueness (|FALSE|TRUE) []: FALSE
DataSource Name [OracleSemDS]: OracleSemDS
Repository created
> open model2Repos.
Opened repository 'model2Repos'
model2Repos> show c.
--no contexts found--
model2Repos>

8.10 Sesame Adapterを使用した問合せ例

この項では、Sesame Adapterを使用した問合せの例を示します。各例は自己完結型で、通常はOraclePoolオブジェクトから始めて、OracleSailStoreオブジェクトを作成し、文の追加および場合によっては削除、推論を含む問合せの実行、結果の表示、OracleSailStoreオブジェクトの停止およびOraclePoolオブジェクトの終了を行います。

これらの例では、次のライブラリをCLASSPATH定義に含めておく必要があります。

sesame-console-2.3.1.jar
sesame-http-client-2.3.1.jar
sesame-http-protocol-2.3.1.jar
sesame-http-server-spring-2.3.1.jar
sesame-model-2.3.1.jar
sesame-query-2.3.1.jar
sesame-queryalgebra-evaluation-2.3.1.jar
sesame-queryalgebra-model-2.3.1.jar
sesame-queryparser-api-2.3.1.jar
sesame-queryparser-serql-2.3.1.jar
sesame-queryparser-sparql-2.3.1.jar
sesame-queryresultio-api-2.3.1.jar
sesame-queryresultio-binary-2.3.1.jar
sesame-queryresultio-sparqljson-2.3.1.jar
sesame-queryresultio-sparqlxml-2.3.1.jar
sesame-queryresultio-text-2.3.1.jar
sesame-repository-api-2.3.1.jar
sesame-repository-contextaware-2.3.1.jar
sesame-repository-dataset-2.3.1.jar
sesame-repository-event-2.3.1.jar
sesame-repository-http-2.3.1.jar
sesame-repository-manager-2.3.1.jar
sesame-repository-sail-2.3.1.jar
sesame-rio-api-2.3.1.jar
sesame-rio-n3-2.3.1.jar
sesame-rio-ntriples-2.3.1.jar
sesame-rio-rdfxml-2.3.1.jar
sesame-rio-trig-2.3.1.jar
sesame-rio-trix-2.3.1.jar
sesame-rio-turtle-2.3.1.jar
sesame-runtime-2.3.1.jar
sesame-sail-api-2.3.1.jar
sesame-sail-inferencer-2.3.1.jar
sesame-sail-memory-2.3.1.jar
sesame-sail-nativerdf-2.3.1.jar
sesame-sail-rdbms-2.3.1.jar
sdordf.jar
sdordfsesame.jar
ojdbc6.jar

例を簡略化するため、次のようにCPという環境変数が定義されています。

setenv CP ./:sesame-console-2.3.1.jar:sesame-http-client-2.3.1.jar:sesame-http-protocol-2.3.1.jar:sesame-http-server-spring-2.3.1.jar:sesame-model-2.3.1.jar:sesame-query-2.3.1.jar:sesame-queryalgebra-evaluation-2.3.1.jar:sesame-queryalgebra-model-2.3.1.jar:sesame-queryparser-api-2.3.1.jar:sesame-queryparser-serql-2.3.1.jar:sesame-queryparser-sparql-2.3.1.jar:sesame-queryresultio-api-2.3.1.jar:sesame-queryresultio-binary-2.3.1.jar:sesame-queryresultio-sparqljson-2.3.1.jar:sesame-queryresultio-sparqlxml-2.3.1.jar:sesame-queryresultio-text-2.3.1.jar:sesame-repository-api-2.3.1.jar:sesame-repository-contextaware-2.3.1.jar:sesame-repository-dataset-2.3.1.jar:sesame-repository-event-2.3.1.jar:sesame-repository-http-2.3.1.jar:sesame-repository-manager-2.3.1.jar:sesame-repository-sail-2.3.1.jar:sesame-rio-api-2.3.1.jar:sesame-rio-n3-2.3.1.jar:sesame-rio-ntriples-2.3.1.jar:sesame-rio-rdfxml-2.3.1.jar:sesame-rio-trig-2.3.1.jar:sesame-rio-trix-2.3.1.jar:sesame-rio-turtle-2.3.1.jar:sesame-runtime-2.3.1.jar:sesame-sail-api-2.3.1.jar:sesame-sail-inferencer-2.3.1.jar:sesame-sail-memory-2.3.1.jar:sesame-sail-nativerdf-2.3.1.jar:sesame-sail-rdbms-2.3.1.jar:sdordf.jar:sdordfsesame.jar:ojdbc6.jar

注意:
javacコマンドおよびjavaコマンドと同様、setenvコマンドは、1行のコマンドラインに入力します。

問合せを実行するには、次の手順を実行する必要があります。

1. コードをJavaソース・ファイルに含めます。この項で使用される例は、Sesame Adapterダウンロードのexamplesディレクトリのファイルで提供されています。

2. Javaソース・ファイルをコンパイルします。次に例を示します。

> javac -classpath $CP Example1.java

3. コンパイルされたファイルを実行します。次に例を示します。

> java -classpath $CP Test jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1

8.10.1 Example1.java: 基本操作

例8-4は、いくつかの基本操作を実行するExample1.javaファイルを示します。

例8-4 基本操作

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;

import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;

public class Example1
{
public static void main(String[] args) throws SQLException, SailException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);

OracleSailConnection conn = store.getConnection();

ValueFactory vf = store.getValueFactory();
URI p = vf.createURI("http://p");
URI cls = vf.createURI("http://cls");
URI a = vf.createURI("http://a");
URI b = vf.createURI("http://b");
URI ng1 = vf.createURI("http://ng1");

conn.clear();
conn.addStatement(p, RDFS.DOMAIN, cls);
conn.addStatement(a, p, b, ng1);

psOut.println("size of context " + ng1 + ":" + conn.size(ng1));

// returns OracleStatements
CloseableIteration<? extends Statement, SailException> it =
conn.getStatements(null, null, null, false);

while (it.hasNext()) {
Statement stmt = it.next();
psOut.println("getStatements: stmt: " + stmt.toString());
}

conn.removeStatements(null, null, null, ng1);

psOut.println("size of context " + ng1 + ":" + conn.size(ng1));

conn.removeAll();

psOut.println("size of store: " + conn.size());

conn.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

/usr/local/packages/jdk16/bin/javac -classpath $CP Example1.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example1 jdbc:oracle:thin:@localhost:1521:ORCL scott <password-for-scott> TestModel

javaコマンドの予期される出力は、次のようになります。

size of context http://ng1:1
getStatements: stmt:  O: (http://a, http://p, http://b) [http://ng1]
getStatements: stmt:  O: (http://p, http://www.w3.org/2000/01/rdf-schema#domain, http://cls) [null]
size of context http://ng1:0
size of store: 0

8.10.2 Example2.java: データ・ファイルの追加(TriG形式)

例8-5は、TriG形式でデータ・ファイルを追加するExample2.javaファイルを示します。

例8-5 データ・ファイルの追加(TriG形式)

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;

public class Example2
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];
String trigFile = args[4];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
SailRepository sr = new SailRepository(store);
RepositoryConnection repConn = sr.getConnection();

repConn.setAutoCommit(false);
repConn.add(new File(trigFile), "http://my.com/", RDFFormat.TRIG);
repConn.commit();

psOut.println("size " + Long.toString(repConn.size()));

repConn.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example2.java

この例を実行するため、次のようなサンプルのTriGデータ・ファイルがtest.trigという名前で作成されているとします。

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix swp: <http://www.w3.org/2004/03/trix/swp-1/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix ex: <http://example.org/> .
@prefix : <http://example.org/> .

# default graph
{
<http://example.org/bob>    dc:publisher  "Bob Hacker" .
<http://example.org/alice>  dc:publisher  "Alice Hacker" .
}

:bob {
_:a foaf:mbox <mailto:bob@oldcorp.example.org> .
}

:alice {
_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example.org> .
}

:jack {
_:a foaf:name "Jack" .
_:a foaf:mbox <mailto:jack@oracle.example.org> .
}

test.trigデータ・ファイルを使用してこの例を実行するには、次のコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example2 jdbc:oracle:thin:@localhost:1521:ORCL scott  <password>  TestModel ./test.trig

javaコマンドの予期される出力は、次のようになります。

size 7

8.10.3 Example3.java: 単純な問合せ

例8-6は、単純な問合せを実行するExample3.javaファイルを示します。

例8-6 単純な問合せ

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example3
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
SailRepository myRepository = new SailRepository(store);

ValueFactory f = myRepository.getValueFactory();
RepositoryConnection conn = myRepository.getConnection();

// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");

conn.clear(); // to start from scratch
conn.add(alice, RDF.TYPE, person);
conn.add(alice, name, alicesName);
conn.commit();

store.analyze();
store.analyzeApplicationTable();

try {
//run a query against the repository
String queryString = " SELECT * WHERE {?x ?p ?y} LIMIT 1 ";
TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
TupleQueryResult result = tupleQuery.evaluate();
try {
while (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("value of x: " + bindingSet.getValue("x"));
}
}
finally {
result.close();
}
}
finally {
conn.clear();
if (conn != null && conn.isOpen()) {
conn.close();
}

myRepository.shutDown();
op.close();
}
}
}

この例をコンパイルするには、次のコマンドを入力します。

/usr/local/packages/jdk16/bin/javac -classpath $CP Example3.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example3 jdbc:oracle:thin:@localhost:1521:ORCL scott <password-for-scott> TestModel

javaコマンドの予期される出力は、次のようになります。

value of x: http://example.org/people/alice

8.10.4 Example4.java: 単純なバルク・ロード

例8-7は、単純なバルク・ロード操作を実行するExample4.javaファイルを示します。

例8-7 単純なバルク・ロード

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.Resource;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example4
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];
String filename = args[4]; // N-TRIPLES file

OraclePool op = new OraclePool(OraclePool.getOracleDataSource(jdbcUrl, user, password));

psOut.println("testBulkLoad: start");

OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
FileInputStream fis = new FileInputStream(filename);

long loadBegin = System.currentTimeMillis();
osc.getBulkUpdateHandler().addInBulk(
fis,
"http://abc",                // baseURI
RDFFormat.NTRIPLES,          // dataFormat
null,                        // tablespaceName
null,                        // flags
null,                        // StatusListener
(Resource[]) null            // Resource... for contexts
);

long loadEnd = System.currentTimeMillis();
psOut.println("testBulkLoad: " + (loadEnd - loadBegin) + "ms.\n");

osc.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example4.java

この例を実行するため、次のようなサンプルのntriplesデータ・ファイルがtest.ntriplesという名前で作成されているとします。

<http://example.org/bob>    <http://purl.org/dc/elements/1.1/publisher>  "Bob Hacker" .
<http://example.org/alice>  <http://purl.org/dc/elements/1.1/publisher>  "Alice Hacker" .

test.ntriplesファイルを使用してこの例を実行するには、次のコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example4 jdbc:oracle:thin:@localhost:1521:ORCL scott  <password>  TestModel ./test.ntriples

javaコマンドの予期される出力は、次のようになります。

testBulkLoad: start
testBulkLoad: 756ms

8.10.5 Example5.java: RDF/XMLのバルク・ロードとアプリケーション表の索引のメンテナンス

例8-8は、アプリケーション表の索引を無効にし、XML形式のRDFファイルからバルク・ロード操作を実行した後、索引を再度有効にするExample5.javaファイルを示します。

例8-8 RDF/XMLのバルク・ロードとアプリケーション表の索引のメンテナンス

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.Resource;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example5
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];
String filename = args[4]; // RDF/XML

OraclePool op = new OraclePool(OraclePool.getOracleDataSource(jdbcUrl, user, password));

psOut.println("testBulkLoad: start");

OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();

// disable indexes on application table
store.disableAllAppTabIndexes();

// NOTE: can be a gzipped file!
FileInputStream fis = new FileInputStream(filename);

long loadBegin = System.currentTimeMillis();
osc.getBulkUpdateHandler().addInBulk(
fis,
"http://abc",                // baseURI
RDFFormat.RDFXML,            // dataFormat
null,                        // tablespaceName
null,                        // flags
null,                        // StatusListener
(Resource[]) null            // Resource... for contexts
);

long loadEnd = System.currentTimeMillis();
psOut.println("testBulkLoad: " + (loadEnd - loadBegin) + "ms.\n");

// enable indexes on application table
// Note: one can also specify to rebuild indexes in parallel.
store.enableAllAppTabIndexes();

osc.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example5.java

この例を実行するため、次のようなサンプル・ファイルがtest.rdfxmlという名前で作成されているとします。

<?xml version="1.0"?>
<!DOCTYPE owl [
<!ENTITY owl  "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd  "http://www.w3.org/2001/XMLSchema#" >
]>

<rdf:RDF
xmlns     = "http://a/b#" xml:base  = "http://a/b#" xmlns:my  = "http://a/b#"
xmlns:owl = "http://www.w3.org/2002/07/owl#"
xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs= "http://www.w3.org/2000/01/rdf-schema#"
xmlns:xsd = "http://www.w3.org/2001/XMLSchema#">
<owl:Class rdf:ID="Color">
<owl:oneOf rdf:parseType="Collection">
<owl:Thing rdf:ID="Red"/>
<owl:Thing rdf:ID="Blue"/>
</owl:oneOf>
</owl:Class>
</rdf:RDF>

test.rdfxmlファイルを使用してこの例を実行するには、次のコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example5 jdbc:oracle:thin:@localhost:1521:ORCL scott  <password>  EX5 ./test.rdfxml

javaコマンドの予期される出力は、次のようになります。

testBulkLoad: start
testBulkLoad: 825ms

8.10.6 Example6.java: 不良データのあるロードを処理するためのStatusListenerによるバルク・ロード

例8-9は、例8-7に示されているバルク・ロードと索引メンテナンスの操作を実行し、またデータ・エラーの調査と報告を行うStatusListenerクラスを登録して実装するExample6.javaファイルを示します。

例8-9 不良データのあるロードを処理するためのStatusListenerによるバルク・ロード

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.Resource;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.model.Statement;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example6
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];
String filename = args[4]; // RDF/XML

OraclePool op = new OraclePool(OraclePool.getOracleDataSource(jdbcUrl, user, password));

psOut.println("testBulkLoad: start");

OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();

// disable indexes on application table
store.disableAllAppTabIndexes();

// NOTE: can be a gzipped file!
FileInputStream fis = new FileInputStream(filename);

long loadBegin = System.currentTimeMillis();
osc.getBulkUpdateHandler().addInBulk(
fis,
"http://abc",                // baseURI
RDFFormat.NTRIPLES,          // dataFormat
null,                        // tablespaceName
null,                        // flags
new MyListener(psOut),       // register a StatusListener
(Resource[]) null            // Resource... for contexts
);

long loadEnd = System.currentTimeMillis();
psOut.println("testBulkLoad: " + (loadEnd - loadBegin) + "ms.\n");

// enable indexes on application table
// Note: one can also specify to rebuild indexes in parallel.
store.enableAllAppTabIndexes();

osc.close();
store.shutDown();
op.close();
}

static class MyListener implements StatusListener {
PrintStream m_ps = null;
public MyListener(PrintStream ps) { m_ps = ps; }

public void statusChanged(long count)
{
m_ps.println("process to " + Long.toString(count));
}

public int illegalStmtEncountered(Statement statement, long count)
{
m_ps.println("hit illegal statement with object " + statement.getObject().toString());
return 0; // skip it
}
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example6.java

この例を実行するため、次のようなサンプルのN-TRIPLESファイルがtest-include-badtriple.ntriplesという名前で作成されているとします。このファイルの最初と最後のトリプルには、オブジェクトに対して違法なタイプのリテラル値があります。

<http://example.org/x>      <http://my.com/#age> "123.3456"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://example.org/bob>    <http://purl.org/dc/elements/1.1/publisher>  "Bob Hacker" .
<http://example.org/alice>  <http://purl.org/dc/elements/1.1/publisher>  "Alice Hacker" .
<http://example.org/y>      <http://my.com/#age> "hello"^^<http://www.w3.org/2001/XMLSchema#float> .

test-include-badtriple.ntriplesファイルを使用してこの例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example6 jdbc:oracle:thin:@localhost:1521:ORCL scott  <password>  EX6 ./test-include-badtriple.ntriples

javaコマンドの予期される出力は、次のようになります。

testBulkLoad: start
hit illegal statement with object "123.3456"^^<http://www.w3.org/2001/XMLSchema#integer>
process to 2
process to 3
hit illegal statement with object "hello"^^<http://www.w3.org/2001/XMLSchema#float>
testBulkLoad: 725ms.

8.10.7 Example7.java: SesameストアからOracle Databaseへのデータのロード

例8-10は、アプリケーション表の索引を無効にし、XML形式のRDFファイルをメモリー内Sesameストアにロードして、そのデータをOracle Databaseにロードし、索引を再度有効にするExample7.javaファイルを示します。

例8-10 SesameストアからOracle Databaseへのデータのロード

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.Resource;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.sail.memory.MemoryStore;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.model.Statement;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example7
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];
String filename = args[4]; // RDF/XML

OraclePool op = new OraclePool(OraclePool.getOracleDataSource(jdbcUrl, user, password));

psOut.println("testBulkLoad: start");

SailRepository srInMem = null;
RepositoryConnection repConnInMem = null;
{ // build an in memory Sesame store for testing purpose
srInMem = new SailRepository(new MemoryStore());
srInMem.initialize();
repConnInMem = srInMem.getConnection();
File file = new File(filename);
repConnInMem.setAutoCommit(false);
repConnInMem.add(file, "http://my.com", RDFFormat.RDFXML);
repConnInMem.commit();
}

OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();

// disable indexes on application table
store.disableAllAppTabIndexes();

long loadBegin = System.currentTimeMillis();
// load all statements from in memory store to Oracle
osc.getBulkUpdateHandler().addInBulk(
repConnInMem.getStatements(null, null, null, false),
null                       // tablespaceName
);

long loadEnd = System.currentTimeMillis();
psOut.println("testBulkLoad: " + (loadEnd - loadBegin) + "ms.\n");

// enable indexes on application table
// Note: one can also specify to rebuild indexes in parallel.
store.enableAllAppTabIndexes();

repConnInMem.close();
srInMem.shutDown();

osc.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example7.java

この例を実行するため、8.10.5項「Example5.java: RDF/XMLのバルク・ロードとアプリケーション表の索引のメンテナンス」で説明されたファイルと同じ形式と内容で、(メモリーにロードされる)ファイルが作成されているとします。

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example7 jdbc:oracle:thin:@localhost:1521:ORCL scott  <password>  EX7 ./test.rdfxml

javaコマンドの予期される出力は、次のようになります。

testBulkLoad: start
testBulkLoad: 720ms

8.10.8 Example8.java: SPARQL ASK問合せ

例8-11は、SPARQL ASK問合せを実行するExample8.javaファイルを示します。

例8-11 SPARQL ASK問合せ

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example8
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);

SailRepository sr = new SailRepository(store);
RepositoryConnection repConn = sr.getConnection();

ValueFactory vf = sr.getValueFactory();
URI p   = vf.createURI("http://p");
URI cls = vf.createURI("http://cls");

repConn.clear();
repConn.add(p, RDFS.DOMAIN, cls);
repConn.commit();

store.analyze();                 // analyze the semantic model
store.analyzeApplicationTable(); // and then the application table

BooleanQuery tq = null;
tq = repConn.prepareBooleanQuery(QueryLanguage.SPARQL, "ASK { ?x ?p <http://cls> }" );
boolean b = tq.evaluate();
psOut.print("\nAnswer is " + Boolean.toString(b));

repConn.close();
sr.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example8.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example4 jdbc:oracle:thin:@localhost:1521:ORCL scott  <password>  EX8

javaコマンドの予期される出力は、次のようになります。

Answer is true

8.10.9 Example9.java: SPARQL CONSTRUCTおよびSPARQL DESCRIBE

例8-12は、SPARQL CONSTRUCT問合せおよびSPARQL DESCRIBE問合せを実行するExample9.javaファイルを示します。

例8-12 SPARQL CONSTRUCTおよびSPARQL DESCRIBE

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example9
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);

SailRepository sr = new SailRepository(store);
RepositoryConnection repConn = sr.getConnection();

ValueFactory vf = sr.getValueFactory();
URI p   = vf.createURI("http://p");
URI cls = vf.createURI("http://cls");

repConn.clear();
repConn.add(p, RDFS.DOMAIN, cls);
repConn.commit();

store.analyze();                 // analyze the semantic model
store.analyzeApplicationTable(); // and then the application table

GraphQuery tq = null;
tq = repConn.prepareGraphQuery(QueryLanguage.SPARQL,
"CONSTRUCT {?x <http://new_eq_p> ?o } WHERE { ?x ?p ?o }" );
{
psOut.println("Start construct query");
GraphQueryResult result = tq.evaluate();
while (result.hasNext()) {
Statement stmt = (Statement) result.next();
psOut.println(stmt.toString());
// do something interesting with the values here...
}
result.close();
}

tq = repConn.prepareGraphQuery(QueryLanguage.SPARQL,
"DESCRIBE <http://p> ");
{
psOut.println("Start describe query");
GraphQueryResult result = tq.evaluate();
while (result.hasNext()) {
Statement stmt = (Statement) result.next();
psOut.println(stmt.toString());
// do something interesting with the values here...
}
result.close();
}

repConn.close();
sr.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example9.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example9 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX9

javaコマンドの予期される出力は、次のようになります。

Start construct query
(http://p, http://new_eq_p, http://cls)
Start describe query
(http://p, http://www.w3.org/2000/01/rdf-schema#domain, http://cls)

8.10.10 Example10.java: 推論

例8-13は、増分(INC)オプションと並列度(DOP)オプションを使用してOWLPrime推論を実行するExample10.javaファイルを示します。

例8-13 推論

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example10
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
String[] rulebaseNames = new String[1];
rulebaseNames[0] = "owlprime";

Attachment attachment = Attachment.createInstance(
Attachment.NO_ADDITIONAL_MODELS, rulebaseNames,
InferenceMaintenanceMode.NO_UPDATE,
QueryOptions.DEFAULT);

OracleSailStore store = new OracleSailStore(op, model, attachment);
OracleSailConnection osc = store.getConnection();

ValueFactory vf = osc.getValueFactory();

URI sub, pred, obj;
{
sub = vf.createURI("http://C1");
pred = vf.createURI("http://www.w3.org/2000/01/rdf-schema#subClassOf");
obj  = vf.createURI("http://C2");
osc.addStatement(sub, pred, obj);

sub = vf.createURI("http://C2");
pred = vf.createURI("http://www.w3.org/2000/01/rdf-schema#subClassOf");
obj  = vf.createURI("http://C3");
osc.addStatement(sub, pred, obj);
}

osc.commit();
osc.analyze();                 // analyze the semantic model
osc.analyzeApplicationTable(); // and then the application table

// parallel inference is certainly an overkill for this ontology
osc.setInferenceOption("INC=T,DOP=4,RAW8=T");
osc.performInference();
osc.analyzeInferredGraph();

TupleQuery tq = null;
RepositoryConnection repConn = osc.asRepositoryConnection();
tq = repConn.prepareTupleQuery(QueryLanguage.SPARQL,
"SELECT ?s ?p ?o WHERE {?s ?p ?o } ");
{
TupleQueryResult result = tq.evaluate();
int idx = 0;
try {
psOut.print("\nStart printing solution\n");
while (result.hasNext()) {
idx++;
BindingSet bindingSet = result.next();
}
}
finally {
psOut.println("\ntotal # of solution " + Integer.toString(idx));
result.close();
}
}

{
sub  = vf.createURI("http://C3");
pred = vf.createURI("http://www.w3.org/2000/01/rdf-schema#subClassOf");
obj  = vf.createURI("http://C4");
osc.addStatement(sub, pred, obj);
}

// make a small change and then perform inference again
osc.commit();
osc.analyze();                 // analyze the semantic model
osc.analyzeApplicationTable(); // and then the application table
osc.performInference();
osc.analyzeInferredGraph();

{
TupleQueryResult result = tq.evaluate();
int idx = 0;
try {
psOut.print("\nStart printing solution\n");
while (result.hasNext()) {
idx++;
BindingSet bindingSet = result.next();
}
}
finally {
psOut.println("\ntotal # of solution " + Integer.toString(idx));
result.close();
}
}

osc.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example10.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example10 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX10

javaコマンドの予期される出力は、次のようになります。

Start printing solution

total # of solution 3

Start printing solution

total # of solution 6

8.10.11 Example11.java: 名前付きグラフ問合せ

例8-14は、名前付きグラフ問合せを実行するExample9.javaファイルを示します。

例8-14 名前付きグラフ問合せ

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example11
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];
String trigFile = args[4];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));

OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
RepositoryConnection repConn = osc.asRepositoryConnection();
repConn.setAutoCommit(false);

// load the data incrementally since it is very small file
repConn.add(new File(trigFile), "http://my.com/", RDFFormat.TRIG);

osc.commit();
osc.analyze();                 // analyze the semantic model
osc.analyzeApplicationTable(); // and then the application table

TupleQuery tq = null;
tq = repConn.prepareTupleQuery(QueryLanguage.SPARQL,
"SELECT ?g ?s ?p ?o WHERE {?g <http://purl.org/dc/elements/1.1/publisher> ?o1 . GRAPH ?g {?s ?p ?o}}");
{
TupleQueryResult result = tq.evaluate();
int idx = 0;
try {
while (result.hasNext()) {
idx++;
BindingSet bindingSet = result.next();
psOut.print("\nsolution " + bindingSet.toString());
}
}
finally {
psOut.println("\ntotal # of solution " + Integer.toString(idx));
result.close();
}
}

osc.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example9.java

この例を実行するため、8.10.2項「Example2.java: データ・ファイルの追加(TriG形式)」で説明されたtest.trigファイルが作成されているとします。

test.trigデータ・ファイルを使用してこの例を実行するには、次のコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example11 jdbc:oracle:thin:@localhost:1521:ORCL scott  <password>  EX11 ./test.trig

javaコマンドの予期される出力は、次のようになります。

solution [g=http://example.org/alice;s=_:node14r2238h1x1;p=http://xmlns.com/foaf/0.1/mbox;o=mailto:alice@work.example.org]
solution [g=http://example.org/alice;s=_:node14r2238h1x1;p=http://xmlns.com/foaf/0.1/name;o="Alice"]
solution [g=http://example.org/bob;s=_:node14r2238h1x1;p=http://xmlns.com/foaf/0.1/mbox;o=mailto:bob@oldcorp.example.org]
total # of solution 3

8.10.12 Example12.java: アプリケーション表の索引[高度]

例8-15は、アプリケーション表で索引を作成する高度な例のExample12.javaファイルを示します。

例8-15 アプリケーション表の索引[高度]

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example12
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));

OracleSailStore store = new OracleSailStore(op, model);

// create an index with compress 2, parallel 4
store.createAppTabIndex("spoc", 2, 4);

// create another index w/o parallel or compression
store.createAppTabIndex("cspo", 0, 1);

// will print out the default index (cpso) as well
psOut.println("index signatures before dropping indexes:");
for (String sig : store.getAppTabIndexSignatures()) {
psOut.println("index signature:" + sig);
}

store.dropAllAppTabIndexes();
psOut.println("index signatures after dropping indexes...");
for (String sig : store.getAppTabIndexSignatures()) {
psOut.println("index signature:" + sig);
}

store.shutDown();

// clean up oracle tables and models
OracleUtils.dropSemanticModelAndTables(op, model);

store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example12.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example12 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX12

javaコマンドの予期される出力は、次のようになります。

index signatures before dropping indexes:
index signature:spoc
index signature:cpso
index signature:cspo
index signatures after dropping indexes...

8.10.13 Example13.java: アプリケーション表の一意性制約[高度]

例8-16は、アプリケーション表で一意性制約を有効にしたり無効にする高度な例のExample13.javaファイルを示します。

例8-16 アプリケーション表の一意性制約[高度]

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example13
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));

OracleSailStore store = new OracleSailStore(op, model);
store.enableUniquenessConstraint();    ValueFactory f = store.getValueFactory();

OracleSailConnection osc = store.getConnection();

// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");

osc.addStatement(alice, name, person);
osc.addStatement(alice, name, person);
psOut.println("size of store after adding duplicate triple with uniqueness ON :" + osc.size());

osc.clear();
store.disableUniquenessConstraint();    osc.addStatement(alice, name, person);
osc.addStatement(alice, name, person);
psOut.println("size of store after adding duplicate triple with uniqueness OFF:" + osc.size());

osc.close();

store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example13.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example13 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX13

javaコマンドの予期される出力は、次のようになります。

size of store after adding duplicate triple with uniqueness ON :1
size of store after adding duplicate triple with uniqueness OFF:2

8.10.14 Example14.java: 問合せタイムアウトとパラレル実行[高度]

例8-17は、問合せタイムアウトとパラレル実行(TIMEOUTオプションとDOPオプション)を指定する高度な例のExample14.javaファイルを示します。

例8-17 問合せタイムアウトとパラレル実行[高度]

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example14
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);

OracleSailConnection osc = store.getConnection();
ValueFactory f = osc.getValueFactory();

// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");

osc.addStatement(alice, RDF.TYPE, person);
osc.addStatement(alice, name, alicesName);
osc.commit();

osc.analyze();
osc.analyzeApplicationTable();

// Run a query while specifying parallel execution (through DOP=2)
// and max query execution time (through tmieout=3)
String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#dop=2,timeout=3> " +
" SELECT * WHERE {?x ?p ?y} ";

TupleQuery tupleQuery = osc.asRepositoryConnection().prepareTupleQuery(
QueryLanguage.SPARQL, queryString);

TupleQueryResult result = tupleQuery.evaluate();
try {
while (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("value of x: " + bindingSet.getValue("x"));
}
}
finally {
result.close();
}

osc.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example14.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example14 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX14

javaコマンドの予期される出力は、次のようになります。

value of x: http://example.org/people/alice
value of x: http://example.org/people/alice

8.10.15 Example15.java: 一致件数の取得[高度]

例8-18は、一致の合計数(COUNT) (および一致したもののみ)を戻す高度な例のExample15.javaファイルを示します。

例8-18 一致件数の取得[高度]

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example15
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);

OracleSailConnection osc = store.getConnection();
ValueFactory f = osc.getValueFactory();

// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");

osc.addStatement(alice, RDF.TYPE, person);
osc.addStatement(alice, name, alicesName);
osc.commit();

osc.analyze();
osc.analyzeApplicationTable();

// Run a query and only return the number of matches (the count!)
String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#count_only> " +
" SELECT ?totalCount WHERE {?s ?p ?y} ";

TupleQuery tupleQuery = osc.asRepositoryConnection().prepareTupleQuery(
QueryLanguage.SPARQL, queryString);

TupleQueryResult result = tupleQuery.evaluate();
try {
if (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("number of matches: " + bindingSet.getValue("totalCount"));
}
}
finally {
result.close();
}

osc.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example15.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example15 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX15

javaコマンドの予期される出力は、次のようになります。

number of matches: "2"^^<http://www.w3.org/2001/XMLSchema#integer>

8.10.16 Example16.java: 問合せパターンの定数に対するバインド変数の指定[高度]

例8-19は、SPARQL問合せパターンの定数に対してバインド変数を指定する高度な例のExample16.javaファイルを示します。

例8-19 問合せパターンの定数に対するバインド変数の指定[高度]

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example16
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);

OracleSailConnection osc = store.getConnection();
ValueFactory f = osc.getValueFactory();

// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");

osc.addStatement(alice, RDF.TYPE, person);
osc.addStatement(alice, name, alicesName);
osc.commit();

osc.analyze();
osc.analyzeApplicationTable();

String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#use_bind_var(1)> " +
" SELECT ?p WHERE { <http://example.org/people/alice> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?p} ";

TupleQuery tupleQuery = osc.asRepositoryConnection().prepareTupleQuery(
QueryLanguage.SPARQL, queryString);

TupleQueryResult result = tupleQuery.evaluate();
try {
if (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("solution " + bindingSet.toString());
}
}
finally {
result.close();
}

osc.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example16.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example16 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX16

javaコマンドの予期される出力は、次のようになります。

solution [p=http://example.org/ontology/Person]

8.10.17 Example17.java: 問合せパターンの異なる位置の定数に対するバインド変数の指定[高度]

例8-20は、Example16.java (例8-19)のSPARQL問合せパターンと異なる位置の定数に対するバインド変数を指定する高度な例のExample17.javaファイルを示します。

例8-20 問合せパターンの異なる位置の定数に対するバインド変数の指定[高度]

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example17
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);

OracleSailConnection osc = store.getConnection();
ValueFactory f = osc.getValueFactory();

// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");

osc.addStatement(alice, RDF.TYPE, person);
osc.addStatement(alice, name, alicesName);
osc.commit();

osc.analyze();
osc.analyzeApplicationTable();

String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#use_bind_var(2)> " +
" SELECT ?s WHERE { ?s <http://example.org/ontology/name> \"Alice\" } ";

TupleQuery tupleQuery = osc.asRepositoryConnection().prepareTupleQuery(
QueryLanguage.SPARQL, queryString);

TupleQueryResult result = tupleQuery.evaluate();
try {
if (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("solution " + bindingSet.toString());
}
}
finally {
result.close();
}

osc.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example17.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example17 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX17

javaコマンドの予期される出力は、次のようになります。

solution [s=http://example.org/people/alice]

8.10.18 Example18.java: 内部の数値IDからのURIの構築[高度]

例8-21は、内部の数値IDからURIを構築する高度な例のExample18.javaファイルを示します。

例8-21 内部の数値IDからのURIの構築[高度]

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;

import java.io.*;
import java.sql.SQLException;

import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;

public class Example18
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl  = args[0];
String user     = args[1];
String password = args[2];
String model    = args[3];

OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);

OracleSailConnection osc = store.getConnection();
ValueFactory f = osc.getValueFactory();

// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");

osc.addStatement(alice, RDF.TYPE, person);
osc.addStatement(alice, name, alicesName);
osc.commit();

osc.analyze();
osc.analyzeApplicationTable();

String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#build-uri-for-id(?p)> " +
" SELECT ?p WHERE { <http://example.org/people/alice> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?p} ";

TupleQuery tupleQuery = osc.asRepositoryConnection().prepareTupleQuery(
QueryLanguage.SPARQL, queryString);

TupleQueryResult result = tupleQuery.evaluate();
try {
if (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("solution " + bindingSet.toString());
}
}
finally {
result.close();
}

osc.close();
store.shutDown();
op.close();
}
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example18.java

この例を実行するには、次の形式でコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example18 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX18

javaコマンドの予期される出力は、次のようになります。

solution [p=rdfvid:428072448720587401]

第II部

リファレンスおよび補足情報

このマニュアルは、次のように構成されています。

- 第I部では、Oracleセマンティク・テクノロジの概念および使用方法について説明します。

- 第II部では、Oracleセマンティク・テクノロジのサブプログラムに関するリファレンス情報を示し、付録および用語集で補足情報を示します。

第II部には、リファレンスおよび補足情報に関する次の章が含まれます。

- 第9章「SEM_APISパッケージのサブプログラム」

- 第10章「SEM_OLSパッケージのサブプログラム」

- 第11章「SEM_PERFパッケージのサブプログラム」

- 第12章「SEM_RDFCTXパッケージのサブプログラム」

- 第13章「SEM_RDFSAパッケージのサブプログラム」

- 付録A「セマンティク・テクノロジ・サポートの有効化、ダウングレードまたは削除」

- 付録B「空間問合せのSEM_MATCHサポート」

- 用語集

リファレンスの章の例を理解するには、第1章「Oracle Databaseセマンティク・テクノロジの概要」と第2章「OWLの概要」に記載されている概念およびデータ型について理解しておく必要があります。

9 SEM_APISパッケージのサブプログラム

SEM_APISパッケージには、Oracle DatabaseのResource Description Framework (RDF)およびWeb Ontology Language (OWL)とともに使用できるサブプログラム(ファンクションとプロシージャ)が含まれます。この章のサブプログラムを使用するには、第1章「Oracle Databaseセマンティク・テクノロジの概要」と第2章「OWLの概要」に記載されている概念および使用情報について理解しておく必要があります。

この章では、サブプログラムに関するリファレンス情報を示します(サブプログラムのリストはアルファベット順です)。

SEM_APIS.ADD_DATATYPE_INDEX

書式

SEM_APIS.ADD_DATATYPE_INDEX(

datatype IN VARCHAR2,

tablespace_name IN VARCHAR2 default NULL,

parallel IN PLS_INTEGER default NULL,

online IN BOOLEAN default FALSE,

options IN VARCHAR2 default NULL);

説明

指定されたデータ型のデータ型索引をセマンティク・ネットワークに追加します。

パラメータ

datatype

索引付けするデータ型のURI。

tablespace_name

索引作成先の表領域。

parallel

索引作成時に使用する並列度。

online

TRUEに設定すると、索引の作成時に索引に影響を与えるDML操作が許可され、FALSE (デフォルト)に設定すると、索引の作成時に索引に影響を与えるDML操作は許可されません。

options

OPTION_NAME=option_value形式を使用する索引作成のオプションを指定する文字列。サポートされるオプションは、SRID、TOLERANCEおよびDIMENSIONSで、これらはすべて空間索引の作成(1.6.6.2項「空間データの索引付け」を参照)に関連付けられています。オプション名のキーワードは大/小文字の区別があるため、大文字で指定する必要があります。

使用方法

このプロシージャをコールするには、DBA権限が必要です。

データ型索引付けの詳細は、1.9項を参照してください。

RDF空間データに対するデータ型索引の作成の詳細は、1.6.6.2項を参照してください。

例

次の例では、MY_TBS表領域にxsd:string型付きリテラルとプレーン・リテラルで索引を作成します。

EXECUTE SEM_APIS.ADD_DATATYPE_INDEX('http://www.w3.org/2001/XMLSchema#string', tablespace_name=>'MY_TBS', parallel=>4);

SEM_APIS.ADD_SEM_INDEX

書式

SEM_APIS.ADD_SEM_INDEX(

index_code IN VARCHAR2);

説明

セマンティク・ネットワーク索引を作成することにより、セマンティク・ネットワークの既存のモデルおよび伴意それぞれに対して、一意でないBツリー索引がUNUSABLEステータスで作成されます。

パラメータ

index_code

索引コード文字列。

使用方法

このプロシージャをコールするには、DBA権限が必要です。

セマンティク・ネットワーク索引の詳細は、1.8項を参照してください。

例

次の例では、索引コード文字列pcsmを使用して、セマンティク・ネットワークのモデルおよび伴意に対するセマンティク・ネットワーク索引を作成します。

EXECUTE SEM_APIS.ADD_SEM_INDEX('pscm');

SEM_APIS.ALTER_DATATYPE_INDEX

書式

SEM_APIS.ALTER_DATATYPE_INDEX(

datatype IN VARCHAR2,

command IN VARCHAR2,

tablespace_name IN VARCHAR2 default NULL,

parallel IN PLS_INTEGER default NULL,

online IN BOOLEAN default FALSE);

説明

データ型索引を変更します。

パラメータ

datatype

索引付けするデータ型のURI。

options

実行するコマンドを指定する文字列です(データ型索引を再構築する場合はREBUILD、データ型索引を使用不能としてマークする場合はUNUSABLEを指定します)。このパラメータの値には、大/小文字の区別がありません。

tablespace_name

索引作成先の表領域。

parallel

索引を再構築する場合に使用する並列度。

online

TRUEに設定すると、索引の再構築時に索引に影響を与えるDML操作が許可され、FALSE (デフォルト)に設定すると、索引の再構築時に索引に影響を与えるDML操作は許可されません。

使用方法

このプロシージャをコールするには、DBA権限が必要です。

データ型索引の詳細は、1.9項を参照してください。

例

次の例では、MY_TBS表領域にxsd:string型付きリテラルとプレーン・リテラルで索引を再構築します。

EXECUTE SEM_APIS.ALTER_DATATYPE_INDEX('http://www.w3.org/2001/XMLSchema#string', command=>'REBUILD', tablespace_name=>'MY_TBS', parallel=>4);

SEM_APIS.ALTER_ENTAILMENT

書式

SEM_APIS.ALTER_ENTAILMENT(

entailment_name IN VARCHAR2,

command IN VARCHAR2,

tablespace_name IN VARCHAR2,

parallel IN NUMBER(38) DEFAULT NULL);

説明

伴意(ルール索引)を変更します。現在、サポートされている唯一のアクションは、指定された表領域に伴意を移動することです。

パラメータ

entailment_name

伴意の名前。

command

文字列MOVEである必要があります。

tablespace_name

宛先表領域の名前。

parallel

操作に関連付けられている並列度。パラレル実行の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

使用方法

伴意の詳細は、1.3.7項を参照してください。

例

次の例では、rdfs_rix_familyという名前の伴意をmy_tbsという名前の表領域に移動します。

EEXECUTE SEM_APIS.ALTER_ENTAILMENT('rdfs_rix_family', 'MOVE',  'my_tbs');

SEM_APIS.ALTER_MODEL

書式

SEM_APIS.ALTER_MODEL(

model_name IN VARCHAR2,

command IN VARCHAR2,

tablespace_name IN VARCHAR2,

parallel IN NUMBER(38) DEFAULT NULL);

説明

モデルを変更します。現在、サポートされている唯一のアクションは、指定したデータベースにモデルを移動することです。

パラメータ

model_name

モデルの名前。

command

文字列MOVEである必要があります。

tablespace_name

宛先表領域の名前。

parallel

操作に関連付けられている並列度。パラレル実行の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

使用方法

モデルの詳細は、1.2項「セマンティク・データのモデル化」および1.3項「データベースのセマンティク・データ」を参照してください。

6.5項「RDFデータに対してWorkspace Managerサポートを使用する場合の特別な考慮事項」の説明にあるとおり、このプロシージャはバージョン対応RDFモデルではサポートされません。

例

次の例では、familyというモデルをmy_tbsという表領域に移動します。

EEXECUTE SEM_APIS.ALTER_MODEL('family', 'MOVE',  'my_tbs');

SEM_APIS.ALTER_SEM_INDEX_ON_ENTAILMENT

書式

SEM_APIS.ALTER_SEM_INDEX_ON_ENTAILMENT(

entailment_name IN VARCHAR2,

index_code IN VARCHAR2,

command IN VARCHAR2,

tablespace_name IN VARCHAR2 DEFAULT NULL,

use_compression IN BOOLEAN DEFAULT NULL,

parallel IN NUMBER(38) DEFAULT NULL,

online IN BOOLEAN DEFAULT FALSE);

説明

伴意のセマンティク・ネットワーク索引を変更します。

パラメータ

entailment_name

伴意の名前。

index_code

索引コード文字列。

command

次のいずれかのコマンドを含む文字列値です(REBUILDを指定すると、伴意のセマンティク・ネットワーク索引を再構築し、UNUSABLEを指定すると、伴意のセマンティク・ネットワーク索引を使用不能としてマークします)。このパラメータの値には、大/小文字の区別がありません。

tablespace_name

再構築操作先の表領域の名前。

use_compression

索引を再構築する場合に圧縮を使用するかどうかを指定します。

parallel

操作に関連付けられている並列度。パラレル実行の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

online

TRUEに設定すると、索引の再構築時に索引に影響を与えるDML操作が許可され、FALSE (デフォルト)に設定すると、索引の再構築時に索引に影響を与えるDML操作は許可されません。

使用方法

セマンティク・ネットワーク索引の詳細は、1.8項を参照してください。

例

次の例では、rdfs_rix_familyという名前の伴意のセマンティク・ネットワーク索引を再構築します(また、使用不能になっている場合は使用可能にします)。

EXECUTE SEM_APIS.ALTER_SEM_INDEX_ON_ENTAILMENT('rdfs_rix_family', 'pscm', 'rebuild');

SEM_APIS.ALTER_SEM_INDEX_ON_MODEL

書式

SEM_APIS.ALTER_SEM_INDEX_ON_MODEL(

model_name IN VARCHAR2,

index_code IN VARCHAR2,

command IN VARCHAR2,

tablespace_name IN VARCHAR2 DEFAULT NULL,

use_compression IN BOOLEAN DEFAULT NULL,

parallel IN NUMBER(38) DEFAULT NULL,

online IN BOOLEAN DEFAULT FALSE);

説明

モデルのセマンティク・ネットワーク索引を変更します。

パラメータ

model_name

モデルの名前。

index_code

索引コード文字列。

command

次のいずれかのコマンドを含む文字列値です(REBUILDを指定すると、モデルのセマンティク・ネットワーク索引を再構築し、UNUSABLEを指定すると、モデルのセマンティク・ネットワーク索引を使用不能としてマークします)。このパラメータの値には、大/小文字の区別がありません。

tablespace_name

再構築操作先の表領域の名前。

use_compression

索引を再構築する場合に圧縮を使用するかどうかを指定します。

parallel

操作に関連付けられている並列度。パラレル実行の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

online

TRUEに設定すると、索引の再構築時に索引に影響を与えるDML操作が許可され、FALSE (デフォルト)に設定すると、索引の再構築時に索引に影響を与えるDML操作は許可されません。

使用方法

セマンティク・ネットワーク索引の詳細は、1.8項を参照してください。

例

次の例では、モデルfamilyのセマンティク・ネットワーク索引を再構築します(また、使用不能になっている場合は使用可能にします)。

EXECUTE SEM_APIS.ALTER_SEM_INDEX_ON_MODEL('family', 'pscm', 'rebuild');

SEM_APIS.ANALYZE_ENTAILMENT

書式

SEM_APIS.ANALYZE_ENTAILMENT(

entailment_name IN VARCHAR2,

estimate_percent IN NUMBER DEFAULT to_estimate_percent_type (get_param('ESTIMATE_PERCENT')),

method_opt IN VARCHAR2 DEFAULT get_param('METHOD_OPT'),

degree IN NUMBER DEFAULT to_degree_type(get_param('DEGREE')),

cascade IN BOOLEAN DEFAULT to_cascade_type(get_param('CASCADE')),

no_invalidate IN BOOLEAN DEFAULT to_no_invalidate_type (get_param('NO_INVALIDATE')),

force IN BOOLEAN DEFAULT FALSE);

説明

指定された伴意(ルール索引)の統計を収集します。

パラメータ

entailment_name

伴意の名前。

estimate_percent

伴意の情報を含む内部表パーティション内の、評価される行の割合(NULLは計算を意味します)。有効なレンジは、[0.000001,100]です。定数DBMS_STATS.AUTO_SAMPLE_SIZEを使用すると、有効な統計を生成するための適切なサンプル・サイズがOracleにより決定されます。これが通常のデフォルトです。

method_opt

伴意の情報を含む内部表パーティションに対して、次のいずれかのオプション(または両方の組合せ)を受け入れます。

- FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]

- FOR COLUMNS [size clause] column|attribute [size_clause] [,column|attribute [size_clause]...]

size_clauseは、size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}として定義されます。

columnは、column := column_name | (extension)として定義されます。

- integer: ヒストグラム・バケットの数。レンジ[1,254]内の数にする必要があります。
- REPEAT: すでにヒストグラムが存在する列のみについてヒストグラムを収集します。
- AUTO: Oracleにより、列のデータ配分とワークロードに基づいて、ヒストグラムを収集する列が決定されます。
- SKEWONLY: Oracleにより、列のデータ配分に基づいて、ヒストグラムを収集する列が決定されます。
- column_name: 列の名前。
- extension: (column_name, column_name [, ...])という書式の列グループ、または式。
通常のデフォルトは、FOR ALL COLUMNS SIZE AUTOです。

degree

伴意の情報を含む内部表パーティションの並列度。degreeの通常のデフォルトは、NULLであり、CREATE TABLEまたはALTER TABLE文のDEGREE句により指定された表デフォルト値が使用されます。初期化パラメータに基づくデフォルト値を指定するには、定数DBMS_STATS.DEFAULT_DEGREEを使用します。AUTO_DEGREE値を指定すると、並列度が自動的に決定されます。オブジェクトのサイズに応じて、1 (シリアル実行)またはDEFAULT_DEGREE (CPUおよび初期化パラメータの数に基づくシステム・デフォルト値)のいずれかになります。

cascade

伴意の情報を含む内部表パーティションの索引に関する統計を収集します。定数DBMS_STATS.AUTO_CASCADEを使用すると、索引統計を収集するかどうかがOracleにより決定されます。これが通常のデフォルトです。

no_invalidate

TRUEに設定した場合、依存カーソルは無効化されません。FALSEに設定した場合、依存カーソルは即時に無効化されます。DBMS_STATS.AUTO_INVALIDATE.を使用すると、従属カーソルを無効化するかどうかがOracleにより決定されます。これが通常のデフォルトです。

force

TRUEに設定すると、伴意がロックされている場合でも統計が収集され、FALSE (デフォルト)に設定すると、伴意がロックされている場合は統計が収集されません。

使用方法

クラスタ、ドメインおよび結合索引を除いて、索引統計コレクションはパラレル化できます。

このプロシージャは、伴意の情報を含む内部表パーティションの統計を収集するDBMS_STATS.GATHER_TABLE_STATSプロシージャを内部的にコールします。DBMS_STATS.GATHER_TABLE_STATSプロシージャについては、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

伴意の詳細は、1.3.7項を参照してください。

例

次の例では、rdfs_rix_familyという名前の伴意の統計を収集します。

EXECUTE SEM_APIS.ANALYZE_ENTAILMENT('rdfs_rix_family');

SEM_APIS.ANALYZE_MODEL

書式

SEM_APIS.ANALYZE_MODEL(

model_name IN VARCHAR2,

estimate_percent IN NUMBER DEFAULT to_estimate_percent_type (get_param('ESTIMATE_PERCENT')),

method_opt IN VARCHAR2 DEFAULT get_param('METHOD_OPT'),

degree IN NUMBER DEFAULT to_degree_type(get_param('DEGREE')),

cascade IN BOOLEAN DEFAULT to_cascade_type(get_param('CASCADE')),

no_invalidate IN BOOLEAN DEFAULT to_no_invalidate_type (get_param('NO_INVALIDATE')),

force IN BOOLEAN DEFAULT FALSE);

説明

指定されたモデルのオプティマイザ統計を収集します。

パラメータ

model_name

モデルの名前。

estimate_percent

モデルの情報を含む内部表パーティション内の、評価される行の割合(NULLは計算を意味します)。有効なレンジは、[0.000001,100]です。定数DBMS_STATS.AUTO_SAMPLE_SIZEを使用すると、有効な統計を生成するための適切なサンプル・サイズがOracleにより決定されます。これが通常のデフォルトです。

method_opt

モデルの情報を含む内部表パーティションに対して、次のいずれかのオプション(または両方の組合せ)を受け入れます。

- FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]

- FOR COLUMNS [size clause] column|attribute [size_clause] [,column|attribute [size_clause]...]

size_clauseは、size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}として定義されます。

columnは、column := column_name | (extension)として定義されます。

- integer: ヒストグラム・バケットの数。レンジ[1,254]内の数にする必要があります。
- REPEAT: すでにヒストグラムが存在する列のみについてヒストグラムを収集します。
- AUTO: Oracleにより、列のデータ配分とワークロードに基づいて、ヒストグラムを収集する列が決定されます。
- SKEWONLY: Oracleにより、列のデータ配分に基づいて、ヒストグラムを収集する列が決定されます。
- column_name: 列の名前。
- extension: (column_name, column_name [, ...])という書式の列グループ、または式。
通常のデフォルトは、FOR ALL COLUMNS SIZE AUTOです。

degree

モデルの情報を含む内部表パーティションの並列度。degreeの通常のデフォルトは、NULLであり、CREATE TABLEまたはALTER TABLE文のDEGREE句により指定された表デフォルト値が使用されます。初期化パラメータに基づくデフォルト値を指定するには、定数DBMS_STATS.DEFAULT_DEGREEを使用します。AUTO_DEGREE値を指定すると、並列度が自動的に決定されます。オブジェクトのサイズに応じて、1 (シリアル実行)またはDEFAULT_DEGREE (CPUおよび初期化パラメータの数に基づくシステム・デフォルト値)のいずれかになります。

cascade

モデルの情報を含む内部表パーティションの索引に関する統計を収集します。定数DBMS_STATS.AUTO_CASCADEを使用すると、索引統計を収集するかどうかがOracleにより決定されます。これが通常のデフォルトです。

no_invalidate

TRUEに設定した場合、依存カーソルは無効化されません。FALSEに設定した場合、依存カーソルは即時に無効化されます。DBMS_STATS.AUTO_INVALIDATE.を使用すると、従属カーソルを無効化するかどうかがOracleにより決定されます。これが通常のデフォルトです。

force

TRUEに設定すると、モデルがロックされている場合でも統計が収集され、FALSE (デフォルト)に設定すると、モデルがロックされている場合は統計が収集されません。

使用方法

クラスタ、ドメインおよび結合索引を除いて、索引統計コレクションはパラレル化できます。

このプロシージャは、モデルに関する情報を含む内部表パーティションのオプティマイザ統計を収集するDBMS_STATS.GATHER_TABLE_STATSプロシージャを内部的にコールします。DBMS_STATS.GATHER_TABLE_STATSプロシージャについては、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

例

次の例では、セマンティク・モデルfamilyの統計を収集します。

EXECUTE SEM_APIS.ANALYZE_MODEL('family');

SEM_APIS.BULK_LOAD_FROM_STAGING_TABLE

書式

SEM_APIS.BULK_LOAD_FROM_STAGING_TABLE(

model_name IN VARCHAR2,

table_owner IN VARCHAR2,

table_name IN VARCHAR2,

flags IN VARCHAR2 DEFAULT NULL,

debug IN INTEGER DEFAULT NULL,

start_comment IN VARCHAR2 DEFAULT NULL,

end_comment IN VARCHAR2 DEFAULT NULL);

説明

ステージング表からセマンティク・データをロードします。

パラメータ

model_name

モデルの名前。

table_owner

ロードされるセマンティク・データを保持するステージング表を所有するスキーマの名前。

table_name

ロードされるセマンティク・データを保持するステージング表の名前。

flags

次のキーワード指定が1つ以上含まれる、引用符で囲んだオプションの文字列。

- COLLECT_PRELOAD_STATS=<scope>、ここで<scope>は、VALUES_ONLY、MODEL_ONLY、VALUES_AND_MODELまたはNONE (デフォルト)を指定でき、データをロードする前に、RDF_VALUE$またはターゲットRDFモデルあるいはその両方の統計の収集を実行します。(NONEを指定すると統計の収集を実行しません。)

- <stats_scope>_<stats_param>=<number>、ここで、
<stats_scope>は、STATS、STATS_VALUES、STATS_BATCH_VALUES、STATS_MODELおよびSTATS_BATCH_TRIPLESのいずれかで、それぞれは、デフォルト、RDF_VALUE$表、バッチ値表、ターゲットRDFモデルおよびバッチ・トリプル表に対応しています。

<stats_param>は、MIN_CNT、MIN_PCTおよびEST_PCTのいずれかです。MIN_CNTは、実行する統計の収集に追加される値の最小カウントを示します。MIN_PCTは、実行する統計の収集に追加される必要のある値またはトリプルの元のカウントの最小パーセントを示します。EST_PCTは、統計の収集に使用されるestimate_percent (DBMS_STATSパッケージのサブプログラムで使用)です。これらのキーワードをどれも指定しない場合、いくつかの内部デフォルト値がこれらのしきい値として使用されます。

- DEL_BATCH_DUPS=USE_INSERTを指定すると、挿入に基づく重複除去方法を使用できるため、入力データに多くの重複が含まれている場合に処理がより高速になる可能性があります。

- MBV_METHOD=SHADOWを指定すると、異なる値をロードする方法を使用できるため、大量のロード処理がより高速になる可能性があります。

- PARALLEL=<integer>を指定すると、バルク・ロード中に使用される処理のほとんどを、指定した、操作に関連付けられている並列度を使用してパラレルに実行できます。このキーワードを使用することによって、セッションのパラレルDML、DDLおよび問合せを自動的に実行できます。並列度を指定しない場合は、自動的に決定されます。

- PARSEを指定すると、ステージング表から取得されるトリプルを解析できます(グラフ名を含むトリプルも解析できます)。

- <task>_JOIN_HINT=<join_type>。<task>は、バルク・ロード中に実行される内部タスクで、IZC(ゼロ衝突)、MBV(バッチ値をマージ)またはMBT(バッチ・トリプルをマージ、トリプルを空でないモデルに追加するときに使用される)のいずれかです。<join_type>は、USE_NLまたはUSE_HASHです。

debug

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

start_comment

ロード操作の開始についてのオプションのコメント。

end_comment

ロード操作の終了についてのオプションのコメント。

使用方法

このプロシージャをコールする前に、ステージング表にセマンティク・データをロードする必要があります。詳細は、1.7.1項を参照してください。

BULK_LOAD_FROM_STAGING_TABLEとファイングレイン・アクセス制御(VPDおよびOLS)の併用

VPDを使用する特定のモデルに対して、またはOLSを使用するネットワーク全体に対して、ファイングレイン・アクセス制御(第5章を参照)が有効な場合、関連ポリシーへの完全なアクセス権限を持つユーザーのみがバルク・ロード操作を実行できます。VPDポリシー(5.1.1項を参照)に関連付けられる名前空間に対して、パッケージ定数sem_rdfsa.VPD_FULL_ACCESSによって1に定義されるコンテキスト属性を設定することで、VPDポリシーへの完全なアクセス権限が付与されます。OLSが有効な場合、OLSポリシーへの完全なアクセス権限は、SA_USER_ADMIN.SET_USER_PRIVSプロシージャを使用して付与されます。

VPDが有効になっているモデルにロードされるデータは、すぐにアクセス可能になり、いかなるメンテナンス操作も必要ありません。ただし、OLSが使用されている場合、RDFトリプルを格納する表のラベル列は保持する必要があります。デフォルトでは、OLSを有効にしている場合、RDFトリプルを格納する表のラベル列はNULLに設定されます。完全なアクセス権限がある場合、適切なサブプログラム(SEM_RDFSA.SET_RESOURCE_LABELおよびSEM_RDFSA.SET_PREDICATE_LABEL)を使用して、新しく挿入されたトリプルおよびトリプルの新しいバッチで導入されたすべてのリソースのラベルをリセットできます。

オプションで、ステージング表とアプリケーション表にRDF$STC_CTXT1という数値列を定義し、データが目的のモデルにロードされる前にトリプルの機密性ラベルを割り当てることができます。このようなラベルは、MDSYS.RDF_LINK$表に格納される、対応するトリプルに、自動的に適用されます。新しく導入されたリソースのラベルはロードの前または後にまだ個別に適用する必要がある場合があり、システムはバルク・ロード操作の間、割り当てられるラベルを検証しません。

アプリケーション表のRDF$STC_CTXT1列は重要ではなく、バルク・ロード操作の後に削除される場合があります。

例

次の例では、スキーマSCOTTのステージング表STAGE_TABLEに格納されたセマンティク・データをセマンティク・モデルfamilyにロードします。

EXECUTE SEM_APIS.BULK_LOAD_FROM_STAGING_TABLE('family', 'scott', 'stage_table', flags => 'PARSE');

SEM_APIS.CLEANUP_FAILED

書式

SEM_APIS.CLEANUP_FAILED(

rdf_object_type IN VARCHAR2,

rdf_object_name IN VARCHAR2);

説明

指定したルールベースまたは伴意が失敗の状態にある場合、それらを削除します。

パラメータ

rdf_object_type

RDFオブジェクトのタイプです(RULEBASE(ルールベースの場合)またはRULES_INDEX(伴意(ルール索引)の場合))。

rdf_object_name

rdf_object_typeタイプのRDFオブジェクトの名前。

使用方法

このプロシージャは、指定したRDFオブジェクトが失敗の状態にあるかどうかをチェックし、オブジェクトが失敗の状態にある場合、プロシージャはそのオブジェクトを削除します。

ルールベースまたは伴意が失敗の状態になるのは、そのオブジェクトの作成中にシステム障害が発生した場合です。ルールベースまたは伴意が失敗の状態にあるかどうかをチェックするには、それぞれSDO_RULEBASE_INFOビュー(1.3.6項を参照)またはSDO_RULES_INDEX_INFOビュー(1.3.7項を参照)のSTATUS列の値がFAILEDであるかどうかを確認します。

ルールベースまたは伴意が失敗の状態にない場合、このプロシージャは何のアクションも実行せず、成功のステータスを戻します。

RDFオブジェクトが現在使用されている場合、例外が生成されます。

例

次の例では、ルールベースfamily_rbが失敗の状態にある場合にのみ、そのルールベースを削除します。

EXECUTE SEM_APIS.CLEANUP_FAILED('RULEBASE', 'family_rb');

SEM_APIS.COMPOSE_RDF_TERM

書式

SEM_APIS.COMPOSE_RDF_TERM(

value_name IN VARCHAR2,

value_type IN VARCHAR2,

literal_type IN VARCHAR2,

language_type IN VARCHAR2

) RETURN VARCHAR2;

または

SEM_APIS.COMPOSE_RDF_TERM(

value_name IN VARCHAR2,

value_type IN VARCHAR2,

literal_type IN VARCHAR2,

language_type IN VARCHAR2,

long_value IN CLOB,

options IN VARCHAR2 DEFAULT NULL,

) RETURN CLOB;

説明

指定したパラメータを使用してRDF語句を作成して戻します。

パラメータ

value_name

値名。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_NAME列の値またはSEM_MATCHテーブル・ファンクションから戻されたvar属性の値と一致している必要があります。

value_type

テキスト情報のタイプ。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_TYPE列の値またはSEM_MATCHテーブル・ファンクションから戻されたvar$RDFVTYP属性の値と一致している必要があります。

literal_type

型付きリテラルの場合は型情報、それ以外の場合はNULL。またはNULL値であるか、またはMDSYS.RDF_VALUE$表(1.3.2項を参照)のLITERAL_TYPE列の値またはSEM_MATCHテーブル・ファンクションから戻されたvar$RDFLTYP属性の値と一致している必要があります。

language_type

言語タグ。MDSYS.RDF_VALUE$表(1.3.2項を参照)のLANGUAGE_TYPE列の値またはSEM_MATCHテーブル・ファンクションから戻されたvar$RDFLANG属性の値と一致している必要があります。

long_value

字句の値の長さが4000バイトを超える場合の文字列。MDSYS.RDF_VALUE$表(1.3.2項を参照)のLONG_VALUE列の値、またはSEM_MATCHテーブル・ファンクションから戻されたvar$RDFCLOB属性の値と一致している必要があります。

options

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

使用方法

一貫性のない値の組合せをパラメータに指定すると、このファンクションはNULL値を戻します。NULL値が戻されても、パラメータの値が適切である(MDSYS.RDF_VALUE$表の同じ行の列、または同じ変数のSEM_MATCH問合せの列を反映している)と思われる場合は、Oracleサポートまでご連絡ください。

例

次の例では、身長がわかっている家族のメンバーごとに、身長のRDF語句だけでなく身長の値部分も戻します。

SELECT x, SEM_APIS.COMPOSE_RDF_TERM(h, h$RDFVTYP, h$RDFLTYP, h$RDFLANG)
h_rdf_term, h
FROM TABLE(SEM_MATCH(
'{?x :height ?h}',
SEM_Models('family'),
null,
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null))
ORDER BY x;
X
--------------------------------------------------------------------------------
H_RDF_TERM
--------------------------------------------------------------------------------
H
--------------------------------------------------------------------------------
http://www.example.org/family/Cathy
"5.8"^^<http://www.w3.org/2001/XMLSchema#decimal>
5.8

http://www.example.org/family/Cindy
"6"^^<http://www.w3.org/2001/XMLSchema#decimal>
6

http://www.example.org/family/Jack
"6"^^<http://www.w3.org/2001/XMLSchema#decimal>
6

http://www.example.org/family/Tom
"5.75"^^<http://www.w3.org/2001/XMLSchema#decimal>
5.75

4 rows selected.

次の例では、MDSYS.RDF_VALUE$表に格納されている値のRDF語句を戻します。

SELECT SEM_APIS.COMPOSE_RDF_TERM(value_name, value_type, literal_type,
language_type)
FROM MDSYS.RDF_VALUE$ WHERE ROWNUM < 5;

SEM_APIS.COMPOSE_RDF_TERM(VALUE_NAME,VALUE_TYPE,LITERAL_TYPE,LANGUAGE_TYPE)
--------------------------------------------------------------------------------
<http://www.w3.org/1999/02/22-rdf-syntax-ns#object>
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
<http://www.w3.org/1999/02/22-rdf-syntax-ns#subject>
<http://www.w3.org/1999/02/22-rdf-syntax-ns#Property>

SEM_APIS.CREATE_ENTAILMENT

書式

SEM_APIS.CREATE_ENTAILMENT(

entailment_name_in IN VARCHAR2,

models_in IN SEM_MODELS,

rulebases_in IN SEM_RULEBASES,

passes IN NUMBER DEFAULT SEM_APIS.REACH_CLOSURE,

inf_components_in IN VARCHAR2 DEFAULT NULL,

options IN VARCHAR2 DEFAULT NULL,

delta_in IN SEM_MODELS DEFAULT NULL,

label_gen IN RDFSA_LABELGEN DEFAULT NULL,

include_named_g IN SEM_GRAPHS DEFAULT NULL,

include_default_g IN SEM_MODELS DEFAULT NULL,

include_all_g IN SEM_MODELS DEFAULT NULL,

inf_ng_name IN VARCHAR2 DEFAULT NULL);

説明

OWLまたはRDFS推論を実行する(およびオプションでユーザー定義ルールを使用する)際に使用できる伴意(ルール索引)を作成します。

パラメータ

entailment_name_in

作成する伴意の名前。

models_in

1つ以上のモデル名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。

rulebases_in

1つ以上のルールベース名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_RULEBASESです。ルールおよびルールベースの詳細は、1.3.6項を参照してください。

passes

推論エンジンを実行する回数。デフォルト値はSEM_APIS.REACH_CLOSUREであり、推論エンジンは閉包に到達するまで実行されます。指定した実行回数が、閉包に到達するのに必要な実際の実行回数より少ない場合、伴意のステータスはINCOMPLETEに設定されます。

inf_components_in

選択的またはコンポーネント・ベースの推論を実行する場合の推論コンポーネントを示すキーワードのカンマ区切りの文字列。このパラメータがNULLの場合、推論コンポーネントのデフォルト・セットが使用されます。推論コンポーネントの詳細は、「使用方法」を参照してください。

options

デフォルトの推論動作を上書きして推論プロセスを制御するためのオプションのカンマ区切りの文字列。オプションを有効化するには、option-name=Tを指定し、オプションを無効化するには、option-name=Fを指定します(デフォルト)。使用可能なoption-nameの値は、COL_COMPRESS、DEST_MODEL、DISTANCE,DOP、ENTAIL_ANYWAY、HASH_PART、INC、LOCAL_NG_INF、OPT_SAMEAS、RAW8、PROOFおよびUSER_RULESです。各値の詳細は、「使用方法」を参照してください。

delta_in

増分推論が有効な場合は、増分推論を実行する1つ以上のモデルを指定します。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。

delta_in内の最初のモデルのトリプルがmodels_in内の最初のモデルにコピーされ、rules_index_in内の伴意(ルール索引)が更新され、次に、delta_in内の2番目のモデルのトリプル(存在する場合)がmodels_in内の2番目のモデル(存在する場合)にコピーされ、rules_index_in内の伴意が更新されるというように、すべてのトリプルがコピーされ、伴意が更新されるまで続きます。(増分推論が伴意で有効にされていない場合、delta_inパラメータは無効です。)

label_gen

MDSYS.RDFSA_LABELGENのインスタンスまたはそのサブタイプで、推論されたトリプルに対するOracle Label Security (OLS)ラベルの生成の論理を定義します。このパラメータに何を指定するかは、デフォルトのラベル・ジェネレータまたはカスタム・ラベル・ジェネレータを使用するかどうかによって応じて異なります。

- デフォルトのラベル・ジェネレータを使用する場合は、SEM_RDFSA.LABELGEN_RULE((ルール・ラベルの使用の場合)、SEM_RDFSA.LABELGEN_SUBJECT(主語ラベルの使用の場合)、SEM_RDFSA.LABELGEN_PREDICATE(述語ラベルの使用の場合)、SEM_RDFSA.LABELGEN_OBJECT(目的語ラベルの使用の場合)、SEM_RDFSA.LABELGEN_DOMINATING(優位ラベルの使用の場合)、SEM_RDFSA.LABELGEN_ANTECED(前件ラベルの使用の場合)のいずれかを指定します。各定数の詳細は、5.2.2.4項を参照してください。

- カスタム・ラベル・ジェネレータを使用する場合、カスタム・ラベル・ジェネレータ・タイプを指定します。カスタム・ラベル・ジェネレータの作成および実装の詳細は、5.2.2.5項を参照してください。

include_named_g

(すべてのソース・モデル全体で)指定された名前付きグラフからのすべてのトリプルを、名前付きグラフ・ベースのグローバル推論(NGGI、2.2.11.1項を参照)に加えます。たとえばinclude_named_g => sem_graphs('<urn:G1>','<urn:G2>')は、名前付きグラフG1およびG2からのトリプルがNGGIに含められることを意味します。

このデータ型はSEM_GRAPHSで、TABLE OF VARCHAR2(4000)という定義を持ちます。

include_default_g

指定されたモデルのグラフ名がNULLであるすべてのトリプルを、名前付きグラフ・ベースのグローバル推論(NGGI、2.2.11.1項を参照)に加えます。たとえば、include_default_g => sem_models('m1')は、モデルM1からのグラフ名がNULLであるすべてのトリプルをNGGIに含めます。

include_all_g

指定されたモデルのグラフ名の値にかかわらず、すべてのトリプルを、名前付きグラフ・ベースのグローバル推論(NGGI、2.2.11.1項を参照)に加えます。たとえば、include_all_g => sem_models('m2')は、モデルM2のすべてのトリプルをNGGIに含めます。

inf_ng_name

名前付きグラフ・ベースのグローバル推論(NGGI、2.2.11.1項を参照)で推論された新しいトリプルすべてに、指定されたグラフ名を割り当てます。

使用方法

inf_components_inパラメータには、次のキーワードの任意の組合せを指定できます。SCOH、COMPH、DISJH、SYMMH、INVH、SPIH、MBRH、SPOH、DOMH、RANH、EQCH、EQPH、FPH、IFPH、DOM、RAN、SCO、DISJ、COMP、INV、SPO、FP、IFP、SYMM、TRANS、DIF、SAM、CHAIN、HASKEY、ONEOF、INTERSECT、INTERSECTSCOH、MBRLST、PROPDISJH、SKOSAXIOMS、SNOMED、SVFH、THINGH、THINGSAM、UNION、RDFP1、RDFP2、RDFP3、RDFP4、RDFP6、RDFP7、RDFP8AX、RDFP8BX、RDFP9、RDFP10、RDFP11、RDFP12A、RDFP12B、RDFP12C、RDFP13A、RDFP13B、RDFP13C、RDFP14A、RDFP14BX、RDFP15、RDFP16、RDFS2、RDFS3、RDFS4a、RDFS4b、RDFS5、RDFS6、RDFS7、RDFS8、RDFS9、RDFS10、RDFS11、RDFS12、RDFS13。これらのキーワードの意味の説明は、キーワードのアルファベット順のリストである表9-1を参照してください。

OWLPrimeボキャブラリの推論コンポーネントのデフォルト・セットには、SCOH、COMPH、DISJH、SYMMH、INVH、SPIH、SPOH、DOMH、RANH、EQCH、EQPH、FPH、IFPH、SAMH、DOM、RAN、SCO、DISJ、COMP、INV、SPO、FP、IFP、SYMM、TRANS、DIF、RDFP14A、RDFP14BX、RDFP15、RDFP16が含まれます。ただし、次の点にも注意してください。

- コンポーネントSAMは、一部のオントロジで多数の新規トリプルを生成することが多いため、このデフォルトのOWLPrimeリストには含まれません。

- リリース11.2では、ネイティブOWL推論エンジンにより、次の新しい推論コンポーネントであるCHAIN、HASKEY、INTERSECT、INTERSECTSCOH、MBRLST、ONEOF、PROPDISJH、SKOSAXIOMS、SNOMED、SVFH、THINGH、THINGSAM、UNIONがサポートされています。ただし、下位互換のために、OWLPrimeルールベースや既存のルールベースには、デフォルトでは前述の新しいコンポーネントは含まれていないため、これらの新しいコンポーネントを使用するには、明示的に設定する必要があります(これらを表9-1に示します)。次の例では、OWLPrime伴意がLUBMとUNIVという2つのOWLオントロジ向けに作成されます。追加の推論コンポーネントの指定により、この伴意には、それらの推論コンポーネントによって導入された新しいセマンティクが含まれるようになります。

EXECUTE sem_apis.create_entailment('lubm1000_idx',sem_models('lubm','univ'),
sem_rulebases('owlprime'), SEM_APIS.REACH_CLOSURE,
'INTERSECT,INTERSECTSCOH,SVFH,THINGH,THINGSAM,UNION');

表9-1 inf_components_inパラメータの推論キーワード

キーワード

説明

CHAIN

OWL 2で定義されるプロパティ・チェーン・セマンティクを取得します。長さが2のチェーンのみがサポートされます。デフォルトでは、これはSKOSCOREルールベースに含まれています。サブプロパティ・チェーンはOWL 2の機能であり、下位互換性を確保するため、このコンポーネントはデフォルトではOWLPrimeルールベースに含まれていません。(プロパティ・チェーンの処理の詳細は、3.2.2項を参照してください。)(リリース11.2の新機能。)

COMPH

owl:complementOf表明、およびowl:complementOfと他の言語構成要素との相互作用に基づいて推論を実行します。

DIF

owl:differentFromの対称性に基づいてowl:differentFrom表明を生成します。

DISJ

owl:disjointWith表明を使用してインスタンス・レベルでowl:differentFrom関係を推論します。

DISJH

owl:disjointWith表明、および他の言語構成要素との相互作用に基づいて推論を実行します。

DOM

RDFS2に基づいて推論を実行します。

DOMH

rdfs:domain表明、および他の言語構成要素との相互作用に基づいて推論を実行します。

EQCH

owl:equivalentClassに関連する推論を実行します。

EQPH

owl:equivalentPropertyに関連する推論を実行します。

FP

owl:FunctionalPropertyのインスタンスを使用してインスタンス・レベルの推論を実行します。

FPH

owl:FunctionalPropertyのインスタンスを使用して推論を実行します。

HASKEY

OWL 2で定義された「キー」の背後にあるセマンティクを網羅します。OWL 2では、プロパティのコレクションをクラス式のキーとして処理されます。効率を考慮して、コレクションのサイズは3以下にしてください。(リリース11.2の新機能。)

IFP

owl:InverseFunctionalPropertyのインスタンスを使用してインスタンス・レベルの推論を実行します。

IFPH

owl:InverseFunctionalPropertyのインスタンスを使用して推論を実行します。

INTERSECT

owl:intersectionOfのコア・セマンティクを処理します。たとえば、クラスCがC1、C2およびC3の積集合の場合、CはC1、C2およびC3のサブクラスです。また、C1、C2およびC3すべての共通インスタンスは、Cのインスタンスでもあります。(リリース11.2の新機能。)

INTERSECTSCOH

積集合は最大の共通サブセットであるということを処理します。たとえば、クラスCがクラスC1、C2およびC3の積集合である場合は、C1、C2およびC3すべての任意の共通サブクラスはCのサブクラスです。(リリース11.2の新機能。)

INV

owl:inverseOf表明を使用してインスタンス・レベルの推論を実行します。

INVH

owl:inverseOf表明、および他の言語構成要素との相互作用に基づいて推論を実行します。

MBRLST

どのリソースにおいても、skos:memberListプロパティの値として与えられるリストの各項目はskos:memberプロパティの値でもあるというセマンティクを取得します。(SKOSの詳細な指定のS36を参照してください。)デフォルトでは、これはSKOSCOREルールベースに含まれています。(リリース11.2の新機能。)

ONEOF

列挙クラスの定義に基づいて、分類表明を生成します。OWLでは、クラス拡張をowl:oneOfコンストラクタで明示的に列挙できます。(リリース11.2の新機能。)

PROPDISJH

owl:propertyDisjointWithとrdfs:subPropertyOfの積集合を取得します。デフォルトでは、これはSKOSCOREルールベースに含まれています。propertyDisjointWithはOWL 2の機能であり、下位互換性を確保するため、このコンポーネントはデフォルトではOWLPrimeルールベースに含まれていません。(リリース11.2の新機能。)

RANH

rdfs:range表明、および他の言語構成要素との相互作用に基づいて推論を実行します。

RDFP*

(接頭辞RDFP付きのコンポーネントに対応するルールの詳細は、『Completeness, decidability and complexity of entailment for RDF Schema and a semantic extension involving the OWL vocabulary』(H.J. Horst)を参照してください。)

RDFS2, ...RDFS13

RDFS2、RDFS3、RDFS4a、RDFS4b、RDFS5、RDFS6、RDFS7、RDFS8、RDFS9、RDFS10、RDFS11、RDFS12およびRDFS13の詳細は、http://www.w3.org/TR/rdf-mt/にある「RDF Semantics」の7.3項を参照してください。RDFSコンポーネントの多くは、OWL推論とは無関係です。

SAM

各個体およびowl:sameAsの既存の表明に基づいてそれらの個体に関する推論を実行します。

SAMH

owl:sameAsの推移性および対称性を使用してowl:sameAs表明を推論します。

SCO

RDFS9に基づいて推論を実行します。

SCOH

既存のrdfs:subClassOf表明に基づいてsubClassOf階層を生成します。基本的には、推移性に基づいてC1 rdfs:subClassOf C2およびC2 rdfs:subClassOf C3からC1 rdfs:subClassOf C3が推論されます。SCOHは、RDFS11の別名でもあります。

SKOSAXIOMS

SKOSの詳細な指定で定義されるほとんどの公理を取得します。デフォルトでは、これはSKOSCOREルールベースに含まれています。(リリース11.2の新機能。)

SNOMED

最も表現が多様で複雑な医学用語集の1つであるSNOMED CT (Systematized Nomenclature of Medicine - Clinical Terms)の表現を取得する、OWL 2 ELプロファイルのセマンティクに基づいて推論を実行します。(リリース11.2の新機能。)

SPIH

rdfs:subPropertyOf表明とowl:inverseOf表明間の相互作用に基づいて推論を実行します。

SPO

RDFS7に基づいて推論を実行します。

SPOH

rdfs:subPropertyOfの推移性に基づいてrdfs:subPropertyOf階層を生成します。これは、RDFS5の別名です。

SVFH

owl:someValuesFromとrdfs:subClassOf間の相互作用に関する次のセマンティクを処理します。同じ制限プロパティをどちらも使用する2つの存在する制限クラスC1およびC2を考えてみます。さらにC1のowl:someValuesFrom制約クラスが、C2のその制約クラスのサブクラスであるとします。これによって、C1はC2のサブクラスとして推論できます。(リリース11.2の新機能。)

SYMM

owl:SymmetricPropertyのインスタンスを使用してインスタンス・レベルの推論を実行します。

SYMH

owl:SymmetricPropertyタイプのプロパティに関する推論を実行します。

THINGH

すべての定義済OWLクラスがowl:Thingのサブクラスであるというセマンティクを処理します。このルールの結果、すべての定義済OWLクラスのインスタンスはowl:Thingのインスタンスになります。推論されたグラフのサイズは、このコンポーネントが選択されたことで、より大きくなる可能性があります。(リリース11.2の新機能。)

THINGSAM

owl:Thingのインスタンスは(owl:sameAs)自身と等価であるというセマンティクを処理します。このコンポーネントは、一部のアプリケーションの利便性のために提供されます。アプリケーションでは、この推論コンポーネントを選択して個体がそれ自身と等価であることがわかるようにする必要はありません(この種の情報はアプリケーション・ロジックで簡単に構築できます)。(リリース11.2の新機能。)

TRANS

owl:TransitivePropertyのインスタンスの推移閉包を計算します。

UNION

owl:unionOf構成要素のコア・セマンティクを取得します。基本的に、unionクラスは、すべてのメンバー・クラスのスーパークラスです。下位互換性を確保するため、このコンポーネントはデフォルトではOWLPrimeルールベースに含まれていません。(リリース11.2の新機能。)

コンポーネントを選択解除するには、コンポーネント名の次にマイナス記号(-)を付けます。たとえば、SCOH-と指定すると、subClassOf階層の推論が選択解除されます。

optionsパラメータでは、次のオプションを有効化してデフォルトの推論動作を上書きできます。

- COL_COMPRESS=Tは一時的な、中間作業表を作成します。このオプションは、このような表に必要となる領域を減らすことができ、大規模なデータセットのCREATE_ENTAILMENT操作のパフォーマンスを向上できます。

注意:
COL_COMPRESS=Tは、Hybrid Columnar Compression (HCC)をサポートするシステムでのみ指定できます。HCCの詳細は、『Oracle Database概要』を参照してください。

- DEST_MODEL=<model_name>は、増分推論のために、1つ以上のdelta_inモデルが追加される宛先モデルを指定します。指定する宛先モデルは、models_inパラメータで指定するモデルの1つである必要があります。

- DISTANCE=Tは、セマンティク演算子に有効な補助的距離情報を生成します。

- DOP=nは、推論パフォーマンスを向上できるパラレル推論の並列度を指定します。パラレル推論の詳細は、2.2.10項を参照してください。

- ENTAIL_ANYWAY=Tは、伴意のステータスが有効の場合、OWL推論を強制的に続行し、既存の推論データ(伴意)を再利用します。デフォルトでは、モデルとルールベースの組合せに対して有効な伴意がすでに存在する場合、SEM_APIS.CREATE_ENTAILMENTは即座に終了します。

- HASH_PART=nは、内部の作業表に、指定された数のハッシュ・パーティションを作成します。(この数は、2、4、8、16、32など、2の累乗値である必要があります。)セマンティク・データ・モデルに、異なる述語が多くある場合には、値を指定できます。ベンチマーク・オントロジのOracle内部のテストで、HASH_PART=32は適切に動作しました。

- INC=Tは、伴意に対して増分推論を有効にします。増分推論の詳細は、2.2.9項を参照してください。

- LOCAL_NG_INF=Tは、名前付きグラフ・ベースのグローバル推論(NGGI)のかわりに名前付きグラフ・ベースのローカル推論(NGLI)が使用されるようにします。NGLIの詳細は、2.2.11.2項を参照してください。

- OPT_SAMEAS=Tは、伴意に、統合されたowl:sameAs伴意を使用します。このオプションを指定する場合、PROOF=Tは指定できません。owl:sameAs推論の最適化の詳細は、2.2.8項を参照してください。

- RAW8=Tは、補助推論表にRAW8データ型を使用します。このオプションによって、状況によっては最大で30%伴意パフォーマンスが向上する可能性があります。

- PROOF=T: 推論されたトリプルの証明を生成します。生成されるデータが多くなり、推論パフォーマンスが低下するため、必要のない場合はこのオプションを指定しないでください。このオプションを指定する場合、OPT_SAMEAS=Tは指定できません。

- USER_RULES=T: 任意のユーザー定義ルールを適用します。このオプションを指定する場合、PROOF=TまたはDISTANCE=Tは指定できません。また、passesパラメータのデフォルト値を使用する必要があります。

delta_inパラメータでは、値がこれらのモデルの全体的なサイズと比較して小さい場合、推論パフォーマンスは最適です。一般的なシナリオでは、デルタに10,000未満のトリプルが含まれているときに最適な結果が得られる場合がありますが、一部のテストでは、100,000トリプルのデルタでもかなりの推論パフォーマンスの向上が見られました。

label_genパラメータでは、デフォルトのOLSラベル・ジェネレータを使用する場合、表9-2から適切なSEM_RDFSAパッケージ定数値を指定します。

表9-2 label_genパラメータのSEM_RDFSAパッケージ定数

定数

説明

SEM_RDFSA.LABELGEN_SUBJECT

トリプルのラベルとして、推論されたトリプルの主語に関連付けられているラベルを適用するラベル・ジェネレータ。

SEM_RDFSA.LABELGEN_PREDICATE

トリプルのラベルとして、推論されたトリプルの主語に関連付けられているラベルを適用するラベル・ジェネレータ。

SEM_RDFSA.LABELGEN_OBJECT

トリプルのラベルとして、推論されたトリプルの主語に関連付けられているラベルを適用するラベル・ジェネレータ。

SEM_RDFSA.LABELGEN_RULE

トリプルのラベルとして、推論されたトリプルを直接生成したルールに関連付けられているラベルを適用するラベル・ジェネレータ。このオプションを指定する場合、optionsパラメータにPROOF=Tも指定する必要があります。

SEM_RDFSA.LABELGEN_DOMINATING

トリプルのコンポーネント(主語、述語、目的語およびルール)のためのすべての使用可能なラベルのうち、優位ラベルを計算して、推論されたトリプルのラベルとしてそれを適用するラベル・ジェネレータ。

ファイングレイン・アクセス制御(VPDおよびOLS)に関する考慮事項

VPDを使用する特定のモデルに対して、またはOLSを使用するネットワーク全体に対して、ファイングレイン・アクセス制御を有効にした場合、関連ポリシーへの完全なアクセス権限を持つユーザーのみが伴意を作成できます。VPDポリシー(5.1.1項「RDFデータのVPDポリシー」を参照)に関連付けられる名前空間に対して、パッケージ定数sem_rdfsa.VPD_FULL_ACCESSによって1に定義されるコンテキスト属性を設定することで、VPDポリシーへの完全なアクセス権限が付与されます。OLSが有効な場合、SA_USER_ADMIN.SET_USER_PRIVSプロシージャを使用して、OLSポリシーへの完全なアクセス権限が付与されます。1つ以上のVPD対応RDFモデルを使用して作成されるすべての伴意に対して、VPDポリシーが自動的に適用されます。5.1.1項で説明するように、VPDポリシーに関連付けられているRDFメタデータは、事前定義されたVPDポリシーが推論データを使用して回避されないようにするために、新しく推論されたデータを使用して保持される必要がある場合があります。

生成されたラベルを通じてアクセスされる推論されたトリプルは、ユーザー・アクセス可能なトリプルおよびルールから直接推論される概念上のトリプルとは異なることがあります。トリプルのコンポーネントのサブセットを使用して生成されるラベルは、意図していたものよりも弱い場合があります。たとえば、推論されたトリプルの前件の1つは、トリプルのコンポーネントのどれよりも高いラベルを持つ場合があります。ラベルがトリプルのコンポーネントのみに基づいて生成される場合、前件の1つにアクセス権がないエンド・ユーザーが、推論されたトリプルへのアクセス権を持つ場合があります。前件がカスタム・ラベル生成に使用されるときでも、生成されたラベルが意図したものよりも強い場合があります。推論プロセスは完全なものではなく、同じトリプルを推論する他の代替方法に関連する情報も使用できません。したがって、代替パスのすべてのトリプルへのアクセス権を持つユーザーが、より低いアクセス権でトリプルを推論できるため、ある一連の前件を使用して生成されたラベルが強すぎる場合があります。

コンポーネントおよび前件すべてに対して優位であるラベルを生成する場合でも、ラベルが正確でない可能性があります。これは、関係において優位であると考えられるラベルに、重複しないグループ情報がある場合です。たとえば、2つのラベルL:C:NYとL:C:NH (Lはレベル、Cはコンポーネント、NYおよびNHは2つのグループ)について考えてみます。これらの2つのラベルより優位である単純なラベルはL:C:NY,NHであり、2つのラベルの真の最上位はL:C:US(USはNYおよびNH両方の親グループ)ですただし、最初の2つのラベルを持つトリプルから推論されたトリプルには、これらの2つの優位ラベルはどちらも正確ではありません。推論されるトリプルにL:C:NY,NHが使用される場合、これらのどちらのグループのメンバーシップを持つユーザーにも、推論されるトリプルへのアクセス権がありますが、同じユーザーに、その前件の1つへのアクセス権はありません。一方、推論されるトリプルにL:C:USが使用される場合、両方のグループに属するがUSグループには属さないメンバーシップを持つユーザーは推論されるトリプルにアクセスできませんが、そのコンポーネントと前件に直接アクセスすることによって、そのユーザーはトリプルを推論できます。

推論されるトリプルに伴うこれらの固有の問題のため、ラベル・ジェネレータを選択または実装する場合は、特別に注意する必要があります。

例の項のOLSの例も参照してください。

例

次の例では、OWLPrimeルールベースを使用してOWLTST_IDXという伴意を作成し、推論されたトリプルに対して証明を生成します。

EXECUTE sem_apis.create_entailment('owltst_idx', sem_models('owltst'), sem_rulebases('OWLPRIME'), SEM_APIS.REACH_CLOSURE, null, 'PROOF=T');

次の例では、OLS環境が前提となります。ルールと一緒にルールベースを作成し、伴意も作成します。

-- Create an entailment with a rule. --
exec sdo_rdf_inference.create_entailment('contracts_rb');

insert into mdsys.rdfr_contracts_rb values (
'projectLedBy', '(?x :drivenBy ?y) (?y :hasVP ?z)',  NULL,
'(?x :isLedBy ?z)',
SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.myorg.com/pred/')));

-- Assign sensitivity label for the predicate to be inferred. --
-- Yhe predicate label may be set globally or it can be assign to --
-- the one or the models used to infer the data – e.g: CONTRACTS.
begin
sem_rdfsa.set_predicate_label(
model_name   => 'rdf$global',
predicate    => 'http://www.myorg.com/pred/isLedBy',
label_string => 'TS:US_SPCL');
end;
/

-- Create index with a specific label generator. --
begin
sem_apis.create_entailment(
entailment_name_in => 'contracts_inf',
models_in          => SDO_RDF_Models('contracts'),
rulebases_in       => SDO_RDF_Rulebases('contracts_rb'),
options            => 'USER_RULES=T',
label_gen          => sem_rdfsa.LABELGEN_PREDICATE);
end;
/

-- Check for any label exceptions and update them accordingly. --
update mdsys.rdfi_contracts_inf set ctxt1 = 1100 where ctxt1 = -1;

-- The new entailment is now ready for use in SEM_MATCH queries. --

SEM_APIS.CREATE_RULEBASE

書式

SEM_APIS.CREATE_RULEBASE(

rulebase_name IN VARCHAR2);

説明

ルールベースを作成します。

パラメータ

rulebase_name

ルールベースの名前。

使用方法

このプロシージャは、ユーザー定義のルールベースを作成します。ルールベースの作成後、そのルールベースにルールを追加できます。RDFデータの問合せでルールベースのルールを適用するには、SEM_MATCHテーブル・ファンクションのコールでルールベースを指定します。

ルールおよびルールベースの詳細は、1.3.6項を参照してください。SEM_MATCHテーブル・ファンクションの詳細は、1.6項を参照してください。

例

次の例では、ルールベースfamily_rbを作成します。(この例は、1.11.2項の例1-44からの抜粋です。)

EXECUTE SEM_APIS.CREATE_RULEBASE('family_rb');

SEM_APIS.CREATE_SEM_MODEL

書式

SEM_APIS.CREATE_SEM_MODEL(

model_name IN VARCHAR2,

table_name IN VARCHAR2,

column_name IN VARCHAR2,

model_tablespace IN VARCHAR2 DEFAULT NULL);

説明

セマンティク・テクノロジ・モデルを作成します。

パラメータ

model_name

モデルの名前。

table_name

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

column_name

table_nameのSDO_RDF_TRIPLE_S型の列の名前。

model_tablespace

このモデルをサポートするためにOracleで使用される表および他のデータベース・オブジェクト用の表領域の名前。デフォルト値は、SEM_APIS.CREATE_SEM_NETWORKプロシージャのコールで指定された表領域です。

使用方法

このプロシージャをコールしてセマンティク・テクノロジ・モデルを作成する前に、セマンティク・テクノロジ・データへの参照を保持する表を作成する必要があります。詳細は、1.10項を参照してください。

このプロシージャは、モデルをMDSYS.SEM_MODEL$ビュー(1.3.1項を参照)に追加します。

このプロシージャは、モデルを作成する際にサポートされる唯一の方法です。MDSYS.SEM_MODEL$ビューにSQLのINSERT文を使用しないでください。

モデルを削除するには、SEM_APIS.DROP_SEM_MODELプロシージャを使用します。

例

次の例では、セマンティク・テクノロジ・モデルarticlesを作成します。モデルのトリプル・データへの参照は、ARTICLES_RDF_DATA表のTRIPLE列に格納されます。(この例は、1.11.2項の例1-43からの抜粋です。)

EXECUTE SEM_APIS.CREATE_SEM_MODEL('articles', 'articles_rdf_data', 'triple');

ARTICLES_RDF_DATA表の定義は、次のとおりです。

CREATE TABLE articles_rdf_data (id NUMBER, triple SDO_RDF_TRIPLE_S);

SEM_APIS.CREATE_SEM_NETWORK

書式

SEM_APIS.CREATE_SEM_NETWORK(

tablespace_name IN VARCHAR2

説明

セマンティク・データの永続的な記憶域の構造を作成します。

パラメータ

tablespace_name

このプロシージャにより作成される表で使用する表領域の名前。この表領域は、作成されるすべてのモデルのデフォルトになりますが、モデルの作成時にSEM_APIS.CREATE_SEM_MODELプロシージャのコールでmodel_tablespaceパラメータを指定することで、このデフォルトを上書きできます。

使用方法

このプロシージャは、セマンティク・テクノロジ・サポートで使用されるシステム表および他のデータベース・オブジェクトを作成します。

このプロシージャのコールでセマンティク・テクノロジのシステム表の表領域を作成し、表領域名を指定する必要があります。(SYSTEM表領域は指定しないでください。)作成する表領域に必要なサイズは、格納するセマンティク・テクノロジ・データの量に応じて変化します。

このプロシージャをコールするには、DBA権限を持つユーザーとしてデータベースに接続する必要があり、プロシージャは、データベースに対して1回のみコールできます。

セマンティク・データの永続的な記憶域のこれらの構造を削除するには、DBA権限を持つユーザーとして接続し、SEM_APIS.DROP_SEM_NETWORKをコールする必要があります。

例

次の例では、セマンティク・テクノロジのシステム表の表領域を作成して、この表領域でセマンティク・データの永続的な記憶域の構造を作成します。

CREATE TABLESPACE rdf_tblspace
DATAFILE '/oradata/orcl/rdf_tblspace.dat' SIZE 1024M REUSE
AUTOEXTEND ON NEXT 256M MAXSIZE UNLIMITED
SEGMENT SPACE MANAGEMENT AUTO;
. . .
EXECUTE SEM_APIS.CREATE_SEM_NETWORK('rdf_tblspace');

SEM_APIS.CREATE_SOURCE_EXTERNAL_TABLE

書式

SEM_APIS.CREATE_SOURCE_EXTERNAL_TABLE(

source_table IN VARCHAR2,

def_directory IN VARCHAR2,

log_directory IN VARCHAR2 DEFAULT NULL,

bad_directory IN VARCHAR2 DEFAULT NULL,

log_file IN VARCHAR2 DEFAULT NULL,

bad_file IN VARCHAR2 DEFAULT NULL,

parallel IN INTEGER DEFAULT NULL,

source_table_owner IN VARCHAR2 DEFAULT NULL,

flags IN VARCHAR2 DEFAULT NULL);

説明

表にN-TripleまたはN-Quad形式ファイルをマップするために外部表を作成します。

パラメータ

source_table

作成する外部表の名前。

def_directory

入力ファイルがあるデータベース・ディレクトリ。このステージング表からロードするには、このディレクトリに対するREAD権限を持っている必要があります。

log_directory

外部表からのロード時にログ・ファイルが生成されるデータベース・ディレクトリ。指定しない場合、def_directoryパラメータの値が使用されます。外部表からのロードする場合は、このディレクトリに対するWRITE権限を持っている必要があります。

bad_directory

外部表からのロード時に不良ファイルが生成されるデータベース・ディレクトリ。指定しない場合、def_directoryパラメータの値が使用されます。外部表からのロードする場合は、このディレクトリに対するWRITE権限を持っている必要があります。

log_file

ログ・ファイルの名前。指定しない場合、名前はロード操作中に自動的に生成されます。

bad_file

不良ファイルの名前。指定しない場合、名前はロード操作中に自動的に生成されます。

parallel

作成中の外部表に関連付けられている並列度。

source_table_owner

作成中の外部表の所有者。指定しない場合、起動側は所有者になります。

flags

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

使用方法

詳細およびその例は、1.7.1.1.2項「外部表を使用したステージング表へのN-Quad形式のデータのロード」を参照してください。

例

次の例では、ソース外部表を作成します。(この例は、1.7.1.1.2項の例1-36からの抜粋です。)

BEGIN
sem_apis.create_source_external_table(
source_table    => 'stage_table_source'
,def_directory   => 'DATA_DIR'
,bad_file        => 'CLOBrows.bad'
);
END;

SEM_APIS.CREATE_VIRTUAL_MODEL

書式

SEM_APIS.CREATE_VIRTUAL_MODEL(

vm_name IN VARCHAR2,

models IN SEM_MODELS,

rulebases IN SEM_RULEBASES DEFAULT NULL,

options IN VARCHAR2 DEFAULT NULL);

説明

指定されたセマンティク・モデルおよびルールベースを含む仮想モデルを作成します。

パラメータ

vm_name

作成する仮想モデルの名前。

models

1つ以上のセマンティク・モデル名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。少なくとも1つのセマンティク・モデルを指定する必要があります。

rulebases

1つ以上のルールベース名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_RULEBASESです。このパラメータがNULLの場合、仮想モデル定義にルールベースは含まれません。ルールおよびルールベースの詳細は、1.3.6項を参照してください。

options

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

使用方法

(使用方法の情報を含む)仮想モデルの説明は、1.3.8項を参照してください。

指定されたセマンティク・モデルとルールベースの組合せごとに、伴意が存在する必要があります。

仮想モデルを作成するには、(A)指定された各モデルおよび対応する伴意の所有者、または(B) DBA権限を持つユーザーである必要があります。

このプロシージャは、次の書式の名前を持つビューを作成します。

- SEMV_vm_name。これは、各モデルおよび伴意内のトリプルのUNION ALLに対応します。このビューには重複が含まれることがあります。

- SEMU_vm_nameは、各モデルおよび伴意内のトリプルのUNIONに対応します。このビューには重複は含まれません(このため、SEMUのUはunique(一意)を表します)。
ただし、仮想モデルに1つのみのセマンティク・モデルが含まれ、伴意は含まれない場合、SEMU_vm_nameビューは作成されません。

モデルm1、m2、m3およびモデルm1、m2およびm3のためにOWLPrimeルールベースを使用して作成された伴意から作成された仮想モデルvm1の1.3.8項の例を使用するために、このプロシージャで、次の2つのビューを作成します(m1、m2、m3およびOWLPRIME伴意が内部のmodel_id値1、2、3、4を保持すると想定しています)。

CREATE VIEW MDSYS.SEMV_VM1 AS
SELECT start_node_id, p_value_id, canon_end_node_id, end_node_id
FROM MDSYS.rdf_link$
WHERE model_id IN (1, 2, 3, 4);

CREATE VIEW MDSYS.SEMU_VM1 AS
SELECT start_node_id, p_value_id, canon_end_node_id, MAX(end_node_id)
FROM MDSYS.rdf_link$
WHERE model_id IN (1, 2, 3, 4)
GROUP BY start_node_id, p_value_id, canon_end_node_id;

このプロシージャを起動するユーザーは、仮想モデルの所有者となり、SEMU_vm_nameおよびSEMV_vm_nameビューに対するSELECT WITH GRANT権限を持ちます。対応する仮想モデルを問い合せるには、ユーザーはこれらのビューに対するselect権限を持っている必要があります。

例

次の例では、仮想モデルVM1を作成します。

EXECUTE sem_apis.create_virtual_model('VM1', sem_models('model_1', 'model_2'), sem_rulebases('OWLPRIME'));

SEM_APIS.DISABLE_CHANGE_TRACKING

書式

SEM_APIS.DISABLE_CHANGE_TRACKING(

models_in IN SEM_MODELS);

説明

指定されたモデルのセットの変更トラッキングを無効にします。

パラメータ

models_in

1つ以上のモデル名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。

使用方法

モデルの変更トラッキングを無効にすることにより、そのモデルを使用するすべての伴意の増分推論が自動的に無効になります。

このプロシージャを使用するには、指定したモデルの所有者である必要があり、あらかじめ増分推論を有効にしておく必要があります。

(使用方法の情報を含む)増分推論の説明は、2.2.9項を参照してください。

例

次の例では、familyモデルの変更トラッキングを無効にします。

EXECUTE sem_apis.disable_change_tracking(sem_models('family'));

SEM_APIS.DISABLE_INC_INFERENCE

書式

SEM_APIS.DISABLE_INC_INFERENCE(

entailment_name IN VARCHAR2);

説明

指定された伴意(ルール索引)の増分推論を無効にします。

パラメータ

entailment_name

増分推論を無効にする伴意の名前。

使用方法

このプロシージャを使用するには、指定した伴意の所有者である必要があり、SEM_APIS.ENABLE_INC_INFERENCEプロシージャによって、あらかじめ増分推論を有効にしておく必要があります。

このプロシージャをコールすることにより、起動ユーザーが所有する、この特定の推論によってのみ変更を追跡していたすべてのモデルの変更トラッキングが自動的に無効になります。

(使用方法の情報を含む)増分推論の説明は、2.2.9項を参照してください。

例

次の例では、RDFS_RIX_FAMILYという伴意の増分推論を有効にします。

EXECUTE sem_apis.disable_inc_inference('rdfs_rix_family');

SEM_APIS.DROP_DATATYPE_INDEX

書式

SEM_APIS.DROP_DATATYPE_INDEX(

datatype IN VARCHAR2,

force_drop IN BOOLEAN default FALSE);

説明

既存のデータ型索引を削除します。

パラメータ

datatype

削除する索引に対するデータ型のURI。

force_drop

TRUEに設定すると、文の処理中にエラーが発生した場合、索引を強制的に削除し、FALSE (デフォルト)に設定すると、文の処理中にエラーが発生した場合、索引を削除しません。

使用方法

このプロシージャをコールするには、DBA権限が必要です。

データ型索引の詳細は、1.9項を参照してください。

例

次の例では、xsd:string型付きリテラルおよびプレーン・リテラルのデータ型索引を削除します。

EXECUTE SEM_APIS.DROP_DATATYPE_INDEX('http://www.w3.org/2001/XMLSchema#string');

SEM_APIS.DROP_ENTAILMENT

書式

SEM_APIS.DROP_ENTAILMENT(

entailment_name_in IN VARCHAR2,

named_g_in IN SEM_GRAPHS DEFAULT NULL,

dop IN INT DEFAULT 1);

説明

伴意(ルール索引)を削除します。

パラメータ

entailment_name_in

削除する伴意の名前。

named_g_in

伴意の指定されたグラフ名を持つトリプルのみを削除します。NULL値(デフォルト)は伴意全体を削除します。

たとえば、named_g_in => sem_graphs('<urn:G1>','<urn:G2>')は、グラフ名G1およびG2を持つ伴意のトリプルのみを削除し、残りの伴意グラフは削除されません。

dop

トリプル削除のパラレル実行の並列度。named_g_inパラメータがNULLでない場合にのみ適用されます。

使用方法

SEM_APIS.CREATE_ENTAILMENTプロシージャを使用して作成した伴意をこのプロシージャで削除できます。

VALIDまたはINCOMPLETEステータスの伴意における指定された名前付きグラフを持つ伴意のサブセットのみを削除する場合(つまり、named_g_inがNULLでない場合)、削除後の伴意の結果のステータスはINCOMPLETEに設定されます。

例

次の例では、伴意OWLTST_IDXを削除します。

EXECUTE sem_apis.drop_entailment('owltst_idx');

次の例では、伴意OWLNG_IDXに属するグラフ名G1およびG2の推論されたトリプルのみを削除します。デフォルトのグラフおよび他の名前付きグラフのすべての推論されたトリプルは、伴意に残ります。

EXECUTE sem_apis.drop_entailment('owlng_idx',sem_graphs('<urn:G1>','<urn:G2>'));

SEM_APIS.DROP_RULEBASE

書式

SEM_APIS.DROP_RULEBASE(

rulebase_name IN VARCHAR2);

説明

ルールベースを削除します。

パラメータ

rulebase_name

ルールベースの名前。

使用方法

このプロシージャは、指定されたルールベースを削除します。削除されたルールベースは、SEM_MATCHテーブル・ファンクションのコールで使用できなくなります。ルールベースの詳細は、1.3.6項を参照してください。

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

例

次の例では、ルールベースfamily_rbを削除します。

EXECUTE SEM_APIS.DROP_RULEBASE('family_rb');

SEM_APIS.DROP_SEM_INDEX

書式

SEM_APIS.DROP_SEM_INDEX(

index_code IN VARCHAR2);

説明

セマンティク・ネットワークのモデルおよび伴意に対するセマンティク・ネットワーク索引を削除します。

パラメータ

index_code

索引コード文字列。前のSEM_APIS.ADD_SEM_INDEXプロシージャのコールで指定されたindex_code値と一致している必要があります。

使用方法

セマンティク・ネットワーク索引の詳細は、1.8項を参照してください。

例

次の例では、索引コード文字列pcsmを使用して、セマンティク・ネットワークのモデルおよび伴意に対するセマンティク・ネットワーク索引を削除します。

EXECUTE SEM_APIS.DROP_SEM_INDEX('pscm');

SEM_APIS.DROP_SEM_MODEL

書式

SEM_APIS.DROP_SEM_MODEL(

model_name IN VARCHAR2);

説明

セマンティク・テクノロジ・モデルを削除します。

パラメータ

model_name

モデルの名前。

使用方法

このプロシージャは、モデルをMDSYS.SEM_MODEL$ビュー(1.3.1項を参照)から削除します。

このプロシージャは、モデルを削除する際にサポートされる唯一の方法です。MDSYS.SEM_MODEL$ビューにSQLのDELETE文を使用しないでください。

モデルを削除できるのは、そのモデルの作成者のみです。

例

次の例では、セマンティク・テクノロジ・モデルarticlesを削除します。

EXECUTE SEM_APIS.DROP_SEM_MODEL('articles');

SEM_APIS.DROP_SEM_NETWORK

書式

SEM_APIS.DROP_SEM_NETWORK(

cascade IN BOOLEAN DEFAULT FALSE);

説明

セマンティク・データの永続的な記憶域に使用される構造を削除します。

パラメータ

cascade

TRUEに設定すると、既存のすべてのセマンティク・テクノロジ・モデルおよびルールベースを削除して、セマンティク・データの永続的な記憶域に使用される構造を削除し、FALSE(デフォルト)を設定すると、セマンティク・テクノロジ・モデルまたはルールベースが存在する場合、操作が失敗します。

使用方法

セマンティク・データの永続的な記憶域に使用される構造を削除するには、DBA権限を持つユーザーとして接続し、このプロシージャをコールします。

バージョン対応モデルが存在する場合、cascadeパラメータの値に関係なく、このプロシージャは失敗します。

例

次の例では、セマンティク・データの永続的な記憶域に使用される構造を削除します。

EXECUTE SEM_APIS.DROP_SEM_NETWORK;

SEM_APIS.DROP_USER_INFERENCE_OBJS

書式

SEM_APIS.DROP_USER_INFERENCE_OBJS(

uname IN VARCHAR2);

説明

指定されたデータベース・ユーザーに所有されているすべてのルールベースおよび伴意を削除します。

パラメータ

uname

データベース・ユーザーの名前。(この値には、大/小文字の区別があり、たとえば、HERMANとhermanは異なるユーザーとみなされます。)

使用方法

指定したユーザーのルールおよびルールベースを削除するのに十分な権限を持っている必要があります。

このプロシージャは、データベース・ユーザーは削除しません。そのユーザーに所有されているRDFのルールベースと伴意のみを削除します。

例

次の例では、ユーザーSCOTTに所有されているすべてのルールベースと伴意を削除します。

EXECUTE SEM_APIS.DROP_USER_INFERENCE_OBJS('SCOTT');

PL/SQL procedure successfully completed.

SEM_APIS.DROP_VIRTUAL_MODEL

書式

SEM_APIS.DROP_VIRTUAL_MODEL(

vm_name IN VARCHAR2);

説明

仮想モデルを削除します。

パラメータ

vm_name

削除する仮想モデルの名前。

使用方法

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

このプロシージャを使用するには、指定した仮想モデルの所有者である必要があります。

(使用方法の情報を含む)仮想モデルの説明は、1.3.8項を参照してください。

例

次の例では、仮想モデルVM1を削除します。

EXECUTE sem_apis.drop_virtual_model('VM1');

SEM_APIS.ENABLE_CHANGE_TRACKING

書式

SEM_APIS.ENABLE_CHANGE_TRACKING(

models_in IN SEM_MODELS);

説明

指定されたモデルのセットの変更トラッキングを有効にします。

パラメータ

models_in

1つ以上のモデル名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。

使用方法

モデルを使用するすべての伴意で増分推論を有効にする前に、そのモデルで変更トラッキングを有効にする必要があります。

このプロシージャを使用するには、指定した1つ以上のモデルの所有者である必要があります。

伴意の所有者が、基礎となるモデルの所有者でもある場合、(SEM_APIS.ENABLE_INC_INFERENCEプロシージャをコールすることによって)伴意で増分推論を有効にすることにより、そのユーザーが所有するそれらのモデルで変更トラッキングが自動的に有効になります。

モデルのセットの変更トラッキングを無効にするには、SEM_APIS.DISABLE_CHANGE_TRACKINGプロシージャを使用します。

(使用方法の情報を含む)増分推論の説明は、2.2.9項を参照してください。

例

次の例では、familyモデルの変更トラッキングを有効にします。

EXECUTE sem_apis.enable_change_tracking(sem_models('family'));

SEM_APIS.ENABLE_INC_INFERENCE

書式

SEM_APIS.ENABLE_INC_INFERENCE(

entailment_name IN VARCHAR2);

説明

指定された伴意(ルール索引)の増分推論を有効にします。

パラメータ

entailment_name

増分推論を有効にする伴意の名前。

使用方法

このプロシージャを使用するには、指定した伴意の所有者である必要があります。

このプロシージャが実行される前に、伴意に関連するすべての基礎となるモデルで変更トラッキングを有効にしておく必要があります。伴意の所有者が、基礎となるモデルの所有者でもある場合、このプロシージャをコールすることにより、それらのモデルで変更トラッキングが自動的に有効になります。ただし、いくつかの基礎となるモデルが伴意の所有者によって所有されない場合、それらのモデルで変更トラッキングを有効にするには、適切なモデル所有者が最初にSEM_APIS.ENABLE_CHANGE_TRACKINGプロシージャをコールする必要があります。

伴意に対する増分推論を無効にするには、SEM_APIS.DISABLE_INC_INFERENCEプロシージャを使用します。

(使用方法の情報を含む)増分推論の説明は、2.2.9項を参照してください。

例

次の例では、RDFS_RIX_FAMILYという伴意の増分推論を有効にします。

EXECUTE sem_apis.enable_inc_inference('rdfs_rix_family');

SEM_APIS.ESCAPE_CLOB_TERM

書式

SEM_APIS.ESCAPE_CLOB_TERM(

term IN CLOB CHARACTER SET ANY_CS,

utf_encode IN NUMBER DEFAULT 1

) RETURN CLOB CHARACTER SET val%CHARSET;

説明

W3CのN-Triples形式(http://www.w3.org/TR/rdf-testcases/#ntriples)で指定された入力RDF語句について、特殊文字および非ASCII文字をエスケープして戻します。

パラメータ

term

エスケープするRDF語句。

utf_encode

chr(8)、chr(9)、chr(10)、chr(12)、chr(13)以外の非ASCII文字および出力不可能なASCII文字をエスケープする必要がある場合は、1 (デフォルト)に設定します。それ以外の場合、これらの文字はエスケープされません。

使用方法

SEM_MATCHテーブル・ファンクションのoptionsパラメータでDO_UNESCAPEキーワードを使用する方法の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力RDF語句をエスケープします。

SELECT SEM_APIS.ESCAPE_CLOB_TERM('"abc' || chr(9) || 'def' || chr(10) || 'hij"^^<http://www.w3.org/2001/XMLSchema#string>') FROM DUAL;

SEM_APIS.ESCAPE_CLOB_VALUE

書式

SEM_APIS.ESCAPE_CLOB_VALUE(

val IN VARCHAR2 CHARACTER SET ANY_CS,

start_offset IN NUMBER DEFAULT 1,

end_offset IN NUMBER DEFAULT 0,

utf_encode IN NUMBER DEFAULT 1,

include_start IN NUMBER DEFAULT 0

) RETURN VARCHAR2 CHARACTER SET val%CHARSET;

説明

W3CのN-Triples形式(http://www.w3.org/TR/rdf-testcases/#ntriples)で指定された入力CLOB値について、特殊文字および非ASCII文字をエスケープして戻します。

パラメータ

val

エスケープするCLOBテキスト。

start_offset

valの中で文字のエスケープを開始する位置のオフセット。デフォルト(1)は、valの最初の文字でエスケープを開始します。

end_offset

valの中で文字のエスケープを終了する位置のオフセット。デフォルト(0)は、valの末尾からエスケープを継続します。

utf_encode

chr(8)、chr(9)、chr(10)、chr(12)、chr(13)以外の非ASCII文字および出力不可能なASCII文字をエスケープする必要がある場合は、1 (デフォルト)に設定します。それ以外の場合、これらの文字はエスケープされません。

include_start

valの1文字目からstart_offsetまでの文字を戻り値の先頭に追加する場合は、1に設定します。それ以外の場合、これらの文字は戻り値の先頭に追加されません。

使用方法

SEM_MATCHテーブル・ファンクションのoptionsパラメータでDO_UNESCAPEキーワードを使用する方法の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力文字列をエスケープします。

SELECT SEM_APIS.ESCAPE_CLOB_VALUE('abc' || chr(9) || 'def' || chr(10) || 'hij') FROM DUAL;

SEM_APIS.ESCAPE_RDF_TERM

書式

SEM_APIS.ESCAPE_RDF_TERM(

term IN VARCHAR2 CHARACTER SET ANY_CS,

utf_encode IN NUMBER DEFAULT 1

) RETURN VARCHAR2 CHARACTER SET val%CHARSET;

説明

W3CのN-Triples形式(http://www.w3.org/TR/rdf-testcases/#ntriples)で指定された入力RDF語句について、特殊文字および非ASCII文字をエスケープして戻します。

パラメータ

term

エスケープするRDF語句。

utf_encode

chr(8)、chr(9)、chr(10)、chr(12)、chr(13)以外の非ASCII文字および出力不可能なASCII文字をエスケープする必要がある場合は、1 (デフォルト)に設定します。それ以外の場合、これらの文字はエスケープされません。

使用方法

SEM_MATCHテーブル・ファンクションのoptionsパラメータでDO_UNESCAPEキーワードを使用する方法の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力RDF語句をエスケープします。

SELECT SEM_APIS.ESCAPE_RDF_TERM('"abc' || chr(9) || 'def' || chr(10) || 'hij"^^<http://www.w3.org/2001/XMLSchema#string>') FROM DUAL;

SEM_APIS.ESCAPE_RDF_VALUE

書式

SEM_APIS.ESCAPE_RDF_VALUE(

val IN VARCHAR2 CHARACTER SET ANY_CS,

utf_encode IN NUMBER DEFAULT 1

) RETURN VARCHAR2 CHARACTER SET val%CHARSET;

説明

W3CのN-Triples形式(http://www.w3.org/TR/rdf-testcases/#ntriples)で指定された入力値について、特殊文字および非ASCII文字をエスケープして戻します。

パラメータ

val

エスケープするテキスト。

utf_encode

chr(8)、chr(9)、chr(10)、chr(12)、chr(13)以外の非ASCII文字および出力不可能なASCII文字をエスケープする必要がある場合は、1 (デフォルト)に設定します。それ以外の場合、これらの文字はエスケープされません。

使用方法

SEM_MATCHテーブル・ファンクションのoptionsパラメータでDO_UNESCAPEキーワードを使用する方法の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力文字列をエスケープします。

SELECT SEM_APIS.ESCAPE_RDF_VALUE('abc' || chr(9) || 'def' || chr(10) || 'hij') FROM DUAL;

SEM_APIS.GET_CHANGE_TRACKING_INFO

書式

SEM_APIS.GET_CHANGE_TRACKING_INFO(

model_name IN VARCHAR2,

enabled OUT BOOLEAN,

tracking_start_time OUT TIMESTAMP);

説明

モデルの変更トラッキング情報を戻します。

パラメータ

model_name

セマンティク・テクノロジ・モデルの名前。

enabled

プロシージャから戻されるブール値。TRUE (変更トラッキングがモデルで有効になっている場合)またはFALSE (変更トラッキングがモデルで有効になっていない場合)。

timestamp

変更トラッキングがモデルで有効にされた日時を示すタイムスタンプ(有効になっている場合)。

使用方法

model_nameの値は、MDSYS.SEM_MODEL$ビュー(1.3.1項を参照)のMODEL_NAME列の値と一致している必要があります。

モデルのセットの変更トラッキングを有効にするには、SEM_APIS.ENABLE_CHANGE_TRACKINGプロシージャを使用します。

(使用方法の情報を含む)増分推論の説明は、2.2.9項を参照してください。

例

次の例では、モデルの変更トラッキング情報を表示します。

DECLARE
bEnabled  boolean;
tsEnabled  timestamp;

BEGIN
EXECUTE IMMEDIATE 'create table m1 (t SDO_RDF_TRIPLE_S)';
sem_apis.create_sem_model('m1','m1','t');

sem_apis.enable_change_tracking(sem_models('m1'));

sem_apis.get_change_tracking_info('m1', bEnabled,  tsEnabled);
dbms_output.put_line('is enabled:' || case when bEnabled then 'true' else 'false' end);
dbms_output.put_line('enabled at:' || tsEnabled);
END;
/

SEM_APIS.GET_INC_INF_INFO

書式

SEM_APIS.GET_INC_INF_INFO(

entailment_name IN VARCHAR2,

enabled OUT BOOLEAN,

prev_inf_start_time OUT TIMESTAMP);

説明

伴意の増分推論情報を戻します。

パラメータ

entailment_name

伴意の名前。

enabled

プロシージャから戻されるブール値(TRUE (増分推論が伴意で有効になっている場合)またはFALSE (増分推論が伴意で有効になっていない場合))。

timestamp

伴意が最後に更新された日時を示すタイムスタンプ(増分推論が有効になっている場合)。

使用方法

伴意に対する増分推論を有効にするには、SEM_APIS.ENABLE_INC_INFERENCEプロシージャを使用します。

(使用方法の情報を含む)増分推論の説明は、2.2.9項を参照してください。

例

次の例では、伴意の増分推論情報を表示します。

DECLARE
bEnabled boolean;
tsEnabled timestamp;

DECLARE
EXECUTE IMMEDIATE 'create table m1 (t SDO_RDF_TRIPLE_S)';
sem_apis.create_sem_model('m1','m1','t');

sem_apis.create_entailment('m1_inf',sem_models('m1'),
sem_rulebases('owlprime'),null,null,'INC=T');

sem_apis.get_inc_inf_info('m1_inf', bEnabled,  tsEnabled);
dbms_output.put_line('is enabled:' || case when bEnabled then 'true' else 'false'
end);
dbms_output.put_line('enabled at:' || tsEnabled);
END
/

SEM_APIS.GET_MODEL_ID

書式

SEM_APIS.GET_MODEL_ID(

model_name IN VARCHAR2

) RETURN NUMBER;

説明

セマンティク・テクノロジ・モデルのモデルID番号を戻します。

パラメータ

model_name

セマンティク・テクノロジ・モデルの名前。

使用方法

model_nameの値は、MDSYS.SEM_MODEL$ビュー(1.3.1項を参照)のMODEL_NAME列の値と一致している必要があります。

例

次の例では、モデルarticlesのモデルID番号を戻します。(この例は、1.11.2項の例1-43からの抜粋です。)

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

MODEL_ID
----------
1

SEM_APIS.GET_MODEL_NAME

書式

SEM_APIS.GET_MODEL_NAME(

model_id IN NUMBER

) RETURN VARCHAR2;

説明

セマンティク・テクノロジ・モデルのモデル名を戻します。

パラメータ

model_id

セマンティク・テクノロジ・モデルのID番号。

使用方法

model_idの値は、MDSYS.SEM_MODEL$ビュー(1.3.1項を参照)のMODEL_ID列の値と一致している必要があります。

例

次の例では、IDの値に1を持つモデルのモデルID番号を戻します。(この例は、1.11.2項の例1-43からの抜粋です。)

SQL> SELECT SEM_APIS.GET_MODEL_NAME(1) AS model_name FROM DUAL;

MODEL_NAME
--------------------------------------------------------------------------------
ARTICLES

SEM_APIS.GET_TRIPLE_ID

書式

SEM_APIS.GET_TRIPLE_ID(

model_id IN NUMBER,

subject IN VARCHAR2,

property IN VARCHAR2,

object IN VARCHAR2

) RETURN VARCHAR2;

または

SEM_APIS.GET_TRIPLE_ID(

model_name IN VARCHAR2,

subject IN VARCHAR2,

property IN VARCHAR2,

object IN VARCHAR2

) RETURN VARCHAR2;

説明

指定されたセマンティク・テクノロジ・モデルのトリプルのIDを戻します(トリプルが存在しない場合、NULL値を戻します)。

パラメータ

model_id

セマンティク・テクノロジ・モデルのID番号。MDSYS.SEM_MODEL$ビュー(1.3.1項を参照)のMODEL_ID列の値と一致している必要があります。

model_name

セマンティク・テクノロジ・モデルの名前。MDSYS.SEM_MODEL$ビュー(1.3.1項を参照)のMODEL_NAME列の値と一致している必要があります。

subject

主語。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_NAME列の値と一致している必要があります。

property

プロパティ。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_NAME列の値と一致している必要があります。

object

目的語。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_NAME列の値と一致している必要があります。

使用方法

このファンクションには、2つの書式があり、モデル番号またはモデル名でセマンティク・テクノロジ・モデルを指定できます。

例

次の例では、トリプルのID番号を戻します。(この例は、1.11.2項の例1-43からの抜粋です。)

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;

RDF_TRIPLE_ID
--------------------------------------------------------------------------------
2_9F2BFF05DA0672E_90D25A8B08C653A_46854582F25E8AC5

SEM_APIS.GETV$DATETIMETZVAL

書式

SEM_APIS.GETV$DATETIMETZVAL(

value_type IN VARCHAR2,

vname_prefix IN VARCHAR2,

vname_suffix IN VARCHAR2,

literal_type IN VARCHAR2,

language_type IN VARCHAR2,

) RETURN NUMBER;

説明

xsd:dateTime型付きリテラルに対してTIMESTAMP WITH TIME ZONE値を戻し、その他のRDF語句に対してはNULL値を戻します。グリニッジ標準時は、タイムゾーンなしのxsd:dateTime値に対してデフォルトのタイムゾーンとして使用されます。

パラメータ

value_type

RDF語句のタイプ。

vname_prefix

RDF語句の接頭辞の値。

vname_suffix

RDF語句の接尾辞の値。

literal_type

RDF語句のリテラル・タイプ。

language_type

RDF語句の言語タイプ。

使用方法

パフォーマンスを向上させるには、このファンクションでファンクション・ベース索引を作成することを検討してください。詳細は、1.6.7.2項を参照してください。

例

次の例では、MDSYS.RDF_VALUE$表のすべてのxsd:dateTimeのリテラルに対してTIMESTAMP WITH TIME ZONE値を戻します。

SELECT SEM_APIS.GETV$DATETIMETZVAL(value_type, vname_prefix, vname_suffix,
literal_type, language_type)
FROM MDSYS.RDF_VALUE$;

SEM_APIS.GETV$DATETZVAL

書式

SEM_APIS.GETV$DATETZVAL(

value_type IN VARCHAR2,

vname_prefix IN VARCHAR2,

vname_suffix IN VARCHAR2,

literal_type IN VARCHAR2,

language_type IN VARCHAR2,

) RETURN TIMESTAMP WITH TIME ZONE;

説明

xsd:date型付きリテラルに対してTIMESTAMP WITH TIME ZONE値を戻し、その他のRDF語句に対してはNULL値を戻します。グリニッジ標準時は、タイムゾーンなしのxsd:date値に対してデフォルトのタイムゾーンとして使用されます。

パラメータ

value_type

RDF語句のタイプ。

vname_prefix

RDF語句の接頭辞の値。

vname_suffix

RDF語句の接尾辞の値。

literal_type

RDF語句のリテラル・タイプ。

language_type

RDF語句の言語タイプ。

使用方法

パフォーマンスを向上させるには、このファンクションでファンクション・ベース索引を作成することを検討してください。詳細は、1.6.7.2項を参照してください。

例

次の例では、MDSYS.RDF_VALUE$表のすべてのxsd:dateのリテラルに対してTIMESTAMP WITH TIME ZONE値を戻します。

SELECT SEM_APIS.GETV$DATETZVAL(value_type, vname_prefix, vname_suffix,
literal_type, language_type)
FROM MDSYS.RDF_VALUE$;

SEM_APIS.GETV$NUMERICVAL

書式

SEM_APIS.GETV$NUMERICVAL(

value_type IN VARCHAR2,

vname_prefix IN VARCHAR2,

vname_suffix IN VARCHAR2,

literal_type IN VARCHAR2,

language_type IN VARCHAR2,

) RETURN NUMBER;

説明

XMLスキーマの数値型のリテラルに対して数値を戻し、他のすべてのRDF語句に対してNULL値を戻します。

パラメータ

value_type

RDF語句のタイプ。

vname_prefix

RDF語句の接頭辞の値。

vname_suffix

RDF語句の接尾辞の値。

literal_type

RDF語句のリテラル・タイプ。

language_type

RDF語句の言語タイプ。

使用方法

パフォーマンスを向上させるには、このファンクションでファンクション・ベース索引を作成することを検討してください。詳細は、1.6.7.2項を参照してください。

例

次の例では、MDSYS.RDF_VALUE$表のすべての数値リテラルに対して数値を戻します。

SELECT SEM_APIS.GETV$NUMERICVAL(value_type, vname_prefix, vname_suffix,
literal_type, language_type)
FROM MDSYS.RDF_VALUE$;

SEM_APIS.GETV$STRINGVAL

書式

SEM_APIS.GETV$STRINGVAL(

value_type IN VARCHAR2,

vname_prefix IN VARCHAR2,

vname_suffix IN VARCHAR2,

literal_type IN VARCHAR2,

language_type IN VARCHAR2,

) RETURN TIMESTAMP WITH TIME ZONE;

説明

プレーン・リテラルおよびxsd:string型付きリテラルの字句形式のVARCHAR2文字列を戻し、他のすべてのRDF語句に対してNULL値を戻します。CHR(0)は、空のリテラルに対して戻されます。

パラメータ

value_type

RDF語句のタイプ。

vname_prefix

RDF語句の接頭辞の値。

vname_suffix

RDF語句の接尾辞の値。

literal_type

RDF語句のリテラル・タイプ。

language_type

RDF語句の言語タイプ。

使用方法

パフォーマンスを向上させるには、このファンクションでファンクション・ベース索引を作成することを検討してください。詳細は、1.6.7.2項を参照してください。

例

次の例では、MDSYS.RDF_VALUE$表のすべてのプレーン・リテラルおよびxsd:string型のリテラルに対して字句の値を戻します。

SELECT SEM_APIS.GETV$STRINGVAL(value_type, vname_prefix, vname_suffix,
literal_type, language_type)
FROM MDSYS.RDF_VALUE$;

SEM_APIS.GETV$TIMETZVAL

書式

SEM_APIS.GETV$TIMETZVAL(

value_type IN VARCHAR2,

vname_prefix IN VARCHAR2,

vname_suffix IN VARCHAR2,

literal_type IN VARCHAR2,

language_type IN VARCHAR2,

) RETURN TIMESTAMP WITH TIME ZONE;

説明

xsd:time型付きリテラルに対してTIMESTAMP WITH TIME ZONE値を戻し、他のすべてのRDF語句に対してNULL値を戻します。グリニッジ標準時は、タイムゾーンなしのxsd:time値に対してデフォルトのタイムゾーンとして使用されます。すべてのTIMESTAMP WITH TIME ZONE値で2009-06-26がデフォルトの日付として使用されます。

パラメータ

value_type

RDF語句のタイプ。

vname_prefix

RDF語句の接頭辞の値。

vname_suffix

RDF語句の接尾辞の値。

literal_type

RDF語句のリテラル・タイプ。

language_type

RDF語句の言語タイプ。

使用方法

パフォーマンスを向上させるには、このファンクションでファンクション・ベース索引を作成することを検討してください。詳細は、1.6.7.2項を参照してください。

xsd:time値には日付ではなく時刻のみが含まれているため、戻されたTIMESTAMP WITH TIME ZONE値(日付コンポーネントを含む)には、2009-06-26が日付として追加されています。これは、戻された値が内部的に索引付けできるように、また、日付がすべての戻された値で同じになるように実行されます。

例

次の例では、MDSYS.RDF_VALUE$表のすべてのxsd:timeのリテラルに対してTIMESTAMP WITH TIME ZONE値(日付にデフォルトの2009-06-26を使用)を戻します。 (

SELECT SEM_APIS.GETV$DATETIMETZVAL(value_type, vname_prefix, vname_suffix,
literal_type, language_type)
FROM MDSYS.RDF_VALUE$;

SEM_APIS.IS_TRIPLE

書式

SEM_APIS.IS_TRIPLE(

model_id IN NUMBER,

subject IN VARCHAR2,

property IN VARCHAR2,

object IN VARCHAR2) RETURN VARCHAR2;

または

SEM_APIS.IS_TRIPLE(

model_name IN VARCHAR2,

subject IN VARCHAR2,

property IN VARCHAR2,

object IN VARCHAR2) RETURN VARCHAR2;

説明

文がデータベースの指定されたモデルの既存のトリプルであるかどうかをチェックします。

パラメータ

model_id

セマンティク・テクノロジ・モデルのID番号。MDSYS.SEM_MODEL$ビュー(1.3.1項を参照)のMODEL_ID列の値と一致している必要があります。

model_name

セマンティク・テクノロジ・モデルの名前。MDSYS.SEM_MODEL$ビュー(1.3.1項を参照)のMODEL_NAME列の値と一致している必要があります。

subject

主語。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_NAME列の値と一致している必要があります。

property

プロパティ。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_NAME列の値と一致している必要があります。

object

目的語。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_NAME列の値と一致している必要があります。

使用方法

このファンクションは、文字列値FALSE、TRUEまたはTRUE (EXACT)を戻します。

- FALSE: 文はデータベースの指定したモデルのトリプルではありません。

- TRUE: 文はデータベースの指定したモデルのトリプル値に一致しているか、トリプル値の正規形表現と同じです。

- TRUE (EXACT): 指定したsubject、propertyおよびobjectの値は、データベースの指定したモデルのトリプルと完全に一致しています。

例

次の例では、文がデータベースのトリプルであるかどうかをチェックします。この場合、完全一致するトリプルが存在します。(この例は、1.11.2項の例1-43からの抜粋です。)

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;

IS_TRIPLE
--------------------------------------------------------------------------------
TRUE (EXACT)

SEM_APIS.LOAD_INTO_STAGING_TABLE

書式

SEM_APIS.LOAD_INTO_STAGING_TABLE(

stagong_table IN VARCHAR2,

source_table IN VARCHAR2,

input_format IN VARCHAR2 DEFAULT NULL,

parallel IN INTEGER DEFAULT NULL,

staging_table_owner IN VARCHAR2 DEFAULT NULL,

source_table_owner IN VARCHAR DEFAULT NULL,

flags IN VARCHAR DEFAULT NULL);

説明

N-TripleまたはN-Quad形式の入力ファイルにマップされた外部表から、ステージング表にデータをロードします。

パラメータ

staging_table

ステージング表の名前。

source_table

ソース外部表の名前。

input_format

ソース外部表によってマップされる入力ファイルの形式のN-TRIPLEまたはN-QUAD。

parallel

ロード中に使用する並列度。

staging_table_owner

作成中のステージング表の所有者。指定しない場合、起動側は所有者であると想定されます。

source_table_owner

ソース表の所有者。指定しない場合、起動側は所有者であると想定されます。

flags

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

使用方法

詳細およびその例は、1.7.1.1.2項「外部表を使用したステージング表へのN-Quad形式のデータのロード」を参照してください。

例

次の例では、ステージング表をロードします。(この例は、1.7.1.1.2項の例1-36からの抜粋です。)

BEGIN
sem_apis.load_into_staging_table(
staging_table => 'STAGE_TABLE'
,source_table  => 'stage_table_source'
,input_format  => 'N-QUAD');
END;

SEM_APIS.LOOKUP_ENTAILMENT

書式

SEM_APIS.LOOKUP_ENTAILMENT (

models IN SEM_MODELS,

rulebases IN SEM_RULEBASES

) RETURN VARCHAR2;

説明

指定されたモデルおよびルールベースに基づいて伴意(ルール索引)の名前を戻します。

パラメータ

models

1つ以上のモデル名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。

rulebases

1つ以上のルールベース名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_RULEBASESです(ルールおよびルールベースの詳細は、1.3.6項を参照してください)。

使用方法

ルールベース索引が戻されるには、その索引が指定したすべてのモデルおよびルールベースに基づいている必要があります。

例

次の例では、familyモデルとRDFSおよびfamily_rbルールベースに基づく伴意を検出します。(この例は、1.11.2項の例1-44からの抜粋です。)

SELECT SEM_APIS.LOOKUP_ENTAILMENT(SEM_MODELS('family'),
SEM_RULEBASES('RDFS','family_rb')) AS lookup_entailment FROM DUAL;

LOOKUP_ENTAILMENT
--------------------------------------------------------------------------------
RDFS_RIX_FAMILY

SEM_APIS.MERGE_MODELS

書式

SEM_APIS.MERGE_MODELS(

source_model IN VARCHAR2,

destination_model IN VARCHAR2,

rebuild_apptab_index IN BOOLEAN DEFAULT TRUE,

drop_source_model IN BOOLEAN DEFAULT FALSE,

options IN VARCHAR2 DEFAULT NULL);

説明

ソース・モデルから宛先モデルに内容を挿入し、宛先アプリケーション表を更新します。

パラメータ

source_model

ソース・モデルの名前。

destination_model

宛先モデルの名前。

rebuild_apptab_index

TRUEは、モデルがマージされた後、宛先のアプリケーション表上の索引を再作成し、FALSEは、どの索引も再作成しません。

drop_source_model

TRUEは、モデルがマージされた後、ソース・モデル(source_model)を削除し、FALSE (デフォルト)は、ソース・モデルを削除しません。

options

プロシージャのデフォルトの動作を上書きするオプションのカンマ区切りの文字列。現在、このプロシージャのパラレル実行を有効にして、操作に関連付ける並列度を指定するDOP (並列度)オプションのみがサポートされています。

使用方法

モデルをマージする前に、位置パラメータを使用している場合は、1番目および2番目のパラメータに正しいモデル(1番目にソース・モデル、2番目に宛先モデル)を指定しているかを確認します。drop_source_model=TRUEを指定する予定の場合、これは特に重要です。

必要に応じて、マージを実行する前に、宛先モデルまたは両方のモデルのコピーを作成します。モデルのコピーを作成するには、SEM_APIS.CREATE_SEM_MODELを使用して、コピーに必要な名前で空のモデルを作成し、SEM_APIS.MERGE_MODELSを使用して、宛先モデルとして新しく作成されたコピーを移入します。

このプロシージャのいくつかの一般的な用途には次のものがあります。

- 変更するモデルへの読取り専用のアクセス権を持っている場合、完全なアクセス権を持つ空のモデルにそのモデルをクローニングしてから、この後者のモデルを変更できます。

- 複数のモデルを統合する場合、必要に応じてこのプロシージャを使用して、必要なモデルをマージできます。事前にすべてのモデルをマージし、マージしたモデルのみを使用することで、伴意を簡略化し、伴意のパフォーマンスを向上できます。

マルチコアまたはマルチCPUマシンでは、DOP (並列度)オプションが効果的な場合があります。DOPオプションを使用する例は、「例」を参照してください。

ソース・モデルが大きい場合、SEM_APIS.ANALYZE_MODELプロシージャをコールすることによって、マージ操作の後にマージ先でオプティマイザ統計を更新できます。

このプロシージャを使用する場合、次の考慮事項が適用されます。

- 宛先モデルの所有者であり、ソース・モデルに対するSELECT権限を持っている必要があります。drop_second_model=TRUEの場合、ソース・モデルの所有者でもある必要があります。

- このプロシージャは、VPD対応またはバージョン対応のセマンティク・モデルでは使用できません。

- このプロシージャは、仮想モデル(1.3.8項を参照)ではサポートされません。

- 表の制約は、宛先のアプリケーション表では許容されません。

例

次の例では、モデルM1の内容をM2に挿入します。

EXECUTE SEM_APIS.MERGE_MODELS('M1', 'M2');

次の例では、モデルM1の内容をM2に挿入し、並列度4 (マージ操作の実行では最大4つのパラレル・スレッド)を指定します。

EXECUTE SEM_APIS.MERGE_MODELS('M1', 'M2', null, null, 'DOP=4');

SEM_APIS.PRIVILEGE_ON_APP_TABLES

書式

SEM_APIS.PRIVILEGE_ON_APP_TABLES(

command IN VARCHAR2 DEFAULT 'GRANT',

privilege IN VARCHAR2 DEFAULT 'SELECT');

説明

MDSYSに対して、起動側が所有する全RDFモデルに対応するアプリケーション表へのSELECT権限またはINSERT権限の付与(または取消し)を実行します。

パラメータ

command

使用可能な値GRANT (デフォルト)またはREVOKEを含むSQL文(大/小文字の区別はありません)。

privilege

使用可能な値SELECT (デフォルト)またはINSERTを含む権限名(大/小文字の区別はありません)。

使用方法

(なし)

例

次の例では、MDSYSに、起動側が所有する全RDFモデルに対応するアプリケーション表へのSELECT権限を付与します。

EXECUTE SEM_APIS.PRIVILEGE_ON_APP_TABLES('grant', 'select');

SEM_APIS.PURGE_UNUSED_VALUES

書式

SEM_APIS.PURGE_UNUSED_VALUES(

flags IIN VARCHAR2 DEFAULT NULL);

説明

セマンティク・ネットワークから未使用値をパージします。

パラメータ

flags

次のキーワード指定を1つ以上含めることができる、引用符で囲んだオプションの文字列。

- MBV_METHOD=SHADOWを指定すると、値の別のロード方法を使用できるため、大量の値をパージする必要がある場合に、処理がより高速になる可能性があります。

- PARALLEL=<integer>を指定すると、この処理のほとんどを、integerで指定した、操作に関連付けられている並列度を使用してパラレルに実行できます。並列度なしでPARALLELのみを指定すると、デフォルトの並列度が使用されます。

- PUV_COMPUTE_VIDS_USEDを指定すると、別の方法を使用できるため、ほとんどの値がパージされると予測される場合に、処理がより高速になる可能性があります。

使用方法

このプロシージャをコールする前に、MDSYSに、既存の全RDFモデルのアプリケーション表へのSELECT権限を付与する必要があります。

使用方法と使用例の詳細は、1.7.5項「未使用値のパージ」を参照してください。

例

次の例では、並列度4を使用して、未使用値をパージします。

EXECUTE SEM_APIS.PURGE_UNUSED_VALUES(flags => 'PARALLEL=4');

SEM_APIS.REFRESH_SEM_NETWORK_INDEX_INFO

書式

SEM_APIS.REFRESH_SEM_NETWORK_INDEX_INFO(

options IN VARCHAR2 DEFAULT NULL);

説明

セマンティク・ネットワーク索引に関する情報をリフレッシュします。

パラメータ

options

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

使用方法

このプロシージャは、MDSYS.SEM_NETWORK_INDEX_INFOビュー(1.8.1項を参照)の情報を更新します。

例

次の例では、セマンティク・ネットワーク索引に関する情報をリフレッシュします。

EXECUTE sem_apis.refresh_sem_network_index_info;

SEM_APIS.REMOVE_DUPLICATES

書式

SEM_APIS.REMOVE_DUPLICATES(

model_name IN VARCHAR2,

threshold IN FLOAT DEFAULT 0.3,

rebuild_apptab_index IN BOOLEAN DEFAULT TRUE);

説明

モデルから重複トリプルを削除します。

パラメータ

model_name

モデルの名前。

threshold

削除操作が実行されるために、どれだけ多くのトリプルが必要かを決定する値。このプロシージャは、モデルのトリプルの数が次の計算式を上回る場合にのみ、トリプルを削除します(トリプルの合計 - 一意のトリプルの合計 + 0.01) / (一意のトリプルの合計 + 0.01)。デフォルト値の0.3とトリプルの合計1000 (重複を含む)を含むモデルの場合、重複の数がおよそ230を超える場合にのみ、重複トリプルが削除されます。

しきい値が低くなるほど、プロシージャが重複を削除するのに必要な重複の数は少なくなり、しきい値が高くなるほど、プロシージャが重複を削除するのに必要な重複の数は多くなります。

rebuild_apptab_index

TRUE (デフォルト)は、重複トリプルの削除後、この操作によって影響された表の使用可能なすべての索引を再作成し、FALSEは、索引を再作成しません。

使用方法

重複トリプルが削除されると、トリプル列以外の列の情報など、削除された行のすべての情報が失われます。

このプロシージャは、仮想モデル(1.3.8項を参照)ではサポートされません。

このプロシージャは、バージョン対応モデル(第6章を参照)ではサポートされません。

モデルが空の場合、または、重複トリプルが存在しないか(threshold値を使用して計算されるような)十分な重複トリプルが存在しない場合、このプロシージャは削除操作を実行しません。

操作を実行するには(threshold値を使用して計算されるような)十分な重複がない場合、情報メッセージが表示されます。

例

次の例では、familyというモデルから重複したトリプルを削除します。デフォルトのしきい値0.3を受け入れ、重複が削除された後、(デフォルトで)索引が再構築されます。

EXECUTE SEM_APIS.REMOVE_DUPLICATES('family');

SEM_APIS.RENAME_ENTAILMENT

書式

SEM_APIS.RENAME_ENTAILMENT(

old_name IN VARCHAR2,

new_name IN VARCHAR2);

説明

伴意(ルール索引)の名前を変更します。

パラメータ

old_name

名前を変更する既存の伴意の名前。

new_name

伴意の新規の名前。

使用方法

6.5項「RDFデータに対してWorkspace Managerサポートを使用する場合の特別な考慮事項」の説明にあるとおり、このプロシージャはバージョン対応RDFモデルではサポートされません。

例

次の例では、OWLTST_IDXという伴意の名前をMY_OWLTST_IDXに変更します。

EXECUTE sem_apis.rename_entailment('owltst_idx', 'my_owltst_idx');

SEM_APIS.RENAME_MODEL

書式

SEM_APIS.RENAME_MODEL(

old_name IN VARCHAR2,

new_name IN VARCHAR2);

説明

モデルの名前を変更します。

パラメータ

old_name

名前を変更する既存のモデルの名前。

new_name

モデルの新規の名前。

使用方法

このプロシージャを使用する場合、次の考慮事項が適用されます。

- 既存のモデルの所有者である必要があります。

- このプロシージャは、VPD対応またはバージョン対応のセマンティク・モデルでは使用できません。

- このプロシージャは、仮想モデル(1.3.8項を参照)ではサポートされません。

このプロシージャは、2つの既存のモデルの名前を交換するSEM_APIS.SWAP_NAMESとは対照的です。

例

次の例では、MODEL1というモデルの名前をMODEL2に変更します。

EXECUTE sem_apis.rename_model('model1', 'model2');

SEM_APIS.SWAP_NAMES

書式

SEM_APIS.SWAP_NAMES(

model1 IN VARCHAR2,

model2 IN VARCHAR2);

説明

2つの既存のモデルの名前を交換します。

パラメータ

model1

モデルの名前。

model2

別のモデルの名前。

使用方法

このプロシージャの結果として、モデルmodel1の名前はmodel2の(古い)名前に変更され、モデルmodel2の名前はmodel1の(古い)名前に変更されます。

名前の順序は、結果に影響しません。たとえば、model1に対してTESTおよびmodel2に対してPRODUCTION、または、model1に対してPRODUCTIONおよびmodel2に対してTESTを指定できますが、結果は同じになります。

6.5項「RDFデータに対してWorkspace Managerサポートを使用する場合の特別な考慮事項」の説明にあるとおり、このプロシージャはバージョン対応RDFモデルではサポートされません。

このプロシージャは、既存のモデルの名前を変更するSEM_APIS.RENAME_MODELとは対照的です。

例

次の例では、(古い)TESTモデルの名前をPRODUCTIONに、(古い)PRODUCTIONモデルの名前をTESTに変更します。

EXECUTE sem_apis.swap_names('test', 'production');

SEM_APIS.UNESCAPE_CLOB_TERM

書式

SEM_APIS.UNESCAPE_CLOB_TERM(

term IN CLOB CHARACTER SET ANY_CS

) RETURN CLOB CHARACTER SET val%CHARSET;

説明

W3CのN-Triples形式(http://www.w3.org/TR/rdf-testcases/#ntriples)で指定された入力RDF語句について、特殊文字および非ASCII文字をアンエスケープして戻します。

パラメータ

term

アンエスケープするRDF語句。

使用方法

SEM_MATCHテーブル・ファンクションのoptionsパラメータでDO_UNESCAPEキーワードを使用する方法の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力RDF語句をアンエスケープします。

SELECT SEM_APIS.UNESCAPE_CLOB_TERM('"abc\tdef\nhij"^^<http://www.w3.org/2001/XMLSchema#string>') FROM DUAL;

SEM_APIS.UNESCAPE_CLOB_VALUE

書式

SEM_APIS.UNESCAPE_CLOB_VALUE(

val IN VARCHAR2 CHARACTER SET ANY_CS,

start_offset IN NUMBER DEFAULT 1,

end_offset IN NUMBER DEFAULT 0,

include_start IN NUMBER DEFAULT 0

) RETURN VARCHAR2 CHARACTER SET val%CHARSET;

説明

W3CのN-Triples形式(http://www.w3.org/TR/rdf-testcases/#ntriples)で指定された入力CLOB値について、特殊文字および非ASCII文字をアンエスケープして戻します。

パラメータ

val

アンエスケープするCLOBテキスト。

start_offset

valの中で文字のアンエスケープを開始する位置のオフセット。デフォルト(1)は、valの最初の文字でエスケープを開始します。

end_offset

valの中で文字のアンエスケープを終了する位置のオフセット。デフォルト(0)は、valの末尾からエスケープを継続します。

include_start

valの1文字目からstart_offsetまでの文字を戻り値の先頭に追加する場合は、1に設定します。それ以外の場合、これらの文字は戻り値の先頭に追加されません。

使用方法

SEM_MATCHテーブル・ファンクションのoptionsパラメータでDO_UNESCAPEキーワードを使用する方法の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力文字列をアンエスケープします。

SELECT SEM_APIS.UNESCAPE_CLOB_VALUE('abc\tdef\nhij') FROM DUAL;

SEM_APIS.UNESCAPE_RDF_TERM

書式

SEM_APIS.UNESCAPE_RDF_TERM(

term IN VARCHAR2 CHARACTER SET ANY_CS

) RETURN VARCHAR2 CHARACTER SET val%CHARSET;

説明

W3CのN-Triples形式(http://www.w3.org/TR/rdf-testcases/#ntriples)で指定された入力RDF語句について、特殊文字および非ASCII文字をアンエスケープして戻します。

パラメータ

term

アンエスケープするRDF語句。

使用方法

SEM_MATCHテーブル・ファンクションのoptionsパラメータでDO_UNESCAPEキーワードを使用する方法の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力RDF語句をアンエスケープします。

SELECT SEM_APIS.UNESCAPE_RDF_TERM('"abc\tdef\nhij"^^<http://www.w3.org/2001/XMLSchema#string>') FROM DUAL;

SEM_APIS.UNESCAPE_RDF_VALUE

書式

SEM_APIS.UNESCAPE_RDF_VALUE(

val IN VARCHAR2 CHARACTER SET ANY_CS

) RETURN VARCHAR2 CHARACTER SET val%CHARSET;

説明

W3CのN-Triples形式(http://www.w3.org/TR/rdf-testcases/#ntriples)で指定された入力値について、特殊文字および非ASCII文字をアンエスケープして戻します。

パラメータ

val

アンエスケープするテキスト。

使用方法

SEM_MATCHテーブル・ファンクションのoptionsパラメータでDO_UNESCAPEキーワードを使用する方法の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力文字列をアンエスケープします。

SELECT SEM_APIS.UNESCAPE_RDF_VALUE('abc\tdef\nhij') FROM DUAL;

SEM_APIS.VALIDATE_ENTAILMENT

書式

SEM_APIS.VALIDATE_ENTAILMENT(

models_in IN SEM_MODELS,

rulebases_in IN SEM_RULEBASES,

criteria_in IN VARCHAR2 DEFAULT NULL,

max_conflict IN NUMBER DEFAULT 100,

options IN VARCHAR2 DEFAULT NULL

) RETURN RDF_LONGVARCHARARRAY;

説明

1つ以上のモデルでOWLまたはRDFS推論を実行する際に使用できる伴意(ルール索引)を検証します。

パラメータ

models_in

1つ以上のモデル名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。

rulebases_in

1つ以上のルールベース名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_RULEBASESです。ルールおよびルールベースの詳細は、1.3.6項を参照してください。

criteria_in

実行する検証チェックのカンマ区切りの文字列。このパラメータを指定しない場合、デフォルトで次のすべてのチェックが実行されます。

- UNSAT: 充足不可能なクラスを検出します。

- EMPTY: 充足不可能なクラスに属するインスタンスを検出します。

- SYNTAX_S: URIでも空白ノードでもない主語を含むトリプルを検出します。

- SYNTAX_P: URIではない述語を含むトリプルを検出します。

- SELF_DIF: 自己自身と異なる個体を検出します。

- INST: 同時に2つの排他クラスに属する個体を検出します。

- SAM_DIF: 同じであり(owl:sameAs)かつ異なる(owl:differentFrom)個体のペアを検出します。

デフォルトより少ない数のチェックを指定するには、実行するチェックの文字列のみを指定します。たとえば、criteria_in => 'UNSAT'と指定すると、検証プロセスでは充足不可能なクラスのみが検索されます。

max_conflict

検証プロセスを停止する前に検出する競合の最大数。デフォルト値は100です。

options

(現在は未使用。Oracleで使用するために予約済。)

使用方法

このプロシージャは、元の伴意の非一貫性を検出するために使用できます。詳細は、2.2.5項を参照してください。

このプロシージャは、エラーが検出されなかった場合はNULL値を戻し、エラーが検出された場合はVARRAY(32767) OF VARCHAR2(4000)という定義を持つRDF_LONGVARCHARARRAY型のオブジェクトを戻します。

伴意を作成するには、SEM_APIS.CREATE_ENTAILMENTプロシージャを使用します。

例

このプロシージャの例は、2.2.5項の例2-5を参照してください。

SEM_APIS.VALIDATE_MODEL

書式

SEM_APIS.VALIDATE_MODEL(

models_in IN SEM_MODELS,

criteria_in IN VARCHAR2 DEFAULT NULL,

max_conflict IN NUMBER DEFAULT 100,

options IN VARCHAR2 DEFAULT NULL

) RETURN RDF_LONGVARCHARARRAY;

説明

1つ以上のモデルを検証します。

パラメータ

models_in

1つ以上のモデル名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。

criteria_in

実行する検証チェックのカンマ区切りの文字列。このパラメータを指定しない場合、デフォルトで次のすべてのチェックが実行されます。

- UNSAT: 充足不可能なクラスを検出します。

- EMPTY: 充足不可能なクラスに属するインスタンスを検出します。

- SYNTAX_S: URIでも空白ノードでもない主語を含むトリプルを検出します。

- SYNTAX_P: URIではない述語を含むトリプルを検出します。

- SELF_DIF: 自己自身と異なる個体を検出します。

- INST: 同時に2つの排他クラスに属する個体を検出します。

- SAM_DIF: 同じであり(owl:sameAs)かつ異なる(owl:differentFrom)個体のペアを検出します。

デフォルトより少ない数のチェックを指定するには、実行するチェックの文字列のみを指定します。たとえば、criteria_in => 'UNSAT'と指定すると、検証プロセスでは充足不可能なクラスのみが検索されます。

max_conflict

検証プロセスを停止する前に検出する競合の最大数。デフォルト値は100です。

options

(現在は未使用。Oracleで使用するために予約済。)

使用方法

このプロシージャは、元のデータ・モデルの非一貫性を検出するために使用できます。詳細は、2.2.5項を参照してください。

このプロシージャは、エラーが検出されなかった場合はNULL値を戻し、エラーが検出された場合はVARRAY(32767) OF VARCHAR2(4000)という定義を持つRDF_LONGVARCHARARRAY型のオブジェクトを戻します。

例

次の例では、モデルfamilyを検証します。

SELECT SEM_APIS.VALIDATE_MODEL(SEM_MODELS('family')) FROM DUAL;

SEM_APIS.VALUE_NAME_PREFIX

書式

SEM_APIS.VALUE_NAME_PREFIX (

value_name IN VARCHAR2,

value_type IN VARCHAR2

) RETURN VARCHAR2;

説明

指定された値名と値タイプのペアに対応するMDSYS.RDF_VALUE$表のVNAME_PREFIX列の値を戻します。

パラメータ

value_name

値名。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_NAME列の値と一致している必要があります。

value_type

値タイプ。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_TYPE列の値と一致している必要があります。

使用方法

このファンクションでは、通常、MDSYS.RDF_VALUE$表の索引が値の検索処理に使用されるため、高速な問合せを実行できます。

例

次の問合せでは、VALUE_NAME_PREFIXファンクションで戻されたものと同じ接頭辞の値の付いたMDSYS.RDF_VALUE$表のすべての字句の値について、値名の部分を戻します。この問合せでは、MDSYS.RDF_VALUE$表の索引が使用されるため、効率的な検索が実行されます。

SELECT value_name FROM MDSYS.RDF_VALUE$
WHERE vname_prefix = SEM_APIS.VALUE_NAME_PREFIX(
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type','UR');

VALUE_NAME
--------------------------------------------------------------------------------
http://www.w3.org/1999/02/22-rdf-syntax-ns#Alt
http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag
http://www.w3.org/1999/02/22-rdf-syntax-ns#List
http://www.w3.org/1999/02/22-rdf-syntax-ns#Property
http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq
http://www.w3.org/1999/02/22-rdf-syntax-ns#Statement
http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral
http://www.w3.org/1999/02/22-rdf-syntax-ns#first
http://www.w3.org/1999/02/22-rdf-syntax-ns#nil
http://www.w3.org/1999/02/22-rdf-syntax-ns#object
http://www.w3.org/1999/02/22-rdf-syntax-ns#predicate
http://www.w3.org/1999/02/22-rdf-syntax-ns#rest
http://www.w3.org/1999/02/22-rdf-syntax-ns#subject
http://www.w3.org/1999/02/22-rdf-syntax-ns#type
http://www.w3.org/1999/02/22-rdf-syntax-ns#value

15 rows selected.

SEM_APIS.VALUE_NAME_SUFFIX

書式

SEM_APIS.VALUE_NAME_SUFFIX (

value_name IN VARCHAR2,

value_type IN VARCHAR2

) RETURN VARCHAR2;

説明

指定された値名と値タイプのペアに対応するMDSYS.RDF_VALUE$表のVNAME_SUFFIX列の値を戻します。

パラメータ

value_name

値名。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_NAME列の値と一致している必要があります。

value_type

値タイプ。MDSYS.RDF_VALUE$表(1.3.2項を参照)のVALUE_TYPE列の値と一致している必要があります。

使用方法

このファンクションでは、通常、MDSYS.RDF_VALUE$表の索引が値の検索処理に使用されるため、高速な問合せを実行できます。

例

次の問合せでは、VALUE_NAME_SUFFIXファンクションで戻されたものと同じ接尾辞の値の付いたMDSYS.RDF_VALUE$表のすべての字句の値について、値名の部分を戻します。この問合せでは、MDSYS.RDF_VALUE$表の索引が使用されるため、効率的な検索が実行されます。

SELECT value_name FROM MDSYS.RDF_VALUE$
WHERE vname_suffix = SEM_APIS.VALUE_NAME_SUFFIX(
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type','UR');

VALUE_NAME
--------------------------------------------------------------------------------
http://www.w3.org/1999/02/22-rdf-syntax-ns#type

10 SEM_OLSパッケージのサブプログラム

SEM_OLSパッケージには、Oracle Label Security (OLS)を使用した、RDFデータに対するトリプルレベル・セキュリティに関連するサブプログラム(ファンクションとプロシージャ)が含まれます。この章のサブプログラムを使用するには、第1章「Oracle Databaseセマンティク・テクノロジの概要」と第5章「RDFデータのファイングレイン・アクセス制御」に記載されている概念および使用情報について理解しておく必要があります。

この章では、サブプログラムに関するリファレンス情報を示します(サブプログラムのリストはアルファベット順です)。

SEM_OLS.APPLY_POLICY_TO_APP_TAB

書式

SEM_OLS.APPLY_POLICY_TO_APP_TAB(

policy_name IN VARCHAR2,

schema_name IN VARCHAR2,

table_name IN VARCHAR2,

predicate IN VARCHAR2 DEFAULT NULL);

説明

アプリケーション表にOLSポリシーを適用します。

パラメータ

policy_name

既存のOLSポリシーの名前。

schema_name

アプリケーション表を含むスキーマの名前。

table_name

アプリケーション表の名前。

predicate

ラベルベースの述語と組み合せる追加の述語。

使用方法

トリプルレベル・セキュリティを使用する場合、ネットワークの各セマンティク・モデルにはOLSが適用されます。つまり、関連する内部表とすべてのアプリケーション表にラベル・セキュリティが適用されるため、既存のセマンティク・モデルのアプリケーション表に手動でポリシーを適用する必要はありません。ただし、OLSポリシーの適用後に追加のモデルを作成する必要がある場合、モデルを作成する前に、SEM_OLS.APPLY_POLICY_TO_APP_TABプロシージャを使用してアプリケーション表にOLSを適用する必要があります。

このプロシージャを実行するには、SA_POLICY_ADMINパッケージのEXECUTE権限およびpolicy_DBAロールを持っている必要があります。

このプロシージャを実行する前に、rdfsa_optionsパラメータにSEM_RDFSA.TRIPLE_LEVEL_ONLYを指定するSEM_RDFSA.APPLY_OLS_POLICYプロシージャを実行しておく必要があります。

アプリケーション表からOLSポリシーを削除するには、SEM_OLS.REMOVE_POLICY_FROM_APP_TABプロシージャを使用します。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、MY_SCHEMA.MY_APP_TABLEアプリケーション表にdefenseという名前のOLSポリシーを適用します。

begin
sem_ols.apply_policy_to_app_table(
policy_name => 'defense',
schema_name => 'my_schema',
table_name  => 'my_app_table');
end;
/

SEM_OLS.REMOVE_POLICY_FROM_APP_TAB

書式

SEM_OLS.REMOVE_POLICY_FROM_APP_TAB(

policy_name IN VARCHAR2,

schema_name IN VARCHAR2,

table_name IN VARCHAR2);

説明

アプリケーション表からOLSポリシーを永続的に削除または分離します。

パラメータ

policy_name

既存のOLSポリシーの名前。

schema_name

アプリケーション表を含むスキーマの名前。

table_name

アプリケーション表の名前。

使用方法

セマンティク・モデルをすでに削除していて、アプリケーション表を保護する必要がなくなった場合、このプロシージャを使用できます。

このプロシージャを実行するには、SA_POLICY_ADMINパッケージのEXECUTE権限およびpolicy_DBAロールを持っている必要があります。

このプロシージャを実行する前に、rdfsa_optionsパラメータにSEM_RDFSA.TRIPLE_LEVEL_ONLYを指定するSEM_RDFSA.APPLY_OLS_POLICYプロシージャを実行しておく必要があります。

関連付けられているモデルが存在する場合、例外が生成されます。この場合、このプロシージャを実行するには、最初にモデルを削除する必要があります。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、MY_SCHEMA.MY_APP_TABLEアプリケーション表にdefenseという名前のOLSポリシーを削除します。

begin
sem_ols.remove_policy_from_app_table(
policy_name => 'defense',
schema_name => 'my_schema',
table_name  => 'my_app_table');
end;
/

11 SEM_PERFパッケージのサブプログラム

SEM_PERFパッケージには、Oracle DatabaseのResource Description Framework (RDF)およびWeb Ontology Language (OWL)サポートのパフォーマンスを調査および拡張できるサブプログラムが含まれます。この章のサブプログラムを使用するには、第1章「Oracle Databaseセマンティク・テクノロジの概要」と第2章「OWLの概要」に記載されている概念および使用情報について理解しておく必要があります。

この章では、サブプログラムに関するリファレンス情報を示します(サブプログラムのリストはアルファベット順です)。

SEM_PERF.GATHER_STATS

書式

SEM_PERF.GATHER_STATS();

just_on_values_table IN BOOLEAN DEFAULT FALSE,

degree IN NUMBER(38) DEFAULT NULL);

説明

RDFおよびOWL表とその索引に関する統計を収集します。

パラメータ

just_on_values_table

TRUEは、トリプルの字句の値を含む表のみに関する統計を収集し、FALSE (デフォルト)は、RDFおよびOWLデータの記憶域に関連したすべての主要な表に関する統計を収集します。

TRUEの値はプロシージャの実行時間を短縮するため、値表に関する統計のみを収集する必要がある場合(たとえば、必要な他の統計を収集するために他のインタフェースを使用する場合)では、十分である可能性があります。

degree

並列度。パラレル実行の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

使用方法

このプロシージャを使用するには、実行権限を持つユーザーとして接続する必要があります。デフォルトでは、SpatialがOracle Databaseの一部としてインストールされている場合、このプロシージャを実行できるのはMDSYSユーザーのみです(ただし、このプロシージャの実行権限は、必要に応じて各ユーザーに付与できます)。

このプロシージャは、推論パフォーマンスを向上するのに役立つ統計情報を収集します(2.2.7項を参照)。このプロシージャは、内部的にDBMS_STATS.GATHER_TABLE_STATSプロシージャをコールしてRDFおよびOWL関連の表とその索引に関する統計を収集し、その統計をOracle Databaseのデータ・ディクショナリに格納します。DBMS_STATSパッケージの使用方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

統計の収集ではシステム・リソースが大量に使用されるため、このプロシージャは重要なアプリケーションおよび操作が悪影響を受ける可能性のない時期に実行してください。

例

次の例では、RDFおよびOWL関連の表とその索引に関する統計を収集します。

EXECUTE SEM_PERF.GATHER_STATS;

12 SEM_RDFCTXパッケージのサブプログラム

SEM_RDFCTXパッケージには、ドキュメントに作成されるエクストラクタ・ポリシーおよびセマンティク索引を管理するサブプログラム(ファンクションとプロシージャ)が含まれます。この章のサブプログラムを使用するには、第4章「ドキュメントのセマンティク索引付け」に記載されている概念および使用情報について理解しておく必要があります。

この章では、サブプログラムに関するリファレンス情報を示します(サブプログラムのリストはアルファベット順です)。

SEM_RDFCTX.ADD_DEPENDENT_POLICY

書式

SEM_RDFCTX.ADD_DEPENDENT_POLICY(

index_name IN VARCHAR2,

policy_name IN VARCHAR2,

partition_name IN VARCHAR2 DEFAULT NULL);

説明

(すでに作成された)索引または索引パーティションに依存ポリシーを追加します。

パラメータ

index_name

索引の名前。

policy_name

依存ポリシーの名前。

partition_name

指定された索引がローカルの場合、ターゲット・パーティションの名前。(それ以外の場合は、NULLである必要があります。)

使用方法

新しい依存ポリシーに対応するベース・ポリシーは、事前に索引の一部にしておく必要があります。

例

次の例では、索引ArticleIndexに新しい依存ポリシーSEM_EXTR_PLUS_GEOONTを追加します。

begin
sem_rdfctx.add_dependent_policy (index_name  => 'ArticleIndex',
policy_name => 'SEM_EXTR_PLUS_GEOONT');
end;
/

SEM_RDFCTX.CREATE_POLICY

書式

SEM_RDFCTX.CREATE_POLICY(

policy_name IN VARCHAR2,

extractor mdsys.rdfctx_extractor,

preferences sys.XMLType DEFAULT NULL);

または

SEM_RDFCTX.CREATE_POLICY(

policy_name IN VARCHAR2,

base_policy IN VARCHAR2,

user_models IN SEM_MODELS DEFAULT NULL,

user_entailments IN SEM_MODELS DEFAULT NULL);

説明

エクストラクタ・ポリシーを作成します。(最初の書式はベース・ポリシー用であり、2番目の書式はベース・ポリシーに依存するポリシー用です。)

パラメータ

policy_name

エクストラクタ・ポリシーの名前。

extractor

情報エクストラクタの抽出ロジックをカプセル化するRDFCTX_EXTRACTORタイプのサブタイプのインスタンス。

preferences

ポリシーに関連付けられているプリファレンス。

base_policy

依存ポリシーのベース・エクストラクタ・ポリシー。

user_models

依存ポリシーのユーザー・モデルのリスト。

user_entailments

依存ポリシーのユーザー伴意のリスト。

使用方法

このプロシージャを使用して作成されるエクストラクタ・ポリシーは、そのポリシーを使用して作成されるセマンティク索引の特性を決定します。各エクストラクタ・ポリシーは、エクストラクタ・タイプのインスタンスを直接または間接的に参照します。エクストラクタ・タイプのインスタンスを直接参照するエクストラクタ・ポリシーは、オントロジの追加のRDFモデルを含む他のエクストラクタ・ポリシーを構成するために使用できます。

エクストラクタ・パラメータに割り当てられるエクストラクタ・タイプのインスタンスは、タイプmdsys.rdfctx_extractorの直接的または間接的なサブタイプのインスタンスである必要があります。

user_modelsパラメータで指定されるRDFモデルは、ポリシーを作成しているユーザーからアクセス可能である必要があります。

user_entailmentsパラメータで指定されるRDF伴意は、ポリシーを作成しているユーザーからアクセス可能である必要があります。伴意の基礎となるRDFモデルは、依存ポリシーに自動的に含まれないことに注意してください。基礎となるこれらのRDFモデルを1つ以上含めるには、モデルをuser_modelsパラメータに含める必要があります。

エクストラクタ・ポリシーに対して指定されるプリファレンスは、索引付けされるドキュメントおよびその他の関連情報に使用されているリポジトリのタイプを決定します。詳細は、4.8項「外部ドキュメントの索引付け」を参照してください。

例

次の例では、Oracle Databaseによるセマンティク索引付けのサポートに含まれているgatenlp_extractorエクストラクタ・タイプを使用して、エクストラクタ・ポリシーを作成します。

begin
sem_rdfctx.create_policy (policy_name => 'SEM_EXTR',
extractor   => mdsys.gatenlp_extractor());
end;
/

次の例では、事前に作成されたエクストラクタ・ポリシーの依存ポリシーを作成し、依存ポリシーにユーザー定義のRDFモデルgeo_ontologyを追加します。

begin
sem_rdfctx.create_policy (policy_name => 'SEM_EXTR_PLUS_GEOONT',
base_policy => 'SEM_EXTR',
user_models => SEM_MODELS ('geo_ontology'));
end;
/

SEM_RDFCTX.DROP_POLICY

書式

SEM_RDFCTX.DROP_POLICY(

policy_name IN VARCHAR2);

説明

使用していないエクストラクタ・ポリシーを削除します。

パラメータ

policy_name

エクストラクタ・ポリシーの名前。

使用方法

指定されたポリシーがドキュメントのセマンティク索引に使用されている場合、または、依存エクストラクタ・ポリシーが、指定されたポリシーに存在する場合、例外が生成されます。

例

次の例では、SEM_EXTR_PLUS_GEOONTエクストラクタ・ポリシーを削除します。

begin
sem_rdfctx.drop_policy (policy_name => 'SSEM_EXTR_PLUS_GEOONT');
end;
/

SEM_RDFCTX.MAINTAIN_TRIPLES

書式

SEM_RDFCTX.MAINTAIN_TRIPLES(

index_name IN VARCHAR2,

where_clause IN VARCHAR2,

rdfxml_content sys.XMLType,

policy_name IN VARCHAR2 DEFAULT NULL,

action IN VARCHAR2 DEFAULT 'ADD');

説明

特定のドキュメントから抽出された情報を含むグラフに、1つ以上のトリプルを追加します。

パラメータ

index_name

ドキュメントのセマンティク索引の名前。

where_clause

ドキュメントが格納される表のSQL述語(WHEREキーワードのないWHERE句テキスト)であり、索引を保持する行を識別します。

rdfxml_content

ドキュメントに対応する個々のグラフに追加される、RDF/XMLドキュメント形式のトリプル。

policy_name

エクストラクタ・ポリシーの名前。policy_nameがNULL (デフォルト)の場合、トリプルは、索引のデフォルト(または唯一の)エクストラクタ・ポリシーによって抽出される情報に追加され、ポリシー名を指定する場合、トリプルはそのポリシーによって抽出される情報に追加されます。

action

トリプルで実行するメンテナンス操作のタイプ。rdfxml_contentパラメータで指定されるトリプルを追加するADD(デフォルト)で、現在サポートされている唯一の値。

使用方法

セマンティクに索引付けされたドキュメントから抽出される情報は、不完全で、適切なコンテキストが欠けている場合があります。このプロシージャによって、ドメインは、セマンティクに索引付けされた特定のドキュメントに関連する個々のグラフにトリプルを追加できるようになるため、これ以降のすべてのSEM_CONTAINS問合せは、それらのドキュメント検索基準で、これらのトリプルを検討できるようになります。

このプロシージャは、索引名とWHERE句テキストを受け入れ、追加のトリプルで注釈を付ける特定のドキュメントを識別します。たとえば、where_clauseは、'docId IN (1,2,3)'など、数値データを含む単純な述語として指定される場合があります。

例

次の例では、対応する個々のグラフにトリプルを追加することで、セマンティク索引ArticleIndexを使用して特定のドキュメントに注釈を付けます。

begin
sem_rdfctx.maintain_triples(
index_name      => 'ArticleIndex',
where_clause    => 'docid = 15',
rdfxml_content => sys.xmltype(
'<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:pred="http://myorg.com/pred/">
<rdf:Description rdf:about=" http://newscorp.com/Org/ExampleCorp">
<pred:hasShortName
rdf:datatype="http://www.w3.org/2001/XMLSchema#string">
Example
</pred:hasShortName>
</rdf:Description>
</rdf:RDF>'));
end;
/

SEM_RDFCTX.SET_DEFAULT_POLICY

書式

SEM_RDFCTX.SET_DEFAULT_POLICY(

index_name IN VARCHAR2,

policy_name IN VARCHAR2);

説明

複数のエクストラクタ・ポリシーで構成される、セマンティク索引のデフォルトのエクストラクタ・ポリシーを設定します。

パラメータ

index_name

ドキュメントのセマンティク索引の名前。

policy_name

指定されたセマンティク索引のデフォルトのエクストラクタ・ポリシーとして使用されるエクストラクタ・ポリシーの名前。index_nameを作成したCREATE INDEX文のPARAMETERS句にリストされるエクストラクタ・ポリシーの1つである必要があります。

使用方法

ドキュメントのセマンティク索引を作成する場合、複数のエクストラクタ・ポリシーをCREATE INDEX文のPARAMETERS句の名前のスペース区切りリストとして指定できます。4.3項「ドキュメントのセマンティク索引付け」の説明にあるとおり、エクストラクタ・ポリシーを名前で識別しないすべてのSEM_CONTAINS問合せのデフォルトのエクストラクタ・ポリシーとして、このリストの最初のポリシーが使用されます。SEM_RDFCTX.SET_DEFAULT_POLICYプロシージャを使用すると、索引に異なるデフォルトのポリシーを設定できます。

例

次の例では、ArticleIndex索引のデフォルトのエクストラクタ・ポリシーとして、CITY_EXTRを設定します。

begin
sem_rdfctx.set_default_policy (index_name => 'ArticleIndex',
policy_name => 'CITY_EXTR');
end;
/

SEM_RDFCTX.SET_EXTRACTOR_PARAM

書式

SEM_RDFCTX.SET_EXTRACTOR_PARAM(

param_key IN VARCHAR2,

patam_value IN VARCHAR2,

param_desc IN VARCHAR2);

説明

CalaisやGATEなど、外部情報エクストラクタを使用するようにOracle Databaseセマンティク索引付けサポートを構成します。

パラメータ

param_key

設定されるパラメータのキー。

param_value

設定されるパラメータの値。

param_desc

設定されるパラメータの短い説明。

使用方法

このプロシージャを使用するには、SYSDBAロールが必要です。

Calaisエクストラクタ・タイプ(4.9項を参照)を使用するには、次のパラメータの値を指定する必要があります。

- CALAIS_WS_ENDPOINT: CalaisのWebサービスのエンド・ポイント。

- CALAIS_KEY: Calaisのライセンス・キー。

- CALAIS_WS_SOAPACTION: Calais WebサービスのSOAPアクション。

General Architecture for Text Engineering (GATE)エクストラクタ・タイプ(4.10項を参照)を使用するには、次のパラメータの値を指定する必要があります。

- GATE_NLP_HOST: GATE NLPリスナーのホスト。

- GATE_NLP_PORT: GATE NLPリスナーのポート。

これらのパラメータの他に、情報エクストラクタを使用する、またはファイアウォールの外側にあるドキュメントを索引付けする場合は、HTTP_PROXYパラメータの値を指定する必要がある場合があります。

データベース・インスタンスには、これらのパラメータ用に1セットの値のみがあり、対応する情報エクストラクタを使用してセマンティク索引のすべてのインスタンスに使用されます。パラメータのいずれかの既存値を変更する必要がある場合、このプロシージャを使用できます。

例

例は、次の項を参照してください。

- 4.9項「Calaisエクストラクタ・タイプの構成」

- 4.10項「General Architecture for Text Engineering (GATE)の使用」

13 SEM_RDFSAパッケージのサブプログラム

SEM_RDFSAパッケージには、仮想プライベート・データベース(VPD)またはOracle Label Security (OLS)を使用してRDFデータへのファイングレイン・アクセス制御を提供するサブプログラム(ファンクションとプロシージャ)が含まれます。この章のサブプログラムを使用するには、第1章「Oracle Databaseセマンティク・テクノロジの概要」と第5章「RDFデータのファイングレイン・アクセス制御」に記載されている概念および使用情報について理解しておく必要があります。

この章では、サブプログラムに関するリファレンス情報を示します(サブプログラムのリストはアルファベット順です)。

SEM_RDFSA.ADD_VPD_CONSTRAINT

書式

SEM_RDFSA.ADD_VPD_CONSTRAINT(

policy_name IN VARCHAR2,

constr_name IN VARCHAR2,

match_pattern IN VARCHAR2,

apply_pattern IN VARCHAR2,

constr_group IN VARCHAR2 DEFAULT NULL);

説明

VPDポリシーにデータ・アクセス制約を追加します。

パラメータ

policy_name

既存のVPDポリシーの名前。

constr_name

VPDポリシーで定義される制約の大/小文字が区別されない一意の名前。

match_pattern

制約のターゲットを判断する一致パターン。

apply_pattern

アクセス制限を実施する制約の適用パターン。

constr_group

制約が属するグループの大/小文字が区別されない名前。

使用方法

このプロシージャは、VPDポリシーにデータ・アクセス制約を追加します。VPDポリシーの所有者のみが、ポリシーに新しい制約を追加できます。新しく追加された制約はすぐに有効になり、VPDポリシーに関連付けられているすべてのRDFモデルで問合せのために実施されます。

制約グループが、アプリケーション・コンテキスト(5.1.1項を参照)に基づいて実行時に選択的にアクティブ化または非アクティブ化できるように、ポリシーごとに指定される場合があります。制約グループのない制約は、常にアクティブです。このプロシージャに渡される一致および適用パターンの詳細は、5.1.3項を参照してください。

MDSYS.RDFVPD_POLICY_CONSTRAINTSビュー(5.1.6項)も参照してください。

VPDのサポートの詳細は、5.1項を参照してください。

例

次の例では、RDFクラスContractに対するデータ・アクセス制約をVPDポリシーに追加して、それに制約グループuserを割り当てます。

begin
sem_rdfsa.add_vpd_constraint(
policy_name   => 'contracts_policy',
constr_name   => 'andy_constraint_1',
match_pattern =>'{?contract  rdf:type
<http://www.myorg.com/classes/Contract>}',
apply_pattern => '{?contract  pred:hasMember
"sys_context('sa$appctx','app_user_uri'}"^^orardf:instruction }',
constr_group  => 'user');
end;
/

前述の例では、セキュアなアプリケーション・コンテキストを使用して、問合せを発行しているユーザーを識別し、その値を適用パターンにバインディングしてユーザーが特定の契約にアクセスできるようにします。名前空間sa$appctxを持つセキュアなアプリケーション・コンテキストでは、属性app_user_uriの値をログインしているユーザーを識別するURIに初期化することが予測されます。

次の例では、同じVPDポリシーにRDFプロパティhasContractValueに対するデータ・アクセス制約を追加して、それを制約グループvpに割り当てます。

begin
sem_rdfsa.add_vpd_constraint(
policy_name   => 'contracts_policy',
constr_name   => 'vp_access_to_contr_value',
match_pattern => '{?contract  pred:hasContractValue ?cvalue }',
apply_pattern => '{?contract  pred:drivenBy         ?dept .
?dept      pred:hasVP
"sys_context('sa$appctx','app_user_uri'}"^^orardf:instruction }',
constr_group  => 'vp');
end;
/

SEM_RDFSA.APPLY_OLS_POLICY

書式

SEM_RDFSA.APPLY_OLS_POLICY(

policy_name IN VARCHAR2,

rdfsa_options IN NUMBER DEFAULT SEM_RDFSA.SECURE_SUBJECT,

table_options IN VARCHAR2 DEFAULT 'ALL_CONTROL',

label_function IN VARCHAR2 DEFAULT NULL,

predicate IN VARCHAR2 DEFAULT NULL);

説明

セマンティク・データ・ストアにOLSポリシーを適用します。

パラメータ

policy_name

既存のOLSポリシーの名前。

rdfsa_options

RDFデータで有効にするファイングレイン・アクセス制御のモードを指定するオプション。RDFデータを保護するためのデフォルトのオプションは、トリプルの主語の位置に表示されるリソースに機密性ラベルを割り当てます。rdfsa_optionsパラメータを使用して「使用方法」の表13-1で定義されている定数の1つを指定することで、デフォルトを上書きできます。

table_options

ポリシー実施オプション。デフォルト値(ALL_CONTROL)は、このプロシージャでサポートされる唯一の値です。

label_function

デフォルトとして使用するラベル値を戻すファンクションを起動する文字列。

predicate

ラベルベースの述語と組み合せる追加の述語。

使用方法

このプロシージャで指定されるOLSポリシーは、列名をCTXT1として作成される必要があり、デフォルトのポリシー・オプションを使用する必要があります。ポリシー・オプションの詳細は、『Oracle Label Security管理者ガイド』を参照してください。

このプロシージャは、MDSYSスキーマで定義される複数の表でsa_policy_admin.apply_table_policyプロシージャを起動します。SEM_RDFSA.APPLY_OLS_POLICYプロシージャのパラメータtable_options、label_functionおよびpredicateは、sa_policy_admin.apply_table_policyプロシージャにある同じ名前のパラメータと同じセマンティクを持ちます。

rdfsa_optionsパラメータの場合、パッケージ定数を必要なオプションに対して指定できます。表13-1に、これらの定数および説明を示します。

表13-1 rdfsa_optionsパラメータのSEM_RDFSAパッケージ定数

定数

説明

SEM_RDFSA.SECURE_SUBJECT

トリプルの主語の位置に表示されるリソースに機密性ラベルを割り当てます。

SEM_RDFSA.SECURE_PREDICATE

トリプルの述語の位置に表示されるリソースに機密性ラベルを割り当てます。

SEM_RDFSA.SECURE_OBJECT

トリプルの目的語の位置に表示されるリソースに機密性ラベルを割り当てます。

SEM_RDFSA.TRIPLE_LEVEL_ONLY

トリプルレベル・セキュリティを適用します。適切なパフォーマンスを提供し、ラベルを個々のリソースに割り当てる必要をなくします。(My Oracle Supportから入手可能なパッチ9819833がインストールされている必要があります。)

SEM_RDFSA.OPT_DEFINE_BEFORE_USE

機密性ラベルがリソースに定義される前に、トリプルのRDFリソースの使用を制限します。このオプションが指定されない場合、ユーザーの最初の行のラベルは最初の使用でリソースのデフォルトのラベルとして使用されます。

SEM_RDFSA.OPT_RELAX_TRIPLE_LABEL

トリプル・ラベルとそのすべてのコンポーネントに関連付けられているラベル間に存在する優位関係を緩和します。このオプションを使用すると、ユーザーがすべてのトリプル・コンポーネントに対するREADアクセス権を持ち、トリプル・ラベルがコンポーネント・ラベルと関係がない場合にトリプルを定義できます。このオプションを使用しない場合、トリプル・ラベルは、少なくともそのすべてのコンポーネントのラベルを網羅する必要があります。

新しく挿入されたトリプルのカスタム・ラベルを生成するには、label_functionパラメータでファンクションを指定できます。ラベル・ファンクションはMDSYS.RDF_LINK$表に関連付けられ、この表の列は、次の例に示すように、ラベル・ファンクションへのパラメータとして構成される場合があります。

fgac_admin.new_triple_label(:new.model_id,
:new.start_node_id,
:new.p_value_id,
:new.canon_end_node_id)'

OLSポリシーは、異なる構造を持つ複数の表に適用されるため、predicateパラメータに割り当てられる述語の唯一有効な列の参照は、ラベル列CTXT1の参照です。OLSが既存のデータのセマンティク・データ・ストアで有効にされる場合、アクセス制限なしでこのデータの使用を継続できるように、'OR CTXT1 is null'の形式の述語を指定できます。

OLS対応セマンティク・データ・ストアは、複数のモデルで構成されるすべてのRDFトリプルで機密性ラベルを使用します。このようなトリプルへのユーザー・アクセスは、モデル・ビューおよびSEM_MATCH問合せを通して、OLSポリシーによって制限されます。さらに、アプリケーション表を所有しているユーザーとは無関係に、表の(タイプSDO_RDF_TRIPLE_Sの)トリプル列へのアクセスは、OLSポリシーによって完全なアクセス権限を持つユーザーに制限されます。

トリプルは、対応するアプリケーション表に対するINSERT権限を使用して特定のRDFモデルに挿入されます。新しいトリプルの機密性ラベルが、ユーザーのセッション・コンテキスト(最初の行のラベル)またはラベル・ファンクションを使用して生成されます。トリプルは、トリプル・コンポーネントに関連付けられているラベルを使用して、RDFポリシー違反に対して検証されます。トリプル情報にはアプリケーション表からアクセスできない場合がありますが、OLSポリシー制限を適用している間は、トリプルにアクセスするためにモデル・ビューに問い合せることができます。必要なポリシー権限(WRITEUP、WRITEACROSSなど)を持っていれば、モデル・ビューのCTXT1列を更新して、トリプルに割り当てられるラベルをリセットできます。新しいラベルは、トリプル・コンポーネントに関係するRDFポリシー違反に対して自動的に検証されます。モデル・ビューのCTXT1列に対するUPDATE権限はモデルの所有者に付与され、このユーザーはこの権限を他のユーザーに選択的に付与できます。

RDFモデルが完全なアクセス権を持つユーザー以外のスキーマで作成される場合は、モデル・オブジェクトに対する必要な権限(具体的には、アプリケーション表に対する読取り/書込みアクセス権、モデル・ビューへの読取りアクセス権、およびモデル・ビューのCTXT1列への書込みアクセス権)をメンテナンス操作のためにそれらのユーザーに付与できます。これらの操作には、モデルへのバルク・ロード、トリプルに割り当てられるすべての機密性ラベルのリセット、およびモデルを使用した伴意の作成が含まれます。

OLSポリシーを無効にするには、SEM_RDFSA.DISABLE_OLS_POLICYプロシージャを使用します。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、セキュアな主語およびセキュアな述語オプションを使用して、RDFデータへのセキュアなアクセスを有効にします。

begin
sem_rdfsa.apply_ols_policy(
policy_name   => 'defense',
rdfsa_options => sem_rdfsa.SECURE_SUBJECT+
sem_rdfsa.SECURE_PREDICATE);
end;
/

次の例では、(保護されているトリプル・コンポーネント(主語、述語または目的語)が、関連付けられている機密性ラベルで事前定義されている場合にのみユーザーがトリプルを定義できる) Define Before Useオプションを指定することによって、前述の例を拡張します。トリプルを挿入するユーザーがSEM_RDFSAパッケージに対する実行権限を持っていない場合に、この構成は有効です。

begin
sem_rdfsa.apply_ols_policy(
policy_name   => 'defense',
rdfsa_options => sem_rdfsa.SECURE_SUBJECT+
sem_rdfsa.SECURE_PREDICATE+
sem_rdfsa.OPT_DEFINE_BEFORE_USE);
end;
/

SEM_RDFSA.APPLY_VPD_POLICY

書式

SEM_RDFSA.APPLY_VPD_POLICY(

policy_name IN VARCHAR2,

model_name IN VARCHAR2);

説明

RDFモデルにVPDポリシーを適用します。

パラメータ

policy_name

既存のVPDポリシーの名前。

model_name

VPDポリシーを適用するモデルの名前。

使用方法

このプロシージャは、RDFモデルにVPDポリシーを適用します。VPDポリシーの所有者は、データベース・インスタンスのすべてのモデルにこれを適用できます。所有者は、SYS.DBMS_RLSパッケージに対するEXECUTE権限も持つ必要があります。

ポリシーがRDFモデルに適用された後、モデルに格納されているデータおよびこのモデルから推論されるデータには、SEM_MATCH操作でSPARQL問合せパターンを使用することでのみアクセスできます。データ・アクセスのその他の形式(モデル・ビューを通して、またはSEM_MATCH問合せの従来のグラフ・パターン構文を使用してなど)は使用できません。

VPDポリシーは、仮想モデルに参加しているモデルに適用されない場合があります。同様に、仮想モデルは、VPD対応モデルを含めるように定義されない場合があります。

MDSYS.RDFVPD_POLICIESビュー(5.1.4項)も参照してください。

VPDのサポートの詳細は、5.1項を参照してください。

例

次の例では、RDFモデルにVPDポリシーを適用します。

begin
sem_rdfsa.apply_vpd_policy(
policy_name => 'contracts_policy',
model_name  => 'contracts');
end;
/

SEM_RDFSA.CREATE_VPD_POLICY

書式

SEM_RDFSA.CREATE_VPD_POLICY(

policy_name IN VARCHAR2,

namespace_map IN RDF_ALIASES DEFAULT NULL,

policy_context IN VARCHAR2 DEFAULT NULL);

説明

ユーザー・スキーマに新しいVPDポリシーを作成します。

パラメータ

policy_name

VPDポリシーの名前。

namespace_map

VPD制約で使用される、名前空間およびその接頭辞のマッピング。

policy_context

VPDポリシーで定義される制約グループを具体的に管理するために作成されたコンテキストの名前。

使用方法

SYS.DBMS_RLSパッケージに対するEXECUTE権限を持つ必要があります。

ポリシーに関連付けられる名前空間マップは、SEM_RDFSA.MAINT_VPD_METADATAプロシージャを使用して追加されるポリシーのメタデータ文、およびSEM_RDFSA.ADD_VPD_CONSTRAINTプロシージャを使用して定義されるポリシーのデータ・アクセス制約で、その後使用される名前空間の接頭辞を定義するために使用される場合があります。

policy_contextパラメータに割り当てられるアプリケーション・コンテキストの名前は、実行時に制約グループを動的に管理するために使用されます。このようなコンテキストは、VPDポリシーと関連付ける前に、CREATE CONTEXTコマンドを使用して作成する必要があります。VPDポリシーで定義される各データ・アクセス制約は、属する制約グループの名前を指定できます。実行時に、制約グループの名前は、グループを選択的にアクティブにするためにpolicy_context値の名前と照合されます(詳細は、5.1.1項を参照してください)。

MDSYS.RDFVPD_POLICIESビュー(5.1.4項)も参照してください。

VPDのサポートの詳細は、5.1項を参照してください。

例

次の例では、名前空間マップでVPDポリシーを作成し、制約グループを管理するポリシー・コンテキストを関連付けます。

create context contracts_appctx using sec_admin.contracts_appctx;
begin
sem_rdfsa.create_vpd_policy(
policy_name  => 'contracts_policy',
namespace_map =>
mdsys.rdf_aliases(
mdsys.rdf_alias('','http://www.myorg.com/classes/'),
mdsys.rdf_alias('pred','http://www.myorg.com/pred/'),
mdsys.rdf_alias('emp','http://www.myorg.com/employee/')),
policy_context => 'contracts_appctx');
end;
/

SEM_RDFSA.DELETE_VPD_CONSTRAINT

書式

SEM_RDFSA.DELETE_VPD_CONSTRAINT(

policy_name IN VARCHAR2,

constr_name IN VARCHAR2);

説明

VPDポリシーからデータ・アクセス制約を削除します。

パラメータ

policy_name

既存のVPDポリシーの名前。

constr_name

VPDポリシーから削除する制約の大/小文字が区別されない一意の名前。

使用方法

このプロシージャは、VPDポリシーからデータ・アクセス制約を削除します。VPDポリシーの所有者のみが、ポリシーから制約を削除できます。

MDSYS.RDFVPD_POLICY_CONSTRAINTSビュー(5.1.6項)も参照してください。

VPDのサポートの詳細は、5.1項を参照してください。

例

次の例では、VPDポリシーcontracts_policyから、データ・アクセス制約vp_access_to_contr_valueを追加します。

begin
sem_rdfsa.delete_vpd_constraint(
policy_name   => 'contracts_policy',
constr_name   => 'vp_access_to_contr_value');
end;
/

SEM_RDFSA.DISABLE_OLS_POLICY

書式

SEM_RDFSA.DISABLE_OLS_POLICY;

説明

すでにセマンティク・データ・ストアに適用されている、または有効にされているOLSポリシーを無効にします。

パラメータ

(なし。)

使用方法

このプロシージャを使用すると、セマンティク・データ・ストアに適用されている、または有効にされているOLSポリシーを一時的に無効にできます。ポリシーを無効にするユーザーは、OLSポリシーを管理するために必要な権限を持つ必要があり、また、RDFデータに適用されるOLSポリシーにアクセスする必要もあります。

様々なRDFリソースおよびトリプルに割り当てられる機密性ラベルは保持され、OLSポリシーはこれらを実施するために再有効化される場合があります。OLSポリシーが無効である場合、特定のラベルを持つ新しいリソースを追加したり、既存のトリプルおよびリソースのラベルを更新することができます。

OLSポリシーを適用するには、SEM_RDFSA.APPLY_OLS_POLICYプロシージャを使用し、無効になっていたOLSポリシーを有効にするには、SEM_RDFSA.ENABLE_OLS_POLICYプロシージャを使用します。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、セマンティク・データ・ストアのOLSポリシーを無効にします。

begin
sem_rdfsa.disable_ols_policy;
end;
/

SEM_RDFSA.DROP_VPD_POLICY

書式

SEM_RDFSA.DROP_VPD_POLICY(

policy_name IN VARCHAR2);

説明

使用していないVPDポリシーを削除します。

パラメータ

policy_name

既存のVPDポリシーの名前。

使用方法

このプロシージャは、使用していないVPDポリシーを、そのメタデータおよび制約とともに永続的に削除します。VPDポリシーの所有者またはこの操作を実行するDBAロールを持つユーザーである必要があります。

VPDのサポートの詳細は、5.1項を参照してください。

例

次の例では、VPDポリシーcontracts_policyから、データ・アクセス制約vp_access_to_contr_valueを追加します。

begin
sem_rdfsa.drop_vpd_policy(
policy_name   => 'contracts_policy',
constr_name   => 'vp_access_to_contr_value');
end;
/

SEM_RDFSA.ENABLE_OLS_POLICY

書式

SEM_RDFSA.ENABLE_OLS_POLICY;

説明

すでに無効にされているOLSポリシーを有効にします。

パラメータ

(なし。)

使用方法

このプロシージャを使用すると、セマンティク・データ・ストアに対して無効にされているOLSポリシーを有効にできます。ポリシーを有効にするユーザーは、OLSポリシーを管理するために必要な権限を持つ必要があり、また、RDFデータに適用されるOLSポリシーにアクセスする必要もあります。

OLSポリシーを無効にするには、SEM_RDFSA.DISABLE_OLS_POLICYプロシージャを使用します。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、セマンティク・データ・ストアのOLSポリシーを有効にします。

begin
sem_rdfsa.enable_ols_policy;
end;
/

SEM_RDFSA.MAINT_VPD_METADATA

書式

SEM_RDFSA.MAINT_VPD_METADATA(

policy_name IN VARCHAR2,

t_subject IN VARCHAR2,

t_predicate IN VARCHAR2,

t_object IN VARCHAR2,

action IN VARCHAR2 DEFAULT 'ADD');

説明

主語、述語および目的語を持つRDFスキーマ文を受け入れることによって、VPDメタデータを保持します。

パラメータ

policy_name

既存のVPDポリシーの名前。

t_subject

メタデータのトリプルの主語。

t_predicate

メタデータのトリプルの述語。

t_object

メタデータのトリプルの目的語。

action

実行されるメンテナンス操作(ADD (メタデータに指定されたトリプルを追加)またはDELETE (メタデータから指定されたトリプルを削除))。

使用方法

このプロシージャは、RDFスキーマ文を受け入れ、そのディクショナリで適切なアクションを実行することによって、VPDポリシーに関連付けられているメタデータを保持します。VPDポリシーの所有者またはVPDポリシーへの完全なアクセス権を持つユーザーのみが、そのメタデータを保持できます。

このプロシージャを使用して追加できるメタデータ文のタイプは、t_predicateパラメータに割り当てられる用語によって決定されます。このパラメータで受け入れられる値は、次のとおりです。

http://www.w3.org/2000/01/rdf-schema#domain
http://www.w3.org/2000/01/rdf-schema#range
http://www.w3.org/2000/01/rdf-schema#subClassOf
http://www.w3.org/2000/01/rdf-schema#subPropertyOf
http://www.w3.org/2002/07/owl#equivalentProperty

MDSYS.RDFVPD_PREDICATE_MDATAおよびMDSYS.RDFVPD_RESOURCE_RELビューは、それぞれ5.1.7項および5.1.8項を参照してください。

VPDのサポートの詳細は、5.1項を参照してください。

例

次の例では、ProjectのサブクラスとしてContractを指定し、hasContractValueプロパティにドメイン情報を追加します。

begin
sem_rdfsa.maint_vpd_metadata(
policy_name => 'contracts_policy',
t_subject   => '<http://www.myorg.com/classes/Project>',
t_predicate => '<http://www.w3.org/2000/01/rdf-schema#subClassOf>',
t_object    => '<http://www.myorg.com/classes/Contract>',
action      => 'add');
end;

begin
sem_rdfsa.maint_vpd_metadata(
policy_name => 'contracts_policy',
t_subject   => '<http://www.myorg.com/property/hasConfValue>',
t_predicate => 'rdfs:domain',
t_object    => '<http://www.myorg.com/classes/Contract>');
end;

SEM_RDFSA.REMOVE_OLS_POLICY

書式

SEM_RDFSA.REMOVE_OLS_POLICY;

説明

セマンティク・データ・ストアからOLSポリシーを永続的に削除または分離します。

パラメータ

(なし。)

使用方法

OLSポリシーを管理するために必要な権限を持つ必要があり、また、RDFデータに適用されるOLSポリシーにアクセスする必要もあります。OLSポリシーがセマンティク・データ・ストアから分離されると、すでにトリプルおよびリソースに割り当てられているすべての機密性ラベルが失われます。

この操作は、特にRDFセキュリティ・ポリシーを保持するために作成されるオブジェクトを削除します。

OLSポリシーを適用するには、SEM_RDFSA.APPLY_OLS_POLICYプロシージャを使用します。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、すでにセマンティク・データ・ストアに適用されているOLSポリシーを削除します。

begin
sem_rdfsa.remove_ols_policy;
end;
/

SEM_RDFSA.REMOVE_VPD_POLICY

書式

SEM_RDFSA.REMOVE_VPD_POLICY(

policy_name IN VARCHAR2,

model_name IN VARCHAR2);

説明

RDFモデルからVPDポリシーを削除(分離)します。

パラメータ

policy_name

既存のVPDポリシーの名前。

model_name

VPDポリシーを適用するモデルの名前。

使用方法

このプロシージャは、RDFモデルからVPDポリシーを永続的に削除または分離します。VPDポリシーの所有者またはこの操作を実行するDBAロールを持つユーザーである必要があります。

VPDポリシーが削除された後、特定のモデルのファイングレイン・アクセス制御はオフにされ、モデル・ビューに対するSELECT権限を持つユーザーはモデルのすべてのデータにアクセスできます。

VPDのサポートの詳細は、5.1項を参照してください。

例

次の例では、RDFモデルからVPDポリシーを削除します。

begin
sem_rdfsa.remove_vpd_policy(
policy_name => 'contracts_policy',
model_name  => 'contracts');
end;
/

SEM_RDFSA.RESET_MODEL_LABELS

書式

SEM_RDFSA.RESET_MODEL_LABELS(

model_name IN VARCHAR2);

説明

モデルまたはグローバル・リソースに関連付けられているラベルをリセットします(関連付けられている1つ以上のモデルは空である必要があります)。

パラメータ

model_name

ラベルをリセットする必要があるモデルの名前、またはすべてのグローバル・リソースに関連付けられているラベルをリセットするための文字列RDF$GLOBAL。

使用方法

モデル名を指定する場合、モデルは空である必要があります。RDF$GLOBALを指定する場合、すべてのモデルは空である必要があります(つまり、RDFリポジトリにトリプルは存在しません)。

セマンティク・データ・ストアに適用されるOLSポリシーに関して完全なアクセス権限を持っている必要があります。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、Contractsモデルに関連付けられているすべてのリソースおよびそのラベルを削除します。

begin
sem_rdfsa.reset_model_labels(model_name => 'Contracts');
end;
/

SEM_RDFSA.SET_PREDICATE_LABEL

書式

SEM_RDFSA.SET_PREDICATE_LABEL(

model_name IN VARCHAR2,

predicate IN VARCHAR2,

label_string IN VARCHAR2);

説明

モデル・レベルの述語に、またはリポジトリ全体に機密性ラベルを設定します。

パラメータ

model_name

述語が属するモデルの名前、または同じラベルがすべてのモデルの述語の使用に適用される必要がある場合は文字列RDF$GLOBAL。

predicate

ラベルが割り当てられる必要がある述語。

label_string

文字列表現のOLS行ラベル。

使用方法

モデル名を指定する場合、この操作を実行するには、モデルへの読取りアクセス権およびSEM_RDFSAパッケージに対する実行権限が必要です。RDF$GLOBALを指定する場合、RDFデータに適用されるOLSポリシーに関して完全なアクセス権限が必要です。

ラベルが述語にすでに存在する場合、既存のラベルを上書きするには指定されたラベルへのアクセス権およびOLSポリシー権限が必要です。SECURE_PREDICATEオプションは、RDFデータに対して有効にする必要があります。

既存の述語ラベルがこの操作で更新される場合、この述語を使用するトリプルのラベルは新しい述語ラベルよりもすべて優位である必要があります。唯一の例外は、OPT_RELAX_TRIPLE_LABELオプションがOLS対応RDFデータで選択されている場合です。

RDF$GLOBALを指定する場合、モデル全体にわたる一意の機密性ラベルを持つグローバル述語が作成されます。同じ述語がすでに1つ以上のモデルで定義されている場合、グローバル・ラベルはそのようなラベルすべてよりも優位であり、モデル固有のラベルは特定の述語用に置き換えられます。

述語のラベルが設定された後、この述語を持つ新しいトリプルは、トリプル・ラベル(ユーザーの最初の行のラベルから、またはラベル・ファンクションを使用して初期化される場合があります)が、述語の機密性ラベルよりも優位である場合にのみ追加できます。この優位関係はOPT_RELAX_TRIPLE_LABELオプションで緩和できますが、その場合には、ユーザーは述語を使用して新しいトリプルを定義できるように述語への読取りアクセス権を少なくとも持っている必要があります。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、Contractsモデルに述語ラベル、およびデータベース・インスタンスのすべてのモデルに別の述語ラベルを設定します。

begin
sem_rdfsa.set_predicate_label(
model_name   => 'contracts',
predicate    => '<http://www.myorg.com/pred/hasContractValue>',
label_string => 'TS:US_SPCL');
end;
/

begin
sem_rdfsa.set_predicate_label(
model_name   => 'rdf$global',
predicate    => '<http://www.myorg.com/pred/hasStatus>',
label_string => 'SE:US_SPCL:US');
end;
/

SEM_RDFSA.SET_RDFS_LABEL

書式

SEM_RDFSA.SET_RDFS_LABEL(

label_string IN VARCHAR2,

inf_override IN VARCHAR2);

説明

RDFSスキーマ要素に機密性ラベルを設定します。

パラメータ

label_string

すべてのRDFスキーマ構成要素の機密性ラベルとして使用される、文字列表現のOLS行ラベル。

inf_override

推論されたトリプルのラベルを生成するためのオーバーライドとして使用されるOLS行ラベル。

使用方法

このプロシージャは、RDFスキーマ・リソース(通常、URIのhttp://www.w3.org/1999/02/22-rdf-syntax-ns#およびhttp://www.w3.org/2000/01/rdf-schema#接頭辞によって認識されます)に関連付けられている機密性ラベルを設定またはリセットします。これらのリソースへの制限付きアクセス権を使用して機密性ラベルを割り当てることができるため、新しいRDFクラスの作成や新規プロパティの追加などの操作は、より高い権限を持つユーザーに制限できます。

RDFデータに適用されるポリシーに関して完全なアクセス権限を持っている必要があります。

RDFスキーマ要素は、緩和されたトリプル・ラベル・オプションを暗黙的に使用するため、主語、述語または目的語にRDFSおよびOWLの構成要素を使用するトリプルが、スキーマ構成要素に関連付けられているラベルよりも優位である機密性ラベルを持つことは強制されません。したがって、新しいRDFクラスおよびプロパティを定義できるユーザーは、少なくともスキーマ要素への読取りアクセス権を持っている必要があります。

RDFスキーマ要素が推論されたトリプルで参照される場合、システム定義およびカスタムのラベル・ジェネレータは、推論されたトリプルの適切なラベルを決定する際に、推論オーバーライド・ラベルを検討します。カスタム・ラベル・ジェネレータが使用される場合、RDFスキーマ要素が関係していると、このオーバーライド・ラベルが実際のラベルのかわりに渡されます。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、すべてのRDFスキーマ要素に、一意のコンパートメントを持つラベルを設定します。新しいRDFクラスおよびプロパティを定義できるユーザーは、コンパートメントへの独占的なメンバーシップを持つことが求められます。

begin
sem_rdfsa.set_rdfs_label(
label_string  => 'SE:RDFS:',
inf_override  => 'SE:US_SPCL:US');
end;
/

SEM_RDFSA.SET_RESOURCE_LABEL

書式

SEM_RDFSA.SET_RESOURCE_LABEL(

model_name IN VARCHAR2,

resource_uri IN VARCHAR2,

label_string IN VARCHAR2,

resource_pos IN VARCHAR2 DEFAULT 'S');

説明

トリプルの主語や目的語の位置で使用される場合があるリソースに機密性ラベルを設定します。

パラメータ

model_name

リソースが属するモデルの名前、または同じラベルがすべてのモデルのリソースの使用に適用される必要がある場合は文字列RDF$GLOBAL。

resource_uri

1つ以上のトリプルの主語または目的語として使用される場合があるリソースのURI。

label_string

文字列表現のOLS行ラベル。

resource_pos

トリプル内のリソースの位置(S、OまたはS,O)。同じリソースに対して、最大2つの別々のラベル(リソースがトリプルの主語の位置で使用される場合に考慮するラベルおよび目的語の位置に表示される場合に考慮するラベル)を指定できます。値S、OまたはS,Oは、それぞれ、主語、目的語、または主語および目的語の両方の位置のリソースにラベルを設定します。

使用方法

モデル名を指定する場合、この操作を実行するには、モデルへの読取りアクセス権およびSEM_RDFSAパッケージに対する実行権限が必要です。RDF$GLOBALを指定する場合、RDFデータに適用されるOLSポリシーに関して完全なアクセス権限が必要です。

ラベルが述語にすでに存在する場合、既存のラベルを上書きするには指定されたラベルへのアクセス権およびOLSポリシー権限が必要です。SECURE_PREDICATEオプションは、RDFデータに対して有効にする必要があります。

既存のリソース・ラベルがこの操作で更新される場合、指定された位置でこのリソースを使用するトリプルのラベルは新しいリソース・ラベルよりもすべて優位である必要があります。唯一の例外は、OPT_RELAX_TRIPLE_LABELオプションがOLS対応RDFデータで選択されている場合です。

RDF$GLOBALを指定する場合、モデル全体にわたる一意の機密性ラベルを持つグローバル・リソースが作成されます。同じリソースがすでに1つ以上のモデルの同じトリプルの位置で定義されている場合、グローバル・ラベルはそのようなラベルすべてよりも優位であり、モデル固有のラベルはその位置にある特定のリソース用に置き換えられます。

述語のラベルが設定された後、指定された位置のリソースを使用する新しいトリプルは、トリプル・ラベルがリソースの機密性ラベルよりも優位である場合にのみ追加できます。この優位関係はOPT_RELAX_TRIPLE_LABELオプションで緩和できますが、その場合には、ユーザーはリソースへの読取りアクセス権を少なくとも持っている必要があります。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、複数のリソースにその位置に基づいて機密性ラベルを設定します。

begin
sem_rdfsa.set_resource_label(
model_name   => 'contracts',
resource_uri => '<http://www.myorg.com/contract/projectHLS>',
label_string => 'SE:US_SPCL:US',
resource_pos => 'S,O');
end;
/

begin
sem_rdfsa.set_resource_label(
model_name   => 'rdf$global',
resource_uri => '<http://www.myorg.com/contract/status/Complete>',
label_string => 'SE:US_SPCL:US',
resource_pos => 'O');
end;
/

SEM_RDFSA.SET_RULE_LABEL

書式

SEM_RDFSA.SET_RULE_LABEL(

rule_base IN VARCHAR2,

rule_name IN VARCHAR2,

label_string IN VARCHAR2);

説明

ルールベースに属するルールに機密性ラベルを設定します。

パラメータ

rule_base

既存のRDFルールベースの名前。

rule_name

ルールベースに属するルールの名前。

label_string

文字列表現のOLS行ラベル。

使用方法

ルールに割り当てられる機密性ラベルは、適切なラベル・ジェネレータ・オプションが選択されている場合に、推論されたトリプルにラベルを生成するために使用されます。

ルールベースへのアクセス権を持っている必要があり、また、RDFSルールベースのシステム定義のルールにラベルを割り当てることができるOLSポリシーに関して完全なアクセス権限を持っている必要があります。

ユーザー定義のルールに割り当てられるラベルのサポートはありません。

OLSのサポートの詳細は、5.2項を参照してください。

例

次の例では、RDFSルールに機密性ラベルを割り当てます。

begin
sem_rdfsa.set_rule_label (rule_base    => 'RDFS',
rule_name    => 'RDF-AXIOMS',
label_string => 'SE:US_SPCL:');
end;
/

A セマンティク・テクノロジ・サポートの有効化、ダウングレードまたは削除

この付録では、現在のOracle DatabaseリリースでOracleセマンティク・テクノロジ・サポートに関連する任意の型、シノニムまたはPL/SQLパッケージを使用するために実行する必要がある手順について説明します。この手順を実行する前に、1つ以上のスクリプトを実行し、Spatialがインストールされていること、およびPartitioningオプションが使用可能になっていることを確認する必要があります。これらの要件は、A.1項で説明されています。

この付録では、セマンティク・テクノロジ・サポートを有効にした後、次のいずれかを実行する必要がある場合、その手順についても説明します。

- A.2項の説明にあるとおり、以前のOracle Databaseリリースに付属のセマンティク・テクノロジ・サポートをダウングレードします。

- A.3項の説明にあるとおり、データベースからセマンティク・テクノロジのすべてのサポートを削除します。

A.1 セマンティク・テクノロジ・サポートの有効化

現在のOracle DatabaseリリースでOracleセマンティク・テクノロジ・サポートに関する任意の型、シノニムまたはPL/SQLパッケージを使用するには、状況に応じた次の各項の手順に従って、この機能を新しいOracle Databaseインストールにインストールするか、この機能を以前のリリースからアップグレードする必要があります。

- A.1.1項「新規データベース・インストールでのセマンティク・テクノロジ・サポートの有効化」

- A.1.2項「リリース11.1からのセマンティク・テクノロジ・サポートのアップグレード」

- A.1.3項「リリース10.2からのセマンティク・テクノロジ・サポートのアップグレード」

リリース11.2.0.2.0へのアップグレード後に、セマンティク・テクノロジのインストールが無効になっている場合は、A.1.4項「リリース11.2.0.2: セマンティク・テクノロジのインストールが無効になっている場合の必要なアクション」を参照してください。

また、A.1.5項の説明にあるとおり、Spatialがインストール済で、Partitioningオプションが有効化されていることを確認する必要があります。

A.1.1 新規データベース・インストールでのセマンティク・テクノロジ・サポートの有効化

Oracle Databaseリリース11.2の新規インストールでセマンティク・テクノロジ・サポートを有効化するには(または、A.1.3項の説明にあるとおり、RDFネットワークが存在しない場合に、リリース10.2からアップグレードするには)、次の手順を実行します。

1. SYSDBA権限を持つSYSユーザーとしてデータベースに接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

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

- Linuxの場合: @$ORACLE_HOME/md/admin/catsem.sql

- Windowsの場合: @%ORACLE_HOME%\md\admin\catsem.sql

セマンティク・ネットワークがすでに存在する場合、またはセマンティク・テクノロジの型、表、PL/SQLパッケージがすでに存在する場合、catsem.sqlスクリプトはエラーで終了します。

スクリプトが正常に実行された場合、次の列値を持つ行がMDSYS.RDF_PARAMETER表に挿入されます。

- 名前空間: MDSYS

- 属性: SEM_VERSION

- 値: (112で始まる文字列)

- 説明: VALID

6.1項「RDFデータに対するWorkspace Managerサポートの有効化」の説明にあるとおり、Workspace ManagerでRDFデータを使用する場合、catsem.sqlを実行した後に適切なスクリプトを実行する必要もあります。

A.1.2 リリース11.1からのセマンティク・テクノロジ・サポートのアップグレード

リリース11.1のセマンティク・テクノロジ・サポートが含まれるOracle Databaseリリース11.1からのアップグレードでは、データベースがアップグレードされると、セマンティク・テクノロジ・サポートがリリース11.2に自動的にアップグレードされます。6.1項「RDFデータに対するWorkspace Managerサポートの有効化」の説明にあるとおり、Workspace ManagerでRDFデータを使用する場合、セマンティク・テクノロジ・サポートのアップグレードを実行した後に適切なスクリプトを実行する必要もあります。

ただし、既存のリリース11.1のRDFネットワークにxsd:float、xsd:double、xsd:booleanまたはxsd:timeの型付きリテラル値を含むトリプルがある場合は、RDFデータの移行も必要になります。

RDFデータを移行する必要があるかどうかを調べるには、DBA権限を持つユーザーとしてデータベースに接続し、次のようにMDSYS.RDF_PARAMETER表を問い合せます。

SELECT namespace, attribute, value FROM mdsys.rdf_parameter
WHERE namespace='MDSYS'
AND attribute IN ('FLOAT_DOUBLE_DECIMAL',
'XSD_TIME', 'XSD_BOOLEAN',
'DATA_CONVERSION_CHECK');

FLOAT_DOUBLE_DECIMAL属性、XSD_TIME属性またはXSD_BOOLEAN属性に文字列値INVALIDがある場合、またはDATA_CONVERSION_CHECK属性に文字列値FAILED_UNABLE_TO_LOCK_APPLICATION_TABLES、FAILED_INSUFFICIENT_WORKSPACE_PRIVILEGESまたはFAILED_OLS_POLICIES_ARE_ENABLEDがある場合は、RDFデータを移行する必要があります。

ただし、FLOAT_DOUBLE_DECIMAL属性、XSD_TIME属性、XSD_BOOLEAN属性が存在しないか、文字列値VALIDがなく、DATA_CONVERSION_CHECK属性が存在しない場合は、RDFデータを移行する必要はありません。ただし、セマンティク・ネットワークに空のRDFリテラルがある場合は、A.1.2.1項「空のRDFリテラルの処理」を参照し、既存の空のリテラルを新しい形式に移行することを選択した場合は、この項の手順に従います。

RDFデータを移行するには、次の手順に従います。

1. SYSDBA権限を持つSYSユーザーとしてデータベースに接続し(SYS AS SYSDBAを使用して、SYSアカウントのパスワードを求められたら入力し)、SET CURRENT_SCHEMA=MDSYSを入力します。

2. ユーザーMDSYSに次の権限があることを確認します。

- セマンティク・ネットワークのすべてのアプリケーション表へのINSERT権限

- ALTER ANY INDEX権限(オプション: ドキュメントのセマンティク索引付けが使用されている場合のみ必要)

- バージョン対応アプリケーション表が変更されたワークスペースに対するACCESS権限(オプション: RDFデータにWorkspace Managerを使用する場合のみ必要)

3. RDFデータに対するOLSポリシーを一時的に無効化します(オプション: RDFデータにOLSが使用されている場合のみ必要)。OLSポリシーは、convert_old_rdf_dataを実行した後に、再度有効にできます。

4. SQL*Plusを起動します。既存の空のリテラルを新しい形式に変換することなくRDFデータを移行する(A.1.2.1項を参照)には、次の文を入力します。

EXECUTE sdo_rdf_internal.convert_old_rdf_data;

RDFデータを移行し、既存の空のリテラルも新しい形式に変換する場合は、convert_old_rdf_dataにflagsパラメータ('CONVERT_ORARDF_NULL'に設定)を付けてコールします。また、オプションでtablespace_nameパラメータを使用し、データ移行中に中間表を作成するときに使用する表領域を指定できます。たとえば次の文は、古いセマンティク・データを移行し、既存の"orardf:null "値を""に変換して、中間表にMY_TBS表領域を使用します。

EXECUTE sdo_rdf_internal.convert_old_rdf_data(
flags=>'CONVERT_ORARDF_NULL',
tablespace_name=>'MY_TBS');

セマンティク・ネットワークにxsd:float、xsd:double、xsd:timeまたはxsd:booleanの型付きリテラルを使用する(または使用の影響を受ける)多数のトリプルが含まれている場合、sdo_rdf_internal.convert_old_rdf_dataプロシージャの実行に非常に長い時間がかかることがあります。

5. 次の文を入力します。

- Linuxの場合: @$ORACLE_HOME/md/admin/semrelod.sql

- Windowsの場合: @%ORACLE_HOME%\md\admin\semrelod.sql

注意:
リリース11.2にアップグレードした後に、sdo_rdf_internal.convert_old_rdf_dataプロシージャとsemrelod.sqlスクリプトが実行されなかった場合、SEM_MATCH問合せの実行時にORA-00904 (無効な識別子)エラーが発生することがあります。

A.1.2.1 空のRDFリテラルの処理

リリース11.2では、値が空のRDFリテラルを処理する方法が変更されました。以前のリリースでは、値が空のリテラルは"orardf:null "に変換されていました。リリース11.2では、そのような値は変更されることなく(""のまま)格納されます。ただし、既存の"orardf:null "値を""に移行するかどうかはオプションです。

"orardf:null "値がセマンティク・ネットワークに存在するかどうかを調べるには、DBA権限を持つユーザーとしてデータベースに接続し、次のようにMDSYS.RDF_PARAMETER表を問い合せます。

SELECT namespace, attribute, value FROM mdsys.rdf_parameter
WHERE namespace='MDSYS'
AND attribute = 'NULL_LITERAL';

NULL_LITERAL属性に値EXISTSがある場合、セマンティク・ネットワークに"orardf:null "値が存在することになります。

A.1.3 リリース10.2からのセマンティク・テクノロジ・サポートのアップグレード

リリース10.2のセマンティク・テクノロジ・サポートが含まれるOracle Databaseリリース10.2からのアップグレードでは、RDFネットワークが存在するかどうかで必要なアクションが異なります。

RDFネットワークが存在しない場合は、この項の残りの部分をスキップして、A.1.1項「新規データベース・インストールでのセマンティク・テクノロジ・サポートの有効化」の指示に従ってください。

RDFネットワークが存在する場合は、Oracle Databaseのアップグレード後に次の手順を実行します。

1. SYSDBA権限を持つSYSユーザーとしてデータベース(リリース11.2)に接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

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

- Linuxの場合: @$ORACLE_HOME/md/admin/catsem10i.sql

- Windowsの場合: @%ORACLE_HOME%\md\admin\catsem10i.sql

catsem10i.sqlスクリプトでリリース11.2のセマンティク・テクノロジ・サポートを有効化し、リリース10.2からリリース11.2の形式にRDFデータを移行します。既存のリリース10.2のRDFネットワークに大量のRDFデータが含まれている場合は、スクリプトの実行に時間がかかることがあります。

A.1.4 リリース11.2.0.2: セマンティク・テクノロジのインストールが無効になっている場合の必要なアクション

リリース11.2.0.2.0へのアップグレード後にセマンティク・テクノロジのインストールが無効である場合、追加アクションが必要になることがあります(リリース11.2.0.3以降にアップグレードする場合は、この問題は発生しません)。次のいずれかまたは両方に該当する場合は、リリース11.2.0.2.0へのアップグレード後にアクションが必要です。

- MDSYS.RDF_PARAMETER表に次の値を持つ行が存在する。

MDSYS   SEM_VERSION   11202   INVALID

- 次の問合せによって戻される行で、STATUS列の値がINVALIDである。

SELECT object_name, status FROM all_objects WHERE object_name = 'SEMCONTEXTINDEXMETHODS' or object_name = 'PRLLIDX_CREATE';

このような場合は、SYSDBAとして次の一連のコマンドを入力し、インストールのアップグレードを完了します。

SQL> @ $ORACLE_HOME/md/admin/sdordfctx.sql
SQL> @ $ORACLE_HOME/md/admin/semrelod.sql
SQL> EXECUTE sys.validate_sdo;

前述のコマンドに関する注意事項:

- sdordfctx.sqlの実行時における、ORA-01921、ORA-02303、ORA-00955、ORA-29809の各エラーは無視してかまいません。

- sys.validate_sdoを実行するのは、SDOが無効になっているために、セマンティク・テクノロジが無効化されていると考えられる場合にのみ必要ですが、いずれにしてもsys.validate_sdoを実行して問題ありません。

前述のコマンドを実行したら、MDSYS.RDF_PARAMETER表に次の値を持つ行があるかどうかをチェックして、セマンティク・テクノロジのインストールが有効になったかどうかを確認します。

MDSYS   SEM_VERSION   11202   VALID

A.1.5 SpatialおよびPartitioningの要件

Oracle Spatialは、RDFおよびOWLの機能を使用する前にインストールする必要があります。Oracle Locatorだけでは不十分です。SpatialおよびLocatorの詳細は、『Oracle Spatial開発者ガイド』を参照してください。

Partitioningオプションは、RDFおよびOWLの機能を使用する前に有効にする必要があります。Partitioningオプションに関するライセンス情報は、『Oracle Databaseライセンス情報』を参照してください。パーティショニングの使用に関する情報は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

A.2 以前のリリースへのセマンティク・テクノロジ・サポートのダウングレード

この項では、セマンティク・テクノロジ・サポートをダウングレードする方法について、Oracle Databaseのリリース11.1や10.2へのダウングレードとあわせて説明します。

まれに必要になる場合を除き、ダウングレードはしないことをお薦めします。以前のリリースにダウングレードすると、その間のリリースで行われたバグ・フィックスや機能拡張のメリットが得られないことになります。

RDFデータのWorkspace Managerサポートを有効にした場合、6.1.1項の説明にあるとおり、データベースのセマンティク・テクノロジ・サポートをダウングレードする前に、そのサポートを削除する必要があります。

A.2.1 リリース11.1のセマンティク・テクノロジ・サポートへのダウングレード

Oracle Databaseリリース11.1にダウングレードする必要がある場合、データベースをダウングレードすると、セマンティク・テクノロジ・コンポーネントは自動的にダウングレードされます。ただし、リリース11.2に固有のRDFデータまたはOWLデータ(以前のバージョンでサポートされない、リリース11.2のRDF/OWLの永続的な構造)は、データベースとリリース11.1の互換性のために、ダウングレードを実行する前に削除する必要があります。

仮想モデルは、2008年11月にMy Oracle Support (MetaLink)で導入されたリリース11.1.0.7.0のパッチ(番号: 7600122)を介してのみ使用できるため、ダウングレード時に保持されません。仮想モデルを使用するには、ダウングレード後にこのパッチを再適用して、仮想モデルを再作成する必要があります。semvmrecreate.sqlスクリプトを実行して、リリース11.2のセマンティク・ネットワークに存在していた仮想モデルを自動的に再作成するスクリプトを生成しておき、それを後で(ダウングレード後に)使用すると便利です。そのためには、データベースをダウングレードする前に次の手順を実行します。

1. SYSDBA権限を持つSYSユーザーとしてデータベース(リリース11.2)に接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

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

- Linuxの場合: @$ORACLE_HOME/md/admin/semvmrecreate.sql /my_dir_path/my_vm_recreate.sql

- Windowsの場合: @%ORACLE_HOME%\md\admin\semvmrecreate.sql \my_dir_path\my_vm_recreate.sql

ここで、my_dir_pathはmy_vm_recreate.sqlスクリプト・ファイルの作成先のパスです。(必要に応じて、スクリプトのファイル名を変更できます。)

リリース11.1と互換性のないリリース11.2のRDFデータがあるかどうかをチェックするには、次の手順を実行します。

1. SYSDBA権限を持つSYSユーザーとしてデータベース(リリース11.2)に接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

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

SET SERVEROUT ON
EXECUTE SDO_SEM_DOWNGRADE.CHECK_111_COMPATIBLE;

リリース11.1と互換性のないRDFデータがある場合は、プロシージャによってエラーが生成され、互換性のないデータのリストが表示されます。この場合、データベースをダウングレードした後で、次のようにsemrelod111.sqlスクリプトを実行する必要があります。

1. リリース11.2のデータベースで、次の場所にあるsemrelod111.sqlファイルのコピーを保存します。

- Linuxの場合: $ORACLE_HOME/md/admin/semrelod111.sql

- Windowsの場合: %ORACLE_HOME%\md\admin\semrelod111.sql

2. ダウンロード後に再作成する仮想モデルがある場合は、この項の前半の説明にあるように、semvmrecreate.sqlスクリプトを実行します(まだ実行していない場合)。

3. リリース11.2のリリース固有のRDFデータまたはOWLデータ(仮想モデルを含む)がある場合は、この項の前半の説明にあるように、それらを削除します(まだ実行していない場合)。

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

5. リリース11.1のデータベースで、semrelod111.sqlファイルの保存コピーを次の場所にコピーします。

- Linuxの場合: $ORACLE_HOME/md/admin/

- Windowsの場合: %ORACLE_HOME%\md\admin\

6. SYSDBA権限を持つSYSユーザーとしてリリース11.1のデータベースに接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

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

- Linuxの場合: @$ORACLE_HOME/md/admin/semrelod111.sql

- Windowsの場合: @%ORACLE_HOME%\md\admin\semrelod111.sql

semrelod111.sqlスクリプトが正常に完了すると、リリース11.1のOracleセマンティク・テクノロジ・サポートが有効になり、使用する準備が整います(リリース11.1対応のデータはすべて保持されています)。

8. 仮想モデルのサポートを有効にする場合は、リリース11.1.0.7の個別パッチ番号7600122を適用します。

9. ダウングレード後に仮想モデルを再作成するためのmy_vm_recreate.sqlスクリプトを作成してある場合は、my_dir_pathの場所に移動して、SYSDBA権限を持つSYSユーザーとしてデータベースに接続し、SQL*Plusを起動し、my_vm_recreate.sqlスクリプトを実行します。

A.2.2 リリース10.2のセマンティク・テクノロジ・サポートへのダウングレード

Oracle Databaseリリース10.2にダウングレードする必要がある場合は、A.2.1項の指示に従ってリリース11.1にダウングレードし、この項の残りの指示(リリース11.1のマニュアルから抜粋)にあるとおり、リリース11.1からリリース10.2にダウングレードします。

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

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

- 伴意グラフ・データは保存されません(Oracle Databaseリリース10.2のRDF推論APIを使用して同じ情報を生成できるためです)。

- OWLに関連するルールベースまたはルール索引は保存されません(Oracle Databaseリリース10.2ではOWLボキャブラリがサポートされないためです)。

次の手順を実行します。

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

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

EXECUTE SDO_SEM_DOWNGRADE.PREPARE_DOWNGRADE_FROM_11;

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

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

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

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

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

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

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

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

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

A.3 セマンティク・テクノロジ・サポートの削除

この項では、データベースからセマンティク・テクノロジ・サポートを削除する方法について説明します。特別な理由がないかぎり、このサポートは削除しないことを強くお薦めします。このサポートを削除すると、アプリケーションまたはデータベース・ユーザーはセマンティク・テクノロジ・サポートに関連する型、シノニムまたはPL/SQLパッケージを使用できなくなります。

RDFデータのWorkspace Managerサポートを有効にした場合、6.1.1項の説明にあるとおり、データベースからセマンティク・テクノロジ・サポートを削除する前に、そのサポートを削除する必要があります。

データベースからセマンティク・テクノロジ・サポートを削除するには、次の手順を実行します。

1. SYSDBA権限を持つSYSユーザーとしてデータベース(リリース11.2)に接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

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

- Linuxの場合: @$ORACLE_HOME/md/admin/semremov.sql

- Windowsの場合: @%ORACLE_HOME%\md\admin\semremov.sql

semremov.sqlスクリプトは、セマンティク・ネットワークを削除し、セマンティク・テクノロジの型、表およびPL/SQLパッケージも削除します。

B 空間問合せのSEM_MATCHサポート

この付録では、SEM_MATCHでの空間問合せを実行するためのSPARQL拡張ファンクションのリファレンス情報を示します。これらのファンクションを使用するには、1.6.6項「空間のサポート」で説明されている概念を理解する必要があります。

この付録には、次のファンクションが含まれています。

- orageo:area

- orageo:buffer

- orageo:centroid

- orageo:convexHull

- orageo:difference

- orageo:distance

- orageo:intersection

- orageo:length

- orageo:mbr

- orageo:nearestNeighbor

- orageo:relate

- orageo:union

- orageo:withinDistance

- orageo:xor

orageo:area

書式

orageo:area(geom1 : orageo:WKTLiteral, unit : Literal) : xsd:decimal

説明

指定された測定単位でgeom1の面積を戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

unit

測定単位。MDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で(たとえば"unit=SQ_KM")を指定します。測定単位の仕様の詳細については、『Oracle Spatial開発者ガイド』の測定単位の項を参照してください。

使用方法

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_AREAファンクションも参照してください。

例

次の例では、10,000平方kmを超える面積の米国下院議員選挙区ポリゴンを検出します。

SELECT name, cdist
FROM table(sem_match(
'{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:area(?cgeom, "unit=SQ_KM") > 10000) }'
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:buffer

書式

orageo:buffer(geom1 : orageo:WKTLiteral, distance : xsd:decimal, unit : Literal) : orageo:WKTLiteral

説明

ジオメトリの周りまたは内部の、指定された距離にあるバッファ・ポリゴンを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

distance

距離値。距離値。値が正の場合、バッファはgeom1の周りに生成され、値が負の場合(ポリゴンに対してのみ有効)、バッファはgeom1の内部に生成されます。

unit

測定単位。MDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で(たとえば"unit=KM")を指定します。測定単位の仕様の詳細については、『Oracle Spatial開発者ガイド』の測定単位の項を参照してください。

使用方法

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_BUFFERファンクションも参照してください。

例

次の例では、指定された点の周り100kmのバッファの内部にある米国下院議員選挙区ポリゴンを検出します。

SELECT name, cdist
FROM table(sem_match(
'{ # HINT0={LEADING(?cgeom)}
?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (
orageo:relate(?cgeom,
orageo:buffer("POINT(-71.46444 42.7575)"^^orageo:WKTLiteral,
100, "unit=KM"),
"mask=inside")) }'
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:centroid

書式

orageo:centroid(geom1 : orageo:WKTLiteral) : orageo:WKTLiteral

説明

geom1の中心である点ジオメトリを戻します。(中心は「重心」とも呼ばれます。)

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

使用方法

複数のオブジェクトで構成される入力ジオメトリの場合、ジオメトリ・オブジェクトの各ポリゴンの面積によって結果が重み付けされます。ジオメトリ・オブジェクトにポリゴンおよび点が混在する場合、中心の計算では点が使用されません。ジオメトリ・オブジェクトがすべて点で構成される場合、それらの点は均等に重み付けされます。

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_CENTROIDファンクションも参照してください。

例

次の例では、中心が、指定された点の200km以内にある米国下院議員選挙区ポリゴンを検出します。

SELECT name, cdist
FROM table(sem_match(
'{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:withinDistance(orageo:centroid(?cgeom),
"POINT(-71.46444 42.7575)"^^orageo:WKTLiteral,
"distance=200 unit=KM")) } '
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:convexHull

書式

orageo:convexHull(geom1 : orageo:WKTLiteral) : orageo:WKTLiteral

説明

geom1の凸型部分を表現するポリゴンタイプ・オブジェクトを戻します。(凸型とは、ジオメトリ・オブジェクトを完全に囲む最小ポリゴンを作成するために、使用する直線の辺をできるだけ少なくした、ジオメトリ・オブジェクトを完全に囲む単純な凸型のポリゴンです)。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

使用方法

凸型は、複雑なジオメトリ・オブジェクトの近似値を取る場合に便利です。

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_CONVEX_HULLファンクションも参照してください。

例

次の例では、凸型が、指定された点を含む米国下院議員選挙区ポリゴンを検出します。

SELECT name, cdist
FROM table(sem_match(
'{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:relate(orageo:convexHull(?cgeom),
"POINT(-71.46444 42.7575)"^^orageo:WKTLiteral,
"mask=contains")) } '
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:difference

書式

orageo:difference(geom1 : orageo:WKTLiteral, geom2 : orageo:WKTLiteral) : orageo:WKTLiteral

説明

geom1とgeom2で位相的に差(MINUS演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

使用方法

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_UNIONファンクションも参照してください。

例

次の例では、中心が、2つの指定されたポリゴンの差の内部にある米国下院議員選挙区ポリゴンを検出します。

SELECT name, cdist
FROM table(sem_match(
'{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:relate(orageo:centroid(?cgeom),
orageo:difference("Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^orageo:WKTLiteral,
"Polygon((-83.2 34.3, -83.0 34.3, -83.0 34.5,
-83.2 34.5, -83.2 34.3))"^^orageo:WKTLiteral),
"mask=inside")) } '
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:distance

書式

orageo:distance(geom1 : orageo:WKTLiteral, geom2 : orageo:WKTLiteral, unit : Literal) : xsd:decimal

説明

指定された測定単位で、2つの点またはセグメントgeom1とgeom2の最短距離を戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

unit

測定単位。MDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で(たとえば"unit=KM")を指定します。測定単位の仕様の詳細については、『Oracle Spatial開発者ガイド』の測定単位の項を参照してください。

使用方法

orageo:withinDistanceは、より効率的な索引ベースの実装が行われているため、可能な場合は、orageo:distanceのかわりにorageo:withinDistanceを使用します。

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_DISTANCEファンクションも参照してください。

例

次の例では、指定された点に最も近い10の米国下院議員選挙区を検出し、点からの距離によって順序付けします。

SELECT name, cdist
FROM table(sem_match(
'SELECT ?name ?cdist
WHERE
{ # HINT0={LEADING(?cgeom)}
?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:nearestNeighbor(?cgeom,
"POINT(-71.46444 42.7575)"^^orageo:WKTLiteral,
"sdo_num_res=10")) }
ORDER BY ASC(orageo:distance(?cgeom,
"POINT(-71.46444 42.7575)"^^orageo:WKTLiteral,
"unit=KM"))'
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '))
ORDER BY sem$rownum;

orageo:intersection

書式

orageo:intersection(geom1 : orageo:WKTLiteral, geom2 : orageo:WKTLiteral) : orageo:WKTLiteral

説明

geom1とgeom2で位相的に共通部分(AND演算)となるとなるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

使用方法

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_INTERSECTIONファンクションも参照してください。

例

次の例では、中心が、2つの指定されたポリゴンの共通部分の内部にある米国下院議員選挙区ポリゴンを検出します。

SELECT name, cdist
FROM table(sem_match(
'{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:relate(orageo:centroid(?cgeom),
orageo:intersection("Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^orageo:WKTLiteral,
"Polygon((-83.2 34.3, -83.0 34.3, -83.0 34.5,
-83.2 34.5, -83.2 34.3))"^^orageo:WKTLiteral),
"mask=inside")) } '
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:length

書式

orageo:length(geom1 : orageo:WKTLiteral, unit : Literal) : xsd:decimal

説明

指定された測定単位でgeom1の長さ、つまり周囲を戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

unit

測定単位。MDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で(たとえば"unit=KM")を指定します。測定単位の仕様の詳細については、『Oracle Spatial開発者ガイド』の測定単位の項を参照してください。

使用方法

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_LENGTHファンクションも参照してください。

例

次の例では、1000kmを超える長さ(周囲)の米国下院議員選挙区ポリゴンを検出します。

SELECT name, cdist
FROM table(sem_match(
'{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:legnth(?cgeom, "unit=KM") > 1000) }'
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:mbr

書式

orageo:mbr(geom1 : orageo:WKTLiteral) : orageo:WKTLiteral

説明

geom1の最小境界矩形、つまりgeom1を囲む単一の最小の矩形を戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

使用方法

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_MBRファンクションも参照してください。

例

次の例では、最小境界矩形が、指定された点を含む米国下院議員選挙区ポリゴンを検出します。

SELECT name, cdist
FROM table(sem_match(
'{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:relate(orageo:mbr(?cgeom),
"POINT(-71.46444 42.7575)"^^orageo:WKTLiteral,
"mask=contains")) } '
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:nearestNeighbor

書式

orageo:nearestNeighbor(geom1: orageo:WKTLiteral, geom2 : orageo:WKTLiteral, param : Literal) : xsd:boolean

説明

geom1がgeom2の最も近い隣接である場合(設定される最も近い隣接のサイズはparamによって指定されます)、trueを戻し、そうでない場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

param

演算子の動作を指定します。使用可能なキーワードと値のペアの詳細は、「使用方法」を参照してください。

使用方法

paramパラメータで使用可能なキーワードと値のペアは次のとおりです。

- distance=nは、最も近い隣接の検索に対して最大許容距離を指定します。

- sdo_num_res=nは、最も近い隣接の検索に対して設定のサイズを指定します。

- unit=unitは、distance値で使用する測定単位を指定します。値を指定しない場合、データに関連付けられている測定単位が使用されます。

geom1は、ローカル変数(つまり、orageo:nearestNeighbor空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?var.に対する制限的なorageo:relate空間フィルタを含む場合は、'LEADING(?var)' HINT0ヒントを使用することをお薦めします。

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_NN演算子も参照してください。

例

次の例では、指定された点に最も近い10の米国下院議員選挙区を検出します。

SELECT name, cdist
FROM table(sem_match(
'{ # HINT0={LEADING(?cgeom)}
?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:nearestNeighbor(?cgeom,
"POINT(-71.46444 42.7575)"^^orageo:WKTLiteral,
"sdo_num_res=10")) } '
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:relate

書式

orageo:relate(geom1: orageo:WKTLiteral, geom2 : orageo:WKTLiteral, param : Literal) : xsd:boolean

説明

geom1とgeom2がparamパラメータによって指定される空間的な位相関係を満たす場合にtrueを戻し、そうでない場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

param

チェックするマスク関係のリストを指定します。「使用方法」のキーワードのリストを参照してください。

使用方法

次のparam値(マスク関係)をテストできます。

- ANYINTERACT: オブジェクトが非接続ではない場合にTRUEを戻します。

- CONTAINS: 第2オブジェクトが完全に第1オブジェクトの内部にあり、かつオブジェクト境界が接していない場合にCONTAINSを戻し、そうでない場合はFALSEを戻します。

- COVEREDBY: 第1オブジェクトが完全に第2オブジェクトの内部にあり、かつオブジェクト境界が1つ以上の点で接している場合にCOVEREDBYを戻し、そうでない場合はFALSEを戻します。

- COVERS: 第2オブジェクトが完全に第1オブジェクトの内部にあり、かつ境界が1つ以上の位置で接している場合にCOVERSを戻し、そうでない場合はFALSEを戻します。

- DISJOINT: 2つのオブジェクトが、境界または内部の点を共有していない場合にDISJOINTを戻し、そうでない場合はFALSEを戻します。

- EQUAL: オブジェクトの境界と内部(オブジェクト内のすべての穴を含む)のすべての点を2つのオブジェクトが共有している場合にEQUALを戻し、そうでない場合はFALSEを戻します。

- INSIDE: 第1オブジェクトが完全に第2オブジェクトの内部にあり、かつオブジェクト境界が接していない場合にINSIDEを戻し、そうでない場合はFALSEを戻します。

- ON: 線(第1オブジェクト)の境界および内部が完全にポリゴン(第2オブジェクト)の境界上に存在する場合にONを戻し、そうでない場合はFALSEを戻します。

- OVERLAPBDYDISJOINT: 2つのオブジェクトは重なっているが、その境界が相互作用しない場合にOVERLAPBDYDISJOINTを戻し、そうでない場合はFALSEを戻します。

- OVERLAPBDYINTERSECT: 2つのオブジェクトが重なり、かつその境界が1つ以上の位置で交差する場合にOVERLAPBDYINTERSECTを戻し、そうでない場合はFALSEを戻します。

- TOUCH: 2つのオブジェクトが1つの境界点を共有しているが、内部の点は共有していない場合にTOUCHを戻し、そうでない場合はFALSEを戻します。

paramparamの値は、論理ブール演算子ORを使用して組み合せることができます。たとえば、ジオメトリ間の関係がINSIDEまたはTOUCHあるいはINSIDEとTOUCHの両方である場合、「INSIDE + TOUCH」はINSIDE+TOUCHを戻し、ジオメトリ間の関係がINSIDEまたはTOUCHのいずれでもない場合はFALSEを戻します。

問合せ変数と定数ジオメトリを使用してorageo:relateをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、orageo:relate空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?var.に対する制限的なorageo:relate空間フィルタを含む場合は、'LEADING(?var)' HINT0ヒントを使用することをお薦めします。

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_RELATE演算子も参照してください。

例

次の例では、指定された点を含む米国下院議員選挙区を検出します。

SELECT name, cdist
FROM table(sem_match(
'{ # HINT0={LEADING(?cgeom)}
?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:relate(?cgeom,
"POINT(-71.46444 42.7575)"^^orageo:WKTLiteral,
"mask=contains")) } '
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '
));

orageo:union

書式

orageo:union(geom1 : orageo:WKTLiteral, geom2 : orageo:WKTLiteral) : orageo:WKTLiteral

説明

geom1とgeom2で結合部分(OR演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

使用方法

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_UNIONファンクションも参照してください。

例

次の例では、中心が、2つの指定されたポリゴンの結合部分の内部にある米国下院議員選挙区ポリゴンを検出します。

SELECT name, cdist
FROM table(sem_match(
'{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:relate(orageo:centroid(?cgeom),
orageo:union("Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^orageo:WKTLiteral,
"Polygon((-83.2 34.3, -83.0 34.3, -83.0 34.5,
-83.2 34.5, -83.2 34.3))"^^orageo:WKTLiteral),
"mask=inside")) } '
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:withinDistance

書式

orageo:withinDistance(geom1 : orageo:WKTLiteral, geom2 : orageo:WKTLiteral, distance : xsd:decimal, unit : Literal) : xsd:boolean

説明

geom1とgeom2の間の距離がunitで測定されるdistance以下である場合にtrueを戻し、そうでない場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

distance

距離値。

unit

測定単位。MDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で(たとえば"unit=KM")を指定します。測定単位の仕様の詳細については、『Oracle Spatial開発者ガイド』の測定単位の項を参照してください。

使用方法

問合せ変数と定数ジオメトリを使用してこのファンクションをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、orageo:withinDistance空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?var.に対する制限的なorageo:withinDistance空間フィルタを含む場合は、'LEADING(?var)' HINT0ヒントを使用することをお薦めします。

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_WITHIN_DISTANCE演算子も参照してください。

例

次の例では、指定された点の100km以内にある米国下院議員選挙区を検出します。

SELECT name, cdist
FROM table(sem_match(
'{ # HINT0={LEADING(?cgeom)}
?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:withinDistance(?cgeom,
"POINT(-71.46444 42.7575)"^^orageo:WKTLiteral,
100, "KM")) } '
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

orageo:xor

書式

orageo:xor(geom1 : orageo:WKTLiteral, geom2 : orageo:WKTLiteral) : orageo:WKTLiteral

説明

geom1とgeom2で位相的に対称差(XOR演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数orageo:WKTLiteralの値で指定します。

使用方法

RDFでの空間データの表現、索引付けおよび問合せの詳細は、1.6.6項を参照してください。

『Oracle Spatial開発者ガイド』のSDO_GEOM.SDO_XORファンクションも参照してください。

例

次の例では、中心が、2つの指定されたポリゴンの対称差の内部にある米国下院議員選挙区ポリゴンを検出します。

SELECT name, cdist
FROM table(sem_match(
'{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom
FILTER (orageo:relate(orageo:centroid(?cgeom),
orageo:xor("Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^orageo:WKTLiteral,
"Polygon((-83.2 34.3, -83.0 34.3, -83.0 34.5,
-83.2 34.5, -83.2 34.3))"^^orageo:WKTLiteral),
"mask=inside")) } '
,sem_models('gov_all_vm'), null,
,sem_aliases(
sem_alias('usgovt','http://www.rdfabout.com/rdf/schema/usgovt/'),
sem_alias('pol','http://www.rdfabout.com/rdf/schema/politico/'))
,null, null, null, ' ALLOW_DUP=T '));

用語集

セマンティク・テクノロジ・サポートのOracle Database実装に関連する用語を示します。これは、RDFおよびOWLの包括的な用語集でありません。

適用パターン

データ・アクセス制約の一部であり、一致パターンと一致するリソースが問合せ結果の構築に使用される前に、そのリソースに適用する追加のグラフ・パターンを定義します。関連項目: 「一致パターン」

基本グラフ・パターン(BGP)

1組のトリプル・パターン。W3C勧告の「SPARQL Query Language for RDF」の解説: 「SPARQLグラフ・パターンの一致は、基本グラフ・パターンの一致結果の組合せに基づいて定義されます。フィルタによって割り込まれた一連のトリプル・パターンは、単一の基本グラフ・パターンで構成されます。任意のグラフ・パターンによって、基本グラフ・パターンは終了します。」

クリーク

そのすべてのノードが同じグラフの他のすべてのノードに双方向に接続されているグラフです。

Cytoscape

分子間相互作用ネットワークを視覚化し、遺伝子発現プロファイルおよびその他の状態データとのこれらの相互作用を統合するためのオープン・ソースのバイオインフォマティクス・ソフトウェア・プラットフォームです。(http://www.cytoscape.org/を参照。)Cytoscapeプラグインとして、RDFビューアが提供されています(ダウンロード可能です)。

伴意

指定したルールベースのセットを指定したモデルのセットに適用することで推論できる計算済のトリプルを含むオブジェクトです。関連項目: 「ルールベース」

エクストラクタ・ポリシー

ポリシーを使用して作成されるセマンティク索引の特性を決定する、名前付きディクショナリ・エンティティです。各エクストラクタ・ポリシーは、直接的または間接的にエクストラクタ・タイプのインスタンスを参照します。

グラフ・パターン

トリプル・パターンを様々な方法で組み合せ(複数のトリプル・パターンのグループ化など)、必要に応じてフィルタ条件を使用し、その後コネクタ(分離、外部結合など)を使用してこのようなグループを組み合せることで構成されるトリプルの組合せです。SPARQL問合せは、グラフ・パターン一致に基づいています。

推論(inferencing)

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

情報エクストラクタ

構造化されていないドキュメントを処理し、それらから意味のある情報を抽出するアプリケーションです(通常は、自然言語処理エンジンとオントロジを使用します)。

Jena Adapter for Oracle Database

Oracleが提供するJena用のアダプタ(セマンティクWebアプリケーションを構築するためのJavaフレームワーク)で、ダウンロード可能です。

一致パターン

制約の一部であり、制約が実施するアクセス制限のタイプを決定し、ユーザー問合せでアクセスされる対応するデータ・インスタンスに1つ以上の変数をバインドします。関連項目: 「適用パターン」

モデル

ユーザーが作成するセマンティク構造であり、モデル名を持ち、指定した表の列に格納されているトリプルを参照します。このマニュアルでの例は、ArticlesモデルとFamilyモデルです。

オントロジ

特定の領域で共有される知識の概念化です。オントロジは、クラス、プロパティおよび(オプションの)インスタンスの集合で構成されます。クラスは、通常、クラス階層(サブクラスとスーパークラスの関係)によって関連付けられます。同様に、プロパティは、プロパティ階層(サブプロパティとスーパープロパティの関係)によって関連付けられます。プロパティは、対称的または推移的(あるいはその両方)です。プロパティには、それぞれ指定されたドメイン、レンジおよびカーディナリティの制約があります。

OWLPrime

OWL機能のOracle定義のサブセットであり、Oracle Databaseセマンティク・テクノロジのネイティブ推論エンジンによってサポートされるOWL標準の要素を参照します。

推論(reasoning)

関連項目: 「推論(inferencing)」

ルール

セマンティク・データから推論を導く際に適用できるオブジェクトです。

ルールベース

ルールを含むことができるオブジェクトです。関連項目: 「ルール」

ルール索引

関連項目: 「伴意」

セマンティク索引

タイプMDSYS.SEMCONTEXTの索引であり、表の列に格納されているテキスト・ドキュメントで作成され、情報エクストラクタとともに使用されて、構造化されていないドキュメントから意味のある情報を検索し、抽出します。関連項目: 「情報エクストラクタ」

Sesame Adapter for Oracle Database

一般的なSesame Java APIをOracleセマンティク・テクノロジ・サポートに統合する、Oracleが提供するアダプタです(ダウンロード可能です)。

Simple Knowledge Organization System (SKOS)

シソーラス、分類スキーム、分類学、その他のタイプの統制ボキャブラリを表す場合に特に役に立つデータ・モデルです。SKOSは、RDFやOWLを含む標準のセマンティクWebテクノロジを基盤とし、これによって知識組織化システムの形式意味論の定義およびアプリケーション間でのセマンティク共有が容易になります。

トリプル・パターン

RDFトリプルと同様ですが、3つのコンポーネント(主語、述語または目的語)のいずれかのかわりに変数を使用できます。トリプル・パターンは、SPARQL問合せで使用されるグラフ・パターンの基本要素です。RDFグラフに対する問合せで使用されるトリプル・パターンが一致したとみなされるのは、そのトリプル・パターンに存在する変数に対するRDF語句の代替によって、RDFグラフに存在するトリプルが作成される場合です。関連項目: 「グラフ・パターン」

索引
A  B  C  D  E  F  G  H  I  J  L  M  N  O  P  Q  R  S  T  U  V  W  X

A

ADD_DATATYPE_INDEXプロシージャ, 9

ADD_DEPENDENT_POLICYプロシージャ, 12

ADD_SEM_INDEXプロシージャ, 9

ADD_VPD_CONSTRAINTプロシージャ, 13

高度な圧縮, 7.2.2.2

aliases

SEM_ALIASESおよびSEM_ALIASデータ型, 1.6, 4.4

ALL_BGP_HASH

SEM_MATCHの問合せオプション, 1.6

ALL_BGP_NL

SEM_MATCHの問合せオプション, 1.6

ALL_LINK_HASH

SEM_MATCHの問合せオプション, 1.6

ALL_LINK_NL

SEM_MATCHの問合せオプション, 1.6

ALL_ORDERED

SEM_MATCHの問合せオプション, 1.6

ALLOW_DUP=T

SEM_MATCHの問合せオプション, 1.6

ALTER_DATATYPE_INDEXプロシージャ, 9 ALTER_ENTAILMENTプロシージャ, 9 ALTER_MODELプロシージャ, 9 ALTER_SEM_INDEX_ON_ENTAILMENTプロシージャ, 9 ALTER_SEM_INDEX_ON_MODELプロシージャ, 9 ANALYZE_ENTAILMENTプロシージャ, 9 ANALYZE_MODELプロシージャ, 9 適用パターン, 5.1.3 APPLY_OLS_POLICYプロシージャ, 13 APPLY_POLICY_TO_APP_TABプロシージャ, 10 APPLY_VPD_POLICYプロシージャ, 13

B

基本グラフ・パターン(BGP), 1.6

バッチ(バルク)・ロード, 9, 9

セマンティク・データのバッチ・ロード, 1.7.2

ベスト・エフォート

SPARQL問合せの指定, 7.16.3.3

BGP (基本グラフ・パターン), 1.6 空白ノード, 1.3.4 バルク・ロード, 9, 9 セマンティク・データのバルク・ロード, 1.7.1 BULK_LOAD_FROM_STAGING_TABLEプロシージャ, 9

C

Calais

Calaisエクストラクタ・タイプの構成, 4.9

正規形, 1.3.2.1 catsem10i.sqlスクリプト, A.1.3, A.2.1 catsem.sqlスクリプト, A.1.1 変更トラッキング

無効化, 9

有効化, 9

情報の取得, 9

CLEANUP_FAILEDプロシージャ, 9 クライアント識別子, 7.2.2.1 クリーク(sameAs), 2.2.8 COMPOSE_RDF_TERMファンクション, 9 接続プーリング

Jena Adapterでのサポート, 7.10.2

Sesame Adapterでのサポート, 8.7.2

セマンティク・データのコンストラクタ, 1.5 convert_old_rdf_dataプロシージャ, A.1.2 コーパス中心の推論, 4.15 CREATE_ENTAILMENTプロシージャ, 9 CREATE_POLICYプロシージャ, 12 CREATE_RULEBASEプロシージャ, 9 CREATE_SEM_MODELプロシージャ, 9 CREATE_SEM_NETWORKプロシージャ, 9 CREATE_SOURCE_EXTERNAL_TABLEプロシージャ, 9 CREATE_VIRTUAL_MODELプロシージャ, 9 CREATE_VPD_POLICYプロシージャ, 13

D

データ型索引

追加, 9

変更, 9

削除, 9

SEM_DTYPE_INDEX_INFOビュー, 1.9

使用, 1.9

データ型

リテラル, 1.3.2.1

セマンティク・データのデータ型, 1.5 default.xsltファイル

カスタマイズ, 7.16.4

DELETE_VPD_CONSTRAINTプロシージャ, 13 デモ・ファイル

セマンティク・データ, 1.11

DISABLE_CHANGE_TRACKINGプロシージャ, 9 DISABLE_INC_INFERENCEプロシージャ, 9 DISABLE_OLS_POLICYプロシージャ, 13 ディスカッション・フォーラム

セマンティク・テクノロジ, 1.13

DO_UNESCAPE=T

SEM_MATCHの問合せオプション, 1.6

ドキュメント中心の推論, 4.15 ドキュメント

セマンティク索引付け, 4

DOTファイル

出力, 7.9.1

ダウングレード

リリース10.2のセマンティク・テクノロジ・サポート, A.2.2

リリース11.1のセマンティク・テクノロジ・サポート, A.2.1

ダウンロード

セマンティク・テクノロジ, 1.13

DROP_DATATYPE_INDEXプロシージャ, 9 DROP_ENTAILMENTプロシージャ, 9 DROP_POLICYプロシージャ, 12 DROP_RULEBASEプロシージャ, 9 DROP_SEM_INDEXプロシージャ, 9 DROP_SEM_MODELプロシージャ, 9 DROP_SEM_NETWORKプロシージャ, 9 DROP_USER_INFERENCE_OBJSプロシージャ, 9 DROP_VIRTUAL_MODELプロシージャ, 9 DROP_VPD_POLICYプロシージャ, 13 重複トリプル

チェック, 1.3.2.1

モデルからの削除, 9, 9

E

ENABLE_CHANGE_TRACKINGプロシージャ, 9

ENABLE_INC_INFERENCEプロシージャ, 9

ENABLE_OLS_POLICYプロシージャ, 13

伴意

ステータスが無効, 1.6

伴意ルール, 1.3.6 伴意, 1.3.7

変更, 9

失敗の状態にある場合の削除, 9

ステータスが不完全, 1.6, 2.3.1

ステータスが無効, 2.3.1

SEM_RULES_INDEX_DATASETSビュー, 1.3.7

SEM_RULES_INDEX_INFOビュー, 1.3.7

ESCAPE_CLOB_TERMファンクション, 9 ESCAPE_CLOB_VALUEファンクション, 9 ESCAPE_RDF_TERMファンクション, 9 ESCAPE_RDF_VALUEファンクション, 9 例

Java (Oracle Technology Network), 1.11

PL/SQL, 1.11

セマンティク・データのエクスポート, 1.7 外部ドキュメント

索引付け, 4.8

外部表

作成, 9

エクストラクタ・ポリシー, 4.2

RDFCTX_POLICIESビュー, 4.16.1, 4.16.2

エクストラクタ

情報, 4.1

ポリシー, 4.2

F

失敗の状態

ルールベースまたは伴意, 9

フェデレーテッド問合せ, 7.6.4.1 フィルタ

SEM_MATCHの属性, 1.6, 4.4

FINAL_VALUE_HASH

SEM_MATCHの問合せオプション, 1.6

FINAL_VALUE_NL

SEM_MATCHの問合せオプション, 1.6

G

GATE (General Architecture for Text Engineering)

Java実装のサンプル, 4.10

使用, 4.10

GATHER_STATSプロシージャ, 11 General Architecture for Text Engineering (GATE)

Java実装のサンプル, 4.10

使用, 4.10

GET_CHANGE_TRACKING_INFOプロシージャ, 9 GET_INC_INF_INFOプロシージャ, 9 GET_MODEL_IDファンクション, 9 GET_MODEL_NAMEファンクション, 9 GET_TRIPLE_IDファンクション, 9 GETV$DATETIMETZVALファンクション, 9 GETV$DATETZVALファンクション, 9 GETV$NUMERICVALファンクション, 9 GETV$STRINGVALファンクション, 9 GETV$TIMETZVALファンクション, 9 GRAPH_MATCH_UNNAMED=T

SEM_MATCHの問合せオプション, 1.6

グラフ

SEM_MATCHの属性, 1.6

.gvファイル(DOTファイル)

出力, 7.9.1

H

HINT0

SEM_MATCHの問合せオプション, 1.6

I

増分推論, 2.2.9

無効化, 9

有効化, 9

増分推論

情報の取得, 9

index_status

SEM_MATCHの属性, 1.6, 2.3.1

INF_ONLY

SEM_MATCHの問合せオプション, 1.6

推論, 1.3.6 情報エクストラクタ, 4.1 inverseOfキーワード

セマンティク索引の強制的使用, 2.3.4

IS_TRIPLEファンクション, 9

J

Javaの例

GATEリスナー, 4.10

OTNセマンティク・テクノロジ・ページ, 1.11

JavaScript Object Notation (JSON)形式のサポート, 7.13 Jena Adapter, 7

SPARQL問合せでサポートされるファンクション, 7.7

SPARQL問合せ処理の最適化, 7.5

処理の最適化またはプロパティ・パス, 7.5.2

問合せの例, 7.15

prepareBulkでのRDFaのサポート, 7.11

SEM_MATCHとJena Adapter問合せの比較, 7.4

ソフトウェア環境の設定, 7.1

SPARQLサービスの設定, 7.2

接続プーリングのサポート, 7.10.2

セマンティク・モデルのPL/SQLインタフェースのサポート, 7.10.3

仮想モデルのサポート, 7.10.1

Joseki

Jena Adapterでの使用, 7.2

JSON形式のサポート, 7.13

L

リテラル

データ型, 1.3.2.1

LOAD_INTO_STAGING_TABLEプロシージャ, 9 セマンティク・データのロード, 1.7

バルク, 9, 9

LOOKUP_ENTAILMENTプロシージャ, 9

M

MAINT_VPD_METADATAプロシージャ, 13

MAINTAIN_TRIPLESプロシージャ, 12

一致パターン, 5.1.3

mdsys.SemContent索引タイプ, 4.3

MERGE_MODELSプロシージャ, 9

メタデータ

セマンティク, 1.3.1

セマンティク・データのメタデータ表およびビュー, 1.4 セマンティク・データのメソッド, 1.5 モデルID

取得, 9

モデル名

取得, 9

モデル, 1.2

変更, 9

作成, 9

削除, 9

データベースのサポートの無効化, 9

データベースのサポートの有効化, 9

マージ, 9

名前の変更, 9

SEM_MODELSデータ型, 1.6

SEMI_entailment-nameビュー, 1.3.7

SEMM_model-nameビュー, 1.3.1

名前の交換, 9

仮想, 1.3.8

N

名前付きグラフ・ベースの推論

グローバル, 2.2.11

ローカル, 2.2.11

名前付きグラフ

サポート, 1.3.9

named_graphs

SEM_MATCHの属性, 1.6

ネットワーク索引

情報のリフレッシュ, 9

SEM_NETWORK_INDEX_INFOビュー, 1.8.1

NGGI (名前付きグラフ・ベースのグローバル推論), 2.2.11 NGLI (名前付きグラフ・ベースのローカル推論), 2.2.11 N-Quad形式, 1.3.9 N-QUADSデータ形式, 1.3.9.1 N-Triple形式, 1.3.9

O

OBIEE

XMLデータ・ソースとしてのSPARQL Gatewayの使用, 7.16.7

オブジェクト, 1.3.3 OLTP圧縮, 7.2.2.2, 7.2.2.2 オプション

SEM_MATCHの属性, 1.6

Oracle Advanced Compression

OLTP圧縮, 7.2.2.2

Oracle Business Intelligence Enterprise Edition (OBIEE)

XMLデータ・ソースとしてのSPARQL Gatewayの使用, 7.16.7

Oracle Label Security (OLS), 5.2.2.6

ポリシーの適用, 10, 13

ポリシーの無効化, 13

ポリシーの有効化, 13

ポリシーの削除, 10, 13

モデルに関連付けられているラベル, 13

リソースレベル・セキュリティ, 5.2.2

トリプルの主語や目的語の位置で使用される場合があるリソースへの機密性ラベルの設定, 13

述語への機密性ラベルの設定, 13

ルールベースに属するルールへの機密性ラベルの設定, 13

RDFSスキーマ要素への機密性ラベルの設定, 13

トリプルレベル・セキュリティ, 5.2.1

RDFデータでの使用, 5.2

Oracle Spatial

RDFおよびOWLの機能の前提条件ソフトウェア, A.1.5

orageo

areaファンクション, B

bufferファンクション, B

centroidファンクション, B

convexHullファンクション, B

differenceファンクション, B

distanceファンクション, B

intersectionファンクション, B

lengthファンクション, B

mbrファンクション, B

nearestNeighborファンクション, B

relateファンクション, B

unionファンクション, B

withinDistanceファンクション, B

xorファンクション, B

OTNページ

セマンティク・テクノロジ, 1.13

owl

sameAs

SEMCL_entailment-nameビュー, 2.2.8

SameAs

推論の最適化, 2.2.8

OWL

SEM_DISTANCE補助演算子を使用した問合せ, 2.3.2

SEM_RELATED演算子を使用した問合せ, 2.3

OWL 2 RLのサポート, 2.1.2 OWL2RLルールベース, 2.1.2

P

パラレル推論, 2.2.10

パーティショニング

RDFおよびOWL用に有効化, A.1.5

PelletInfGraphクラス

Jena Adapterでの非推奨になったサポート, 7.10.5

PLUS_RDFT

SEM_MATCHの問合せオプション, 1.6

PRIVILEGE_ON_APP_TABLESプロシージャ, 9 PROCAVFH=Fオプション, 2.2.7 PROCSVFH=Fオプション, 2.2.7 プロパティ, 1.3.5 プロパティ・チェーンの処理, 3.2.2 プロパティ・パス

Jena Adapterによる処理の最適化, 7.5.2

PURGE_UNUSED_VALUESプロシージャ, 9

Q

検索の品質, 4.7

問合せ

SEM_DISTANCE補助演算子の使用, 2.3.2

SEM_MATCHテーブル・ファンクションの使用, 1.6

SEM_RELATED演算子の使用, 2.3

R

RDFルールベース

RDFSルールベースのサブセット, 1.3.6

RDF$ET_TAB表, 1.7.1.2 RDF_VALUE$表, 1.3.2 RDFa

prepareBulkでのサポート(Jena Adapter), 7.11

RDFCTX_INDEX_EXCEPTIONSビュー, 4.16.3 RDFCTX_POLICIESビュー, 4.16.1, 4.16.2 RDFOLS_SECURE_RESOURCEビュー, 5.2.2.6, 5.2.2.6 RDFS伴意ルール, 1.3.6 RDFSルールベース

RDFS伴意ルールの実装, 1.3.6

RDFVPD_MODELSビュー, 5.1.5, 5.1.5 RDFVPD_POLICIESビュー, 5.1.4, 5.1.4 RDFVPD_POLICY_CONSTRAINTSビュー, 5.1.6, 5.1.6 RDFVPD_PREDICATE_MDATAビュー, 5.1.7, 5.1.7 RDFVPD_RESOURCE_RELビュー, 5.1.8, 5.1.8 REFRESH_SEM_NETWORK_INDEX_INFOプロシージャ, 9 REMOVE_DUPLICATESプロシージャ, 9 REMOVE_OLS_POLICYプロシージャ, 13 REMOVE_POLICY_FROM_APP_TABプロシージャ, 10 REMOVE_VPD_POLICYプロシージャ, 13 セマンティク・テクノロジ・サポートの削除, A.3 RENAME_ENTAILMENTプロシージャ, 9 RENAME_MODELプロシージャ, 9 RESET_MODEL_LABELSプロシージャ, 13 Resource Description Framework

「セマンティク・テクノロジ」を参照

リソースレベル・セキュリティ, 5.2.2 resultsPerPageパラメータ, 7.16.6.2 ルールベース, 1.3.6

SEM_MATCHの属性, 2.3.1

失敗の状態にある場合の削除, 9

SEM_RULEBASE_INFOビュー, 1.3.6

SEM_RULEBASESデータ型, 1.6

SEMR_rulebase-nameビュー, 1.3.6

ルール, 1.3.6 ルール索引

「伴意」を参照

S

sameAs

推論の最適化(OWL), 2.2.8

sameTerm組込みファンクション, 1.6.7.3 sdo_rdf_internal.convert_old_rdf_dataプロシージャ, A.1.2 sdordfwm_rm.sqlスクリプト, 6.1.1 sdordfwm.sqlスクリプト, 6.1 検索

品質, 4.7

セキュリティ上の考慮事項, 1.3.10 SEM_ALIASデータ型, 1.6, 4.4 SEM_ALIASESデータ型, 1.6, 4.4 SEM_APISパッケージ

ADD_DATATYPE_INDEX, 9

ADD_SEM_INDEX, 9

ALTER_DATATYPE_INDEX, 9

ALTER_ENTAILMENT, 9

ALTER_MODEL, 9

ALTER_SEM_INDEX_ON_ENTAILMENTセマンティク・ネットワーク索引

伴意での変更, 9

ALTER_SEM_INDEX_ON_MODEL, 9 ANALYZE_ENTAILMENT, 9 ANALYZE_MODEL, 9 BULK_LOAD_FROM_STAGING_TABLE, 9 CLEANUP_FAILED, 9 COMPOSE_RDF_TERM, 9 CREATE_ENTAILMENT, 9 CREATE_RULEBASE, 9 CREATE_SEM_MODEL, 9 CREATE_SEM_NETWORK, 9 CREATE_SOURCE_EXTERNAL_TABLE, 9 CREATE_VIRTUAL_MODEL, 9 DISABLE_CHANGE_TRACKING, 9 DISABLE_INC_INFERENCE, 9 DROP_DATATYPE_INDEX, 9 DROP_ENTAILMENT, 9 DROP_RULEBASE, 9 DROP_SEM_INDEX, 9 DROP_SEM_MODEL, 9 DROP_SEM_NETWORK, 9 DROP_USER_INFERENCE_OBJS, 9 DROP_VIRTUAL_MODEL, 9 ENABLE_CHANGE_TRACKING, 9 ENABLE_INC_INFERENCE, 9 ESCAPE_CLOB_TERM, 9 ESCAPE_CLOB_VALUE, 9 ESCAPE_RDF_TERM, 9 ESCAPE_RDF_VALUE, 9 GET_CHANGE_TRACKING_INFO, 9 GET_INC_INF_INFO, 9 GET_MODEL_ID, 9 GET_MODEL_NAME, 9 GET_TRIPLE_ID, 9 GETV$DATETIMETZVAL, 9 GETV$DATETZVAL, 9 GETV$NUMERICVAL, 9 GETV$STRINGVAL, 9 GETV$TIMETZVAL, 9 LOAD_INTO_STAGING_TABLE, 9 LOOKUP_ENTAILMENT, 9 MERGE_MODELS, 9 PRIVILEGE_ON_APP_TABLES, 9 PURGE_UNUSED_VALUES, 9 リファレンス情報, 9, 11 REFRESH_SEM_NETWORK_INDEX_INFO, 9 REMOVE_DUPLICATES, 9 RENAME_ENTAILMENT, 9 RENAME_MODEL, 9 SWAP_NAMES, 9 TRIPLE, 9 UNESCAPE_CLOB_TERM, 9 UNESCAPE_CLOB_VALUE, 9 UNESCAPE_RDF_TERM, 9 UNESCAPE_RDF_VALUE, 9 VALIDATE_ENTAILMENT, 9 VALIDATE_MODEL, 9 VALUE_NAME_PREFIX, 9, 9 SEM_CONTAINS演算子

構文, 4.4

SEM_CONTAINS_COUNTancillary演算子

構文, 4.4.2

SEM_CONTAINS_SELECT補助演算子

構文, 4.4.1

問合せでの使用, 4.6

SEM_DISTANCE補助演算子, 2.3.2 SEM_DTYPE_INDEX_INFOビュー, 1.9 SEM_GRAPHSデータ型, 9 SEM_INDEXTYPE索引タイプ, 2.3.3 SEM_MATCHテーブル・ファンクション, 1.6 SEM_MODEL$ビュー, 1.3.1

仮想モデル・エントリ, 1.3.8

SEM_MODELSデータ型, 1.6 SEM_NETWORK_INDEX_INFOビュー, 1.8.1 SEM_OLSパッケージ

APPLY_POLICY_TO_APP_TAB, 10

REMOVE_POLICY_FROM_APP_TAB, 10

SEM_PERFパッケージ

GATHER_STATS, 11

SEM_RDFCTXパッケージ

ADD_DEPENDENT_POLICY, 12

CREATE_POLICY, 12

DROP_POLICY, 12

MAINTAIN_TRIPLES, 12

リファレンス情報, 12

SET_DEFAULT_POLICY, 12

SET_EXTRACTOR_PARAM, 12

SEM_RDFSAパッケージ

ADD_VPD_CONSTRAINT, 13

APPLY_OLS_POLICY, 13

APPLY_VPD_POLICY, 13

CREATE_VPD_POLICY, 13

DELETE_VPD_CONSTRAINT, 13

DISABLE_OLS_POLICY, 13

DROP_VPD_POLICY, 13

ENABLE_OLS_POLICY, 13

MAINT_VPD_METADATA, 13

リファレンス情報, 10, 13

REMOVE_OLS_POLICY, 13

REMOVE_VPD_POLICY, 13

RESET_MODEL_LABELS, 13

SET_PREDICATE_LABEL, 13

SET_RDFS_LABEL, 13

SET_RESOURCE_LABEL, 13

SET_RULE_LABEL, 13

SEM_RELATED演算子, 2.3 SEM_RULEBASE_INFOビュー, 1.3.6 SEM_RULEBASESデータ型, 1.6 SEM_RULES_INDEX_DATASETSビュー, 1.3.7 SEM_RULES_INDEX_INFOビュー, 1.3.7 SEM_VMODEL_DATASETSビュー, 1.3.8 SEM_VMODEL_INFOビュー, 1.3.8 セマンティク・データ

空白ノード, 1.3.4

コンストラクタ, 1.5

データ型, 1.5

デモ・ファイル, 1.11

例(Java), 1.11

例(PL/SQL), 1.11

データベース, 1.3

メタデータ, 1.3.1

メタデータ表およびビュー, 1.4

メソッド, 1.5

モデル化, 1.2

オブジェクト, 1.3.3

プロパティ, 1.3.5

SEM_MATCHテーブル・ファンクションを使用した問合せ, 1.6

セキュリティ上の考慮事項, 1.3.10

文, 1.3.2

使用手順, 1.10

主語, 1.3.3

セマンティク索引

作成(MDSYS.SEM_INDEXTYPE), 2.3.3

ドキュメントの索引付け, 4.3

ドキュメントでの使用, 4

セマンティク索引

RDFCTX_INDEX_EXCEPTIONSビュー, 4.16.3

セマンティク・ネットワーク索引

追加, 9

モデルでの変更, 9

削除, 9

使用, 1.8

セマンティク・テクノロジ

概要, 1

セマンティク・テクノロジ・サポート

リリース10.2へのダウングレード, A.2.2

リリース11.1へのダウングレード, A.2.1

有効化, A.1

削除, A.3

リリース10.2へのアップグレード, A.1.3

リリース11.1へのアップグレード, A.1.2

SEMCL_entailment-nameビュー, 2.2.8 SemContent

mdsys.SemContent索引タイプ, 4.3

SEMI_entailment-nameビュー, 1.3.7 SEMM_model-nameビュー, 1.3.1 SEMR_rulebase-nameビュー, 1.3.6 semrelod111.sqlスクリプト, A.2.1 semrelod.sqlスクリプト, A.1.2 semremov.sqlスクリプト, A.3 Sesame Adapter, 8

SPARQL問合せ処理の最適化, 8.4

パフォーマンスに関する推奨事項, 8.5

問合せの例, 8.10

SEM_MATCHとSesame Adapter問合せの比較, 8.3

ソフトウェア環境の設定, 8.2.1

SPARQLエンドポイントの設定, 8.2.2

接続プーリングのサポート, 8.7.2

セマンティク・モデルのPL/SQLインタフェースのサポート, 8.7.3

仮想モデルのサポート, 8.7.1

SET_DEFAULT_POLICYプロシージャ, 12 SET_EXTRACTOR_PARAMプロシージャ, 12 SET_PREDICATE_LABELプロシージャ, 13 SET_RDFS_LABELプロシージャ, 13 SET_RESOURCE_LABELプロシージャ, 13 SET_RULE_LABELプロシージャ, 13 Simple Knowledge Organization System (SKOS)

プロパティ・チェーンの処理, 3.2.2

サポート, 3

SKOS (Simple Knowledge Organization System)

プロパティ・チェーンの処理, 3.2.2

サポート, 3

SNOMED CT (Systematized Nomenclature of Medicine - Clinical Terms)

サポート, 9

SPARQL

サービスの構成, 7.2.2, 8.2.2.2

問合せ処理の最適化, 7.5, 8.4

SPARQL問合せパターンを使用したドキュメントの検索, 4.5

Jena Adapter用のサービスの設定, 7.2

Sesame Adapter用のサービスの設定, 8.2.2

SPARQL Gateway, 7.16

デフォルトのXSLTファイルのカスタマイズ, 7.16.4

機能および利点の概要, 7.16.1

インストールおよび構成, 7.16.2

Java API, 7.16.5

SPARQL問合せのベスト・エフォートの指定, 7.16.3.3

text/xml以外のコンテンツ・タイプの指定, 7.16.3.4

SPARQL問合せのタイムアウト値の指定, 7.16.3.2

OBIEEへのXMLデータ・ソースとしての使用, 7.16.7

セマンティク・データでの使用, 7.16.3

空間

RDFおよびOWLの機能の前提条件ソフトウェア, A.1.5

空間のサポート

orageo

areaファンクション, B

bufferファンクション, B

centroidファンクション, B

convexHullファンクション, B

differenceファンクション, B

distanceファンクション, B

intersectionファンクション, B

lengthファンクション, B

mbrファンクション, B

nearestNeighborファンクション, B

relateファンクション, B

unionファンクション, B

withinDistanceファンクション, B

xorファンクション, B

ステージング表

データのロード, 9

データのロード, 9

セマンティク・データのバルク・ロードのためのステージング表, 1.7.1 文

RDF_VALUE$表, 1.3.2

統計

RDFおよびOWLに関する統計の収集, 11

STRICT_DEFAULT

SEM_MATCHの問合せオプション, 1.6

主語, 1.3.3 サブプロパティ・チェーン, 3.2.2 SWAP_NAMESプロシージャ, 9 Systematized Nomenclature of Medicine - Clinical Terms (SNOMED CT)

サポート, 9

T

タイムアウト値

SPARQL問合せの指定, 7.16.3.2

TriGデータ形式, 1.3.9.1 トリプルレベル・セキュリティ, 5.2.1 トリプル

挿入のためのコンストラクタ, 1.5.1

重複チェック, 1.3.2.1

IS_TRIPLEファンクション, 9

U

UNESCAPE_CLOB_TERMファンクション, 9

UNESCAPE_CLOB_VALUEファンクション, 9

UNESCAPE_RDF_TERMファンクション, 9

UNESCAPE_RDF_VALUEファンクション, 9

セマンティク・テクノロジ・サポートのアンインストール, A.3

未使用値

セマンティク・ネットワークからのパージ, 9

アップグレード

リリース10.2からのセマンティク・テクノロジ・サポート, A.1.3

リリース11.1からのセマンティク・テクノロジ・サポート, A.1.2

URI接頭辞

値がURIとして格納されない場合の使用, 2.3.5

URIPREFIXキーワード, 2.3.5

V

VALIDATE_ENTAILMENTプロシージャ, 9

VALIDATE_MODELプロシージャ, 9

VALUE_NAME_PREFIXファンクション, 9, 9

RDFモデルのバージョニングの有効化, 6.2, 6.4

仮想モデル, 1.3.8

SEM_MODEL$ビュー・エントリ, 1.3.8

SEM_VMODEL_DATASETSビュー, 1.3.8

SEM_VMODEL_INFOビュー, 1.3.8

Jena Adapterでのサポート, 7.10.1

Sesame Adapterでのサポート, 8.7.1

仮想プライベート・データベース(VPD)

制約の追加, 13

ポリシーの適用, 13

ポリシーの作成, 13

制約の削除, 13

ポリシーの削除, 13

メタデータの保持, 13

ポリシーの削除, 13

RDFデータでの使用, 5.1

仮想プライベート・データベース(VPD), 5.1.4, 5.1.5, 5.1.6, 5.1.7, 5.1.8

W

Workspace Manager

RDFデータのサポートの有効化, 6.1

バージョン対応RDFモデルからの推論, 6.3

ワークスペースのマージおよびリフレッシュ, 6.4

RDFデータのサポートの削除, 6.1.1

RDFデータに関する制限事項および考慮事項, 6.5

バージョン対応モデルに関する制限事項, 6.6

使用フローの例, 6.6

RDFモデルのバージョニングの有効化, 6.2

ワークスペース

マージおよびリフレッシュ, 6.4

X

XSLTファイル

SPARQL Gateway用のデフォルトのカスタマイズ, 7.16.4

Oracle Legal Notices

Copyright Notice

Copyright © 1994-2014, Oracle and/or its affiliates. All rights reserved.

Trademark Notice

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

License Restrictions Warranty/Consequential Damages Disclaimer

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

Warranty Disclaimer

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

Restricted Rights Notice

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

Hazardous Applications Notice

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Third-Party Content, Products, and Services Disclaimer

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

Alpha and Beta Draft Documentation Notice

If this document is in preproduction status:

This documentation is in preproduction status and is intended for demonstration and preliminary use only. It may not be specific to the hardware on which you are using the software. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to this documentation and will not be responsible for any loss, costs, or damages incurred due to the use of this documentation.