Oracle® Spatial and Graph

RDFセマンティック・グラフ開発者ガイド

12cリリース1 (12.1)

B72469-07(原本部品番号:E51611-08)

2017年6月

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

Oracle Spatial and Graph RDFセマンティック・グラフ開発者ガイド 12c リリース1 (12.1)

B72469-07

Copyright © 2005, 2017, 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

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

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

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

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 Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

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

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

目次

図一覧

表一覧

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

『Oracle Spatial and Graph RDFセマンティク・グラフ開発者ガイド』のこのリリースでの変更点

- Oracle Database 12cリリース1 (12.1.0.2)での変更点

- SPARQL 1.1フェデレーテッド問合せのサポート

- ネイティブ・トリプル・データと仮想RDB2RDFトリプル・データの組合せ

- Oracle Database 12cリリース1 (12.1.0.1)での変更点

- 新機能

- SPARQL 1.1の構成要素の拡張サポート

- 仮想モデルの拡張サポート

- ユーザー定義の推論および問合せのサポート

- OWL 2 ELのサポート

- OGC GeoSPARQLのサポート

- ラダーベース推論

- RDFビュー

- セマンティク・ネットワークのエクスポートおよびインポートに対するデータ・ポンプのサポート

- 非推奨となった機能

- サポートが終了した機能

- RDF Semantic Graph support for Apache Jenaの変更点

- SEM_MATCHまたはSQLベースの問合せ結果からのユーザーフレンドリJavaオブジェクト取得のサポート

- Oracle DatabaseおよびOracle NoSQL Database Enterprise Editionリリース2.0.39向けのProtegeプラグイン

- カスタマイズされたデータ・ソース名のサポート

- 29000バイトを越える変換SQLテキストによるSPARQL問合せのサポート

- 読取り専用モードのOracle Databaseのサポート

- VerboseでないJoseki出力

- 長時間実行されているSPARQL問合せの終了に責任を負う表の管理用Java APIs

- Apache TomcatおよびJBossアプリケーション・サーバーのサポート

- Fuseki 1.0.1のサポート

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

1 RDFセマンティク・グラフの概要

- 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.1GRAPHキーワード・サポート

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

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

- 1.6.4.1 SPARQL CONSTRUCTの一般的なワークフロー

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

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

- 1.6.7 グラフ・パターン: SPARQL 1.1の構成要素のサポート

- 1.6.7.1 SELECT句の式

- 1.6.7.2 副問合せ

- 1.6.7.3 グループ化と集計

- 1.6.7.4 否定

- 1.6.7.5 値の割当て

- 1.6.7.6 プロパティ・パス

- 1.6.8 グラフ・パターン: SPARQL 1.1のフェデレーテッド問合せのサポート

- 1.6.8.1 フェデレーテッドSPARQL問合せの実行に必要な権限

- 1.6.8.2 SPARQL SERVICEの結合プッシュ・ダウン

- 1.6.8.3 SPARQL SERVICE SILENT

- 1.6.8.4 SPARQL SERVICEでのプロキシ・サーバーの使用

- 1.6.8.5 HTTP基本認証でのSPARQLエンドポイントへのアクセス

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

- 1.6.10 全文検索

- 1.6.11 空間のサポート

- 1.6.11.1 OGC GeoSPARQLのサポート

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

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

- 1.6.11.4 空間データの問合せ

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

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

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

- 1.6.12.3 リレーショナル式を含むFILTER構成要素

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

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

- 1.6.12.6 OLTP索引圧縮によるシステムの圧縮

- 1.6.12.7 無制限のプロパティ・パス表現

- 1.6.12.8 グループ化と集計

- 1.6.13 SEM_MATCH使用時の特別な考慮事項

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

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

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

- 1.7.1.1.1 SQL*Loaderを使用したステージング表へのN-Triple形式のデータのロード

- 1.7.1.1.2 外部表を使用したステージング表へのN-Quad形式のデータのロード

- 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 Oracle Data Pumpを使用したセマンティク・ネットワークのエクスポートまたはインポート

- 1.7.6 未使用値のパージ

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

- 1.8.1 MDSYS.SEM_NETWORK_INDEX_INFOビュー

- 1.9 データ型索引の使用

- 1.10 セマンティク・モデルおよびセマンティク・ネットワークの統計の管理

- 1.10.1 モデル・レベルでの統計の保存

- 1.10.2 モデル・レベルでの統計のリストア

- 1.10.3 ネットワーク・レベルでの統計の保存

- 1.10.4 ネットワーク・レベルでの統計のリストア

- 1.10.5 モデル・レベルでの統計の設定

- 1.10.6 モデル・レベルでの統計の削除

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

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

- 1.12.1 例: 雑誌記事の情報

- 1.12.2 例: 家系の情報

- 1.13 リリース11.1以上でのソフトウェアの名前の変更

- 1.14 RDFセマンティク・グラフの詳細

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 トリプルレベル・セキュリティ

- 5.1.1 推論データとラダーベース推論(LBI)のファイングレイン・セキュリティ

- 5.1.2 拡張例: セマンティク・データへのOLSトリプルレベル・セキュリティの適用

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

- 5.2.1 RDFの主語の保護

- 5.2.2 RDFの述語の保護

- 5.2.3 RDFの目的語の保護

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

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

- 5.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 RDF Semantic Graph support for Apache Jena

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

- 7.1.1 以前のバージョンのsupport for Apache Jenaを使用していた場合

- 7.2 SPARQLサービスの設定

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

- 7.2.2 JosekiベースSPARQLサービスの構成

- 7.2.2.1 クライアント識別子

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

- 7.2.3 FusekiベースSPARQLサービスの構成

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

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

- 7.3 RDFセマンティク・グラフ環境の設定

- 7.4 SEM_MATCHおよびRDF Semantic Graph support for Apache Jenaの問合せの比較

- 7.5 SEM_MATCHまたはSQLベースの問合せ結果からのユーザーフレンドリJavaオブジェクトの取得

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

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

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

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

- 7.7.1 SQLヒント

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

- 7.7.3 追加のWHERE句述語

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

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

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

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

- 7.8 RDF Semantic Graph support for Apache JenaによりSPARQL問合せでサポートされるファンクション

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

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

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

- 7.9 SPARQLの更新のサポート

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

- 7.10.1 グラフにおけるパスの文脈情報の生成

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

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

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

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

- 7.11.4 推論オプション

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

- 7.12 RDF Semantic Graph support for Apache Jenaを使用したバルク・ロード

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

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

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

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

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

- 7.15.1 EXISTSおよびNOT EXISTSのかわりにBOUNDおよび!BOUND

- 7.15.2 SPARQL 1.1 SELECT式

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

- 7.15.4 SERVICE句の制限

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

- 7.16 RDF Semantic Graph support for Apache Jenaを使用する問合せ例

- 7.16.1 Test.java: 家族関係を問い合せる

- 7.16.2 Test6.java: OWLオントロジをロードしてOWLPrime推論を実行する

- 7.16.3 Test7.java: OWLオントロジをバルク・ロードしてOWLPrime推論を実行する

- 7.16.4 Test8.java: SPARQLのOPTIONAL問合せ

- 7.16.5 Test9.java: SPARQL問合せでのLIMITおよびOFFSETの使用

- 7.16.6 Test10.java: SPARQL問合せでのTIMEOUTおよびDOPの使用

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

- 7.16.8 Test12.java: SPARQLのASK問合せ

- 7.16.9 Test13.java: SPARQLのDESCRIBE問合せ

- 7.16.10 Test14.java: SPARQLのCONSTRUCT問合せ

- 7.16.11 Test15.java: 複数のモデルを問い合せ、重複の許可を指定する

- 7.16.12 Test16.java: SPARQLの更新

- 7.16.13 Test17.java: SPARQL問合せでのARQ組込みファンクションの使用

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

- 7.16.15 Test19.java: OracleConnectionを使用してOracle Databaseをインスタンス化する

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

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

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

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

- 7.17.2.1 RDF Semantic Graph support for Apache Jena .zipファイルをダウンロードする(まだダウンロードしていない場合)

- 7.17.2.2 WebLogic ServerにSPARQL Gatewayをデプロイする

- 7.17.2.3 必要に応じて、プロキシ設定を変更する

- 7.17.2.4 必要に応じて、OracleSGDSデータソースを構成する

- 7.17.2.5 必要に応じて、SparqlGatewayAdminGroupグループを追加し、構成する

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

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

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

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

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

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

- 7.17.5 SPARQL GatewayのJava APIの使用

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

- 7.17.6.1 メイン・ページ(index.html)

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

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

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

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

- 7.18 Apache TomcatまたはJBossにおけるJosekiのデプロイ

- 7.18.1 Apache Tomcat 6.0.29または7.0.42におけるJosekiのデプロイ

- 7.18.2 JBoss 7.1.1におけるJosekiのデプロイ

8 RDF Semantic Graph Support for OpenRDF Sesame

- 8.1 RDF Semantic Graph support for OpenRDF Sesameの概要

- 8.2 RDF Semantic Graph support for OpenRDF Sesameの設定と構成

- 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 RDFセマンティク・グラフ環境の設定

- 8.3 SEM_MATCHおよびRDF Semantic Graph support for OpenRDF Sesameの問合せの比較

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

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

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

- 8.5.1 RDF Semantic Graph support for OpenRDF Sesame問合せの文の格納と実装

- 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 RDF Semantic Graph support for OpenRDF Sesameでの索引と相互運用性

- 8.8.3 推論

- 8.8.4 分析操作の実行

- 8.9 RDF Semantic Graph support for OpenRDF SesameによるSesame Consoleの使用

- 8.10 RDF Semantic Graph support for OpenRDF Sesameを使用する問合せ例

- 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の構築[高度]

9 ユーザー定義の推論と問合せ

- 9.1 ユーザー定義の推論

- 9.1.1 ユーザー定義の推論によって解決される問題と得られる利点

- 9.1.2 ユーザー定義の推論のAPIサポート

- 9.1.2.1 ユーザー定義の推論ファンクションの要件

- 9.1.3 ユーザー定義の推論拡張ファンクションの例

- 9.1.3.1 例1: 静的トリプルの追加

- 9.1.3.2 例2: 動的トリプルの追加

- 9.1.3.3 例3: パフォーマンスの最適化

- 9.1.3.4 例4: 時間推論(いくつかの関連する例)

- 9.1.3.4.1 例4a: 期間ルール

- 9.1.3.4.2 例4b: オーバーラップ・ルール

- 9.1.3.4.3 例4c: 期間ルールとオーバーラップ・ルール

- 9.1.3.5 例5: 空間推論

- 9.1.3.6 例6: Webサービスのコール

- 9.2 ユーザー定義ファンクションと集計

- 9.2.1 ユーザー定義ファンクションと集計のデータ型

- 9.2.2 ユーザー定義ファンクションのAPIサポート

- 9.2.2.1 PL/SQLファンクションの実装

- 9.2.2.2 SPARQL問合せパターンからのユーザー定義ファンクションの起動

- 9.2.2.3 ユーザー定義ファンクションの例

- 9.2.3 ユーザー定義の集計のAPIサポート

- 9.2.3.1ODCIAggregateインタフェース

- 9.2.3.2 ユーザー定義の集計の起動

- 9.2.3.3 ユーザー定義の集計の例

10 RDFビュー: RDFとしてのリレーショナル・データ

- 10.1 リレーショナル・データでRDFビューを使用する理由

- 10.2 RDFビューのAPIサポート

- 10.2.1 直接マッピングによるRDFビューの作成

- 10.2.2 R2RMLマッピングによるRDFビューの作成

- 10.2.3 RDFビューの削除

- 10.2.4 RDFビューの仮想コンテンツのステージング表へのエクスポート

- 10.3 例: 直接マッピングによるRDFビューの使用

- 10.4 ネイティブRDFデータと仮想RDB2RDFデータの組合せ

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

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

- 11.1 SEM_APIS.ADD_DATATYPE_INDEX

- 11.2 SEM_APIS.ADD_SEM_INDEX

- 11.3 SEM_APIS.ALTER_DATATYPE_INDEX

- 11.4 SEM_APIS.ALTER_ENTAILMENT

- 11.5 SEM_APIS.ALTER_MODEL

- 11.6 SEM_APIS.ALTER_SEM_INDEX_ON_ENTAILMENT

- 11.7 SEM_APIS.ALTER_SEM_INDEX_ON_MODEL

- 11.8 SEM_APIS.ANALYZE_ENTAILMENT

- 11.9 SEM_APIS.ANALYZE_MODEL

- 11.10 SEM_APIS.BULK_LOAD_FROM_STAGING_TABLE

- 11.11 SEM_APIS.CLEANUP_FAILED

- 11.12 SEM_APIS.COMPOSE_RDF_TERM

- 11.13 SEM_APIS.CREATE_ENTAILMENT

- 11.14 SEM_APIS.CREATE_RDFVIEW_MODEL

- 11.15 SEM_APIS.CREATE_RULEBASE

- 11.16 SEM_APIS.CREATE_SEM_MODEL

- 11.17 SEM_APIS.CREATE_SEM_NETWORK

- 11.18 SEM_APIS.CREATE_SOURCE_EXTERNAL_TABLE

- 11.19 SEM_APIS.CREATE_VIRTUAL_MODEL

- 11.20 SEM_APIS.DELETE_ENTAILMENT_STATS

- 11.21 SEM_APIS.DELETE_MODEL_STATS

- 11.22 SEM_APIS.DISABLE_CHANGE_TRACKING

- 11.23 SEM_APIS.DISABLE_INC_INFERENCE

- 11.24 SEM_APIS.DROP_DATATYPE_INDEX

- 11.25 SEM_APIS.DROP_ENTAILMENT

- 11.26 SEM_APIS.DROP_RDFVIEW_MODEL

- 11.27 SEM_APIS.DROP_RULEBASE

- 11.28 SEM_APIS.DROP_SEM_INDEX

- 11.29 SEM_APIS.DROP_SEM_MODEL

- 11.30 SEM_APIS.DROP_SEM_NETWORK

- 11.31 SEM_APIS.DROP_USER_INFERENCE_OBJS

- 11.32 SEM_APIS.DROP_VIRTUAL_MODEL

- 11.33 SEM_APIS.ENABLE_CHANGE_TRACKING

- 11.34 SEM_APIS.ENABLE_INC_INFERENCE

- 11.35 SEM_APIS.ESCAPE_CLOB_TERM

- 11.36 SEM_APIS.ESCAPE_CLOB_VALUE

- 11.37 SEM_APIS.ESCAPE_RDF_TERM

- 11.38 SEM_APIS.ESCAPE_RDF_VALUE

- 11.39 SEM_APIS.EXPORT_ENTAILMENT_STATS

- 11.40 SEM_APIS.EXPORT_MODEL_STATS

- 11.41 SEM_APIS.EXPORT_RDFVIEW_MODEL

- 11.42 SEM_APIS.GET_CHANGE_TRACKING_INFO

- 11.43 SEM_APIS.GET_INC_INF_INFO

- 11.44 SEM_APIS.GET_MODEL_ID

- 11.45 SEM_APIS.GET_MODEL_NAME

- 11.46 SEM_APIS.GET_TRIPLE_ID

- 11.47 SEM_APIS.GETV$DATETIMETZVAL

- 11.48 SEM_APIS.GETV$DATETZVAL

- 11.49 SEM_APIS.GETV$NUMERICVAL

- 11.50 SEM_APIS.GETV$STRINGVAL

- 11.51 SEM_APIS.GETV$TIMETZVAL

- 11.52 SEM_APIS.IMPORT_ENTAILMENT_STATS

- 11.53 SEM_APIS.IMPORT_MODEL_STATS

- 11.54 SEM_APIS.IS_TRIPLE

- 11.55 SEM_APIS.LOAD_INTO_STAGING_TABLE

- 11.56 SEM_APIS.LOOKUP_ENTAILMENT

- 11.57 SEM_APIS.MERGE_MODELS

- 11.58 SEM_APIS.PRIVILEGE_ON_APP_TABLES

- 11.59 SEM_APIS.PURGE_UNUSED_VALUES

- 11.60 SEM_APIS.REFRESH_SEM_NETWORK_INDEX_INFO

- 11.61 SEM_APIS.REMOVE_DUPLICATES

- 11.62 SEM_APIS.RENAME_ENTAILMENT

- 11.63 SEM_APIS.RENAME_MODEL

- 11.64 SEM_APIS.SET_ENTAILMENT_STATS

- 11.65 SEM_APIS.SET_MODEL_STATS

- 11.66 SEM_APIS.SWAP_NAMES

- 11.67 SEM_APIS.UNESCAPE_CLOB_TERM

- 11.68 SEM_APIS.UNESCAPE_CLOB_VALUE

- 11.69 SEM_APIS.UNESCAPE_RDF_TERM

- 11.70 SEM_APIS.UNESCAPE_RDF_VALUE

- 11.71 SEM_APIS.VALIDATE_ENTAILMENT

- 11.72 SEM_APIS.VALIDATE_MODEL

- 11.73 SEM_APIS.VALUE_NAME_PREFIX

- 11.74 SEM_APIS.VALUE_NAME_SUFFIX

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

- 12.1 SEM_OLS.APPLY_POLICY_TO_APP_TAB

- 12.2 SEM_OLS.REMOVE_POLICY_FROM_APP_TAB

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

- 13.1 SEM_PERF.DELETE_NETWORK_STATS

- 13.2 SEM_PERF.EXPORT_NETWORK_STATS

- 13.3 SEM_PERF.GATHER_STATS

- 13.4 SEM_PERF.IMPORT_NETWORK_STATS

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

- 14.1 SEM_RDFCTX.ADD_DEPENDENT_POLICY

- 14.2 SEM_RDFCTX.CREATE_POLICY

- 14.3 SEM_RDFCTX.DROP_POLICY

- 14.4 SEM_RDFCTX.MAINTAIN_TRIPLES

- 14.5 SEM_RDFCTX.SET_DEFAULT_POLICY

- 14.6 SEM_RDFCTX.SET_EXTRACTOR_PARAM

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

- 15.1 SEM_RDFSA.ADD_VPD_CONSTRAINT

- 15.2 SEM_RDFSA.APPLY_OLS_POLICY

- 15.3 SEM_RDFSA.APPLY_VPD_POLICY

- 15.4 SEM_RDFSA.CREATE_VPD_POLICY

- 15.5 SEM_RDFSA.DELETE_VPD_CONSTRAINT

- 15.6 SEM_RDFSA.DISABLE_OLS_POLICY

- 15.7 SEM_RDFSA.DROP_VPD_POLICY

- 15.8 SEM_RDFSA.ENABLE_OLS_POLICY

- 15.9 SEM_RDFSA.MAINT_VPD_METADATA

- 15.10 SEM_RDFSA.REMOVE_OLS_POLICY

- 15.11 SEM_RDFSA.REMOVE_VPD_POLICY

- 15.12 SEM_RDFSA.RESET_MODEL_LABELS

- 15.13 SEM_RDFSA.SET_PREDICATE_LABEL

- 15.14 SEM_RDFSA.SET_RDFS_LABEL

- 15.15 SEM_RDFSA.SET_RESOURCE_LABEL

- 15.16 SEM_RDFSA.SET_RULE_LABEL

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

- A.1 RDFセマンティク・グラフ・サポートの有効化

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

- A.1.2 リリース11.1または11.2からのRDFセマンティク・グラフ・サポートのアップグレード

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

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

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

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

- A.3 RDFセマンティク・グラフ・サポートの削除

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

- B.1 ogcf:boundary

- B.2 ogcf:buffer

- B.3 ogcf:convexHull

- B.4 ogcf:difference

- B.5 ogcf:distance

- B.6 ogcf:envelope

- B.7 ogcf:getSRID

- B.8 ogcf:intersection

- B.9 ogcf:relate

- B.10 ogcf:sfContains

- B.11 ogcf:sfCrosses

- B.12 ogcf:sfDisjoint

- B.13 ogcf:sfEquals

- B.14 ogcf:sfIntersects

- B.15 ogcf:sfOverlaps

- B.16 ogcf:sfTouches

- B.17 ogcf:sfWithin

- B.18 ogcf:symDifference

- B.19 ogcf:union

- B.20 orageo:area

- B.21 orageo:buffer

- B.22 orageo:centroid

- B.23 orageo:convexHull

- B.24 orageo:difference

- B.25 orageo:distance

- B.26 orageo:intersection

- B.27 orageo:length

- B.28 orageo:mbr

- B.29 orageo:nearestNeighbor

- B.30 orageo:relate

- B.31 orageo:union

- B.32 orageo:withinDistance

- B.33 orageo:xor

C RDFセマンティク・グラフでの仮想プライベート・データベースのサポート

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

- C.1.1 RDFデータのVPDポリシー

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

- C.1.3 データ・アクセス制約

- C.1.4 RDFVPD_POLICIESビュー

- C.1.5 RDFVPD_MODELSビュー

- C.1.6 RDFVPD_POLICY_CONSTRAINTSビュー

- C.1.7 RDFVPD_PREDICATE_MDATAビュー

- C.1.8 RDFVPD_RESOURCE_RELビュー

用語集

索引

図一覧

- 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 組込みの集計

- 1-15 プロパティ・パスの構文の構成要素

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

- 1-17 データ型索引が可能なデータ型

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

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

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

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

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

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

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

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

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

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

- 7-2 PL/SQLサブプログラムと対応するRDF Semantic Graph support for Apache JenaのJavaクラスおよびメソッド

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

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

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

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

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

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

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

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

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

はじめに

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

注意:

RDFセマンティク・グラフ・サポートに関連する任意のタイプ、シノニムまたはPL/SQLパッケージを使用するには、その前に特定のアクションを実行し、前提条件を満たす必要があります。そうしたアクションと前提条件は、「RDFセマンティク・グラフ・サポートの有効化」で説明されています。

対象読者

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

このガイドの読者は、少なくとも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」を参照してください。

表記規則

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

規則

意味

太字

太字は、操作に関連するグラフィカル・ユーザー・インタフェース要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック

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

固定幅フォント

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

『Oracle Spatial and Graph RDFセマンティク・グラフ開発者ガイド』のこのリリースでの変更点

内容は次のとおりです。

- Oracle Database 12cリリース1 (12.1.0.2)での変更点

- Oracle Database 12cリリース1 (12.1.0.1)での変更点

- Apache Jena 2.7.2でのRDF Semantic Graph support for Apache Jenaの変更点

Oracle Database 12cリリース1 (12.1.0.2)での変更点

Oracle Database 12cリリース1 (12.1.0.2)の『Oracle Spatial and Graph RDFセマンティック・グラフ開発者ガイド』での変更点は、次のとおりです。

SPARQL 1.1フェデレーテッド問合せのサポート

SEM_MATCHはSPARQL 1.1フェデレーテッド問合せをサポートします。SERVICE構成要素を使用して、指定したSPARQLエンドポイントURLから結果を取得できます。この機能により、ローカルのRDFデータ(ネイティブRDFデータまたはリレーショナル・データのRDFビュー)を、W3C標準準拠のSPARQLエンドポイントによって提供される他のRDFデータ(おそらくリモート)と組み合せることができます。

SPARQL 1.1フェデレーテッド問合せの詳細は、「グラフ・パターン: SPARQL 1.1のフェデレーテッド問合せのサポート」を参照してください。

ネイティブ・トリプル・データと仮想RDB2RDFトリプル・データの組合せ

新しい項(「ネイティブRDFデータと仮想RDB2RDFデータの組合せ」)で、1つのSEM_MATCH問合せでSERVICEキーワードを使用し、ネイティブ・トリプル・データと仮想RDB2RDFトリプル・データを組み合せる方法を説明しています。

Oracle Database 12cリリース1 (12.1.0.1)での変更点

Oracle Database 12cリリース1 (12.1.0.1)の『Oracle Spatial and Graph RDFセマンティック・グラフ開発者ガイド』での変更点は、次のとおりです。

新機能

このリリースの新機能は次のとおりです。

- SPARQL 1.1の構成要素の拡張サポート

- 仮想モデルの拡張サポート

- ユーザー定義の推論および問合せのサポート

- OWL 2 ELのサポート

- OGC GeoSPARQLのサポート

- ラダーベース推論

- RDFビュー

- セマンティク・ネットワークのエクスポートおよびインポートに対するデータ・ポンプのサポート

SPARQL 1.1の構成要素の拡張サポート

SEM_MATCHは、次のSPARQL 1.1の構成要素をサポートします(「グラフ・パターン: SPARQL 1.1の構成要素のサポート」を参照)。

- ファンクションの拡張セット

- SELECT句の式

- サブ問合せ

- グループ化と集計

- 否定

- 値の割当て

- プロパティ・パス

仮想モデルの拡張サポート

モデルまたは伴意、あるいはその両方の任意の組合せで、仮想モデルを作成できるようになりました(「仮想モデル」を参照)。以前、仮想モデルは1つ以上のモデルを持つ必要があり、伴意は1つまでに限られていました。

仮想モデルは置き換えが可能になり、先に削除する必要はありません。SEM_APIS.CREATE_VIRTUAL_MODELプロシージャの新しいREPLACE=Tオプションによって、仮想モデルの定義の変更中でも、仮想モデルのアクセス権限を保持できます。(REPLACE=Tオプションを使用することは、ビューでCREATE OR REPLACE VIEWを使用することと似ています。)

ユーザー定義の推論および問合せのサポート

新しいRDFセマンティク・グラフの拡張アーキテクチャによって、ユーザー定義の機能を追加できるようになりました。

- 推論の拡張機能アーキテクチャによって、すでに提供されている推論のサポートに加えて、ユーザー定義の推論が使用可能になります。

- 問合せの拡張アーキテクチャによって、ユーザー定義ファンクションと集計を追加して、SPARQL問合せで使用できるようになります。これには、SEM_MATCHテーブル・ファンクションと、support for Apache Jenaおよびsupport for Sesameも使用されます。

これらの機能の詳細は、「ユーザー定義の推論と問合せ」を参照してください。

OWL 2 ELのサポート

OWL 2 ELプロファイルは、システム定義のルールベースOWL2ELを追加することでサポートされます(「サポートされるOWLサブセット」を参照)。

OGC GeoSPARQLのサポート

空間データの表現および問合せのためのOGC GeoSPARQL標準がサポートされるようになりました(「OGC GeoSPARQLのサポート」を参照)。

ラダーベース推論

ラダーベース推論は、ファイングレイン・トリプルレベル・セキュリティの便利なオプションとして使用可能です(「推論データとラダーベース推論(LBI)のファイングレイン・セキュリティ」を参照)。

RDFビュー

リレーショナル・データに関するRDFビューを作成および使用できます。リレーショナル・データをRDFトリプルにマップすることで、セマンティク操作を手軽に実行可能になり、リレーショナル・データに対応するRDFトリプルを格納する必要がなくなりました。詳細は、「RDFビュー: RDFとしてのリレーショナル・データ」を参照してください。

セマンティク・ネットワークのエクスポートおよびインポートに対するデータ・ポンプのサポート

Oracle Databaseリリース12.1では、「Oracle Data Pumpを使用したセマンティク・ネットワークのエクスポートまたはインポート」の説明にあるとおり、Oracle Data Pumpユーティリティの全てのデータベース・エクスポートおよびインポートの機能を使用して、セマンティク・ネットワークのエクスポートとインポートを行うことができます。

非推奨となった機能

RDFセマンティク・グラフでの次の機能のサポートは、このリリースで非推奨となり、将来のリリースでサポートが終了する可能性があります。

- 仮想プライベート・データベース(VPD) (「RDFセマンティク・グラフでの仮想プライベート・データベースのサポート」を参照)

- バージョン対応モデル(「RDFデータに対するWorkspace Managerサポート」を参照)

サポート対象外機能

このドキュメントで以前に記述されていた機能の一部は、Oracle Database12cリリース1(12.1)ではサポートされません。サポートされない機能のリストは、『Oracle Databaseアップグレード・ガイド』を参照してください。

RDF Semantic Graph support for Apache Jenaの変更点

RDF Semantic Graph support for Apache Jenaでは、jena-core-2.11.1とjena-arq-2.11.1を含むApache Jena 2.11.1がサポートされます。このサポートには以下の機能が含まれています(そのほとんどは、Apache Jena 2.7.2のサポート追加時に新たに加わったものです):

- SEM_MATCHまたはSQLベースの問合せ結果からのユーザーフレンドリJavaオブジェクト取得のサポート

- Oracle DatabaseおよびOracle NoSQL Database Enterprise Editionリリース2.0.39向けのProtegeプラグイン

- カスタマイズされたデータ・ソース名のサポート

- 29000バイトを越える変換SQLテキストによるSPARQL問合せのサポート

- 読取り専用モードのOracle Databaseのサポート

- VerboseでないJoseki出力

- 長時間実行されているSPARQL問合せの終了に責任を負う表の管理用Java APIs

- Apache TomcatおよびJBossアプリケーション・サーバーのサポート

- Fuseki 1.0.1のサポート

support for Apache Jenaの使用方法は、「RDF Semantic Graph Support for Apache Jena」を参照してください。

SEM_MATCHまたはSQLベース問合せ結果からのユーザーフレンドリJavaオブジェクト取得のサポート

ユーザーフレンドリなJavaオブジェクトをSEM_MATCHまたはSQLベースのグラフ問合せ結果から取得できるため、射影列($RDFVTYP、$RDFLTYP、$RDFLANG、$RDFCLOBなど)またはMDSYS.RDF_VALUE$内の対応する列(VALUE_TYPE、LITERAL_TYPE、LANGUAGE_TYPE、LONG_VALUEおよびVALUE_NAMEを含む)に埋め込まれたわかりづらい詳細情報を解析して理解する必要がなくなりました。

説明および例は、「SEM_MATCHまたはSQLベースの問合せ結果からのユーザーフレンドリJavaオブジェクトの取得」を参照してください。

Oracle DatabaseおよびOracle NoSQL Database Enterprise Editionリリース2.0.39向けのProtegeプラグイン

このプラグインによって、Protege 4.1のオントロジの視覚的編集機能を、Oracle DatabaseおよびOracle NoSQL Databaseの提供する堅牢なセマンティック・データ管理機能と容易に統合できます。

このプラグインの.jarファイルとインストール文書は、リリースzipファイルのprotege_plugin/ディレクトリ下にあります。

カスタマイズされたデータ・ソース名のサポート

以前のリリースでは、Josekiのデプロイメントにおいて固定データ・ソース名OracleSemDSが必須でした。このリリースでは、Joseki構成のoracle:dataSourceName設定でデータ・ソース名をカスタマイズできます。

また、問合せIDを使用して長時間実行されているSPARQL問合せを終了するために、データベース接続の確立に使用されるデータ・ソース名をカスタマイズすることもできます(詳細は、「長時間実行されているSPARQL問合せの終了」を参照)。デフォルトのデータ・ソース名を変更するには、次のJVMプロパティを編集します。

-Doracle.spatial.rdf.client.jena.dsNameForQueryMgt=OracleSemDS

29000バイトを越える変換SQLテキストによるSPARQL問合せのサポート

S2S機能は強化され、数十万バイト長のSQLテキストを変換した非常に長いSPARQL問合せをサポートしています。ただし、簡略なSPARQL問合せの方がユーザーやアプリケーション開発者が理解しやすく、またOracle Databaseが効率的に実行できるため、可能なかぎり簡略な(短い) SPARQL問合せの使用を.お薦めします。

読取り専用モードのOracle Databaseのサポート

Joseki Webサービスのエンド・ポイントは、読取り専用モードで開かれたOracle Databaseを処理できるようになりました。問合せには問題なく回答できます。

読取り専用のOracle Databaseを処理するには、問合せにS2Sを使用する必要があります。

VerboseでないJoseki出力

このリリースでは、Josekiロギングの出力量が削減されています。ただし、トレース・レベルを1以上に設定すると、デバッグ目的でより多くのトレース出力が得られます。次に例を示します。

-Doracle.spatial.rdf.client.jena.josekiTraceLevel=1

長時間実行されているSPARQL問合せの終了に責任を負う表の管理用Java APIs

次のサーブレットを使用してSPARQL問合せの終了リクエストが送信される場合。

http://<hostname>:7001/joseki/querymgt?abortqid=8761

リクエスト(問合せIDおよびタイムスタンプ)は、ユーザーのスキーマのORACLE_ORARDF_QUERY_MGT_TABと名付けられた表に記録されます。

次のメソッドが、クラスoracle.spatial.rdf.client.jena.OracleQueryProgressMonitorに追加されて、ユーザーはORACLE_ORARDF_QUERY_MGT_TAB表のエントリの問合せ、追加および削除が可能になります。これらのメソッドの詳細は、Javadoc (javadoc.zipは、リリースzipファイルのjavadoc/ディレクトリ下にあります)を参照してください。

addQuery
deleteAllQueries
deleteQuery
listQueries

Apache TomcatおよびJBossアプリケーション・サーバーのサポート

サポートは、Oracle WebLogicサーバーに加えて、Apache TomcatおよびJBossサーバーのJosekiデプロイメントに提供されています。詳細は、「Apache TomcatまたはJBossにおけるJosekiのデプロイ」を参照してください。

Fuseki 1.0.1のサポート

HTTPを介したRDFデータへの対応用に、Fuseki 1.0.1を使用することができます。

詳細は、「FusekiベースSPARQLサービスの構成」を参照してください。

第I部 概念および使用方法

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

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

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

第I部は、次の章で構成されています。

- RDFセマンティク・グラフの概要

- OWLの概要

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

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

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

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

- RDF Semantic Graph support for Apache Jena

- RDF Semantic Graph support for OpenRDF Sesame

- ユーザー定義の推論と問合せ

- RDFビュー: RDFとしてのリレーショナル・データ

1 RDFセマンティク・グラフの概要

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

- RDFの概念に関する優れた解説が、http://www.w3.org/TR/rdf-primer/のWorld Wide Web Consortium (W3C)による「RDF Primer」にあります。

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

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

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

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

- Oracleセマンティク・テクノロジ・サポートの概要

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

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

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

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

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

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

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

- データ型索引の使用

- セマンティク・モデルおよびセマンティク・ネットワークの統計の管理

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

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

- リリース11.1以上でのソフトウェアの名前の変更

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

注意:

このマニュアルで説明している操作を実行するには、「RDFセマンティク・グラフ・サポートを有効にする」に示すように、前もってデータベースでRDFセマンティク・グラフ・サポートを有効にして他の前提条件も満たす必要があります。

1.1 Oracleセマンティク・テクノロジ・サポートの概要

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

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

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

注意:

Oracle Databaseリリース11.1より前のリリースで作成した既存のセマンティク・データを使用する場合、「RDFセマンティク・グラフ・サポートの有効化」の手順に従ってデータをアップグレードする必要があります。

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

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

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)

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

MODEL_TYPE

VARCHAR2(40)

値はRDFモデルのタイプを示し、Mは通常のモデル、Vは仮想モデル、Xはセマンティク索引の内容の格納用に作成されたモデル、Dはリレーショナル・データで作成されたモデルを示します。

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

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

列名

データ型

説明

P_VALUE_ID

NUMBER

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

START_NODE_ID

NUMBER

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

CANON_END_NODE_ID

NUMBER

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

END_NODE_ID

NUMBER

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

MODEL_ID

NUMBER

トリプルが属するRDFモデルに対応するID。

COST

NUMBER

(今後使用予定)

CTXT1

NUMBER

(予約済の列。ファイングレイン・アクセス制御に使用可能)

CTXT2

VARCHAR2(4000)

(今後使用予定)

DISTANCE

NUMBER

(今後使用予定)

EXPLAIN

VARCHAR2(4000)

(今後使用予定)

PATH

VARCHAR2(4000)

(今後使用予定)

G_ID

NUMBER

トリプルのグラフ名のテキスト値に対応するVALUE_ID。Nullはデフォルト・グラフを示します(「名前付きグラフ」を参照)。

LINK_ID

VARCHAR2(71)

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

注意:

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

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は、すべて同じ正規形に変換されます。

注意:

重複したトリプルとクワッドはMDSYS.RDFM_<model>ビューの基礎となる表パーティションには格納されませんが、重複した行がアプリケーション表に含まれることはあります。たとえば、トリプルがアプリケーション表に複数回挿入された場合、MDSYS.RDFM_<model>ビューには1つしか表示されませんが、アプリケーション表内では複数行を占めます。

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

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

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

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

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

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

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

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

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

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

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.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データ・タイプの説明は、「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照してください。)

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

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

列名

データ型

説明

OWNER

VARCHAR2(30)

ルールベースの所有者

RULEBASE_NAME

VARCHAR2(25)

ルールベースの名前

RULEBASE_VIEW_NAME

VARCHAR2(30)

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

STATUS

VARCHAR2(30)

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

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

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

EXECUTE SEM_APIS.CREATE_RULEBASE('family_rb');

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

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

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

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

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

ネイティブOWL推論のサポートの詳細は、「OWL推論の使用方法」を参照してください。

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-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-90の抜粋です。)

例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データのサポートの詳細は、「RDFデータに対するWorkspace Managerサポート」を参照してください。)

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

仮想モデルを作成するには、SEM_APIS.CREATE_VIRTUAL_MODELプロシージャを使用します。仮想モデルを削除するには、SEM_APIS.DROP_VIRTUAL_MODELプロシージャを使用します。仮想モデルのコンポーネント・モデル、ルールベースまたは伴意が削除されると、その仮想モデルは自動的に削除されます。それを削除することなく仮想モデルを置き換えるには、SEM_APIS.CREATE_VIRTUAL_MODELプロシージャをREPLACE=Tオプションとともに使用します。仮想モデルを置き換えると、それを再定義する一方で、任意のアクセス権限を保持することができます。

仮想モデルを問い合せるには、例1-4に示すとおり、SEM_MATCH表関数のmodelsパラメータで仮想モデル名を指定します。

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

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

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

列名

データ型

説明

OWNER

VARCHAR2(30)

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

MODEL_ID

NUMBER

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

MODEL_NAME

VARCHAR2(25)

仮想モデルの名前。

TABLE_NAME

VARCHAR2(30)

仮想モデルの場合はNULL。

COLUMN_NAME

VARCHAR2(30)

仮想モデルの場合はNULL。

MODEL_TABLESPACE_NAME

VARCHAR2(30)

仮想モデルの場合はNULL。

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

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

列名

データ型

説明

OWNER

VARCHAR2(30)

仮想モデルの所有者。

VIRTUAL_MODEL_NAME

VARCHAR2(25)

仮想モデルの名前。

UNIQUE_VIEW_NAME

VARCHAR2(30)

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

DUPLICATE_VIEW_NAME

VARCHAR2(30)

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

STATUS

VARCHAR2(30)

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

複数の伴意がある場合は、すべてのコンポーネント伴意のうち最も低いステータスが、仮想モデルのステータスとして使用されます(INVALID < INCOMPLETE < VALID)。

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-4 仮想モデルの問合せ

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

1.3.9 名前付きグラフ

RDFセマンティク・グラフは名前付きグラフの使用をサポートしており、これについてはW3C勧告の「SPARQL Query Language for RDF」のRDFデータセットに関する項(http://www.w3.org/TR/rdf-sparql-query/#rdfDataset)で説明されています。

このサポートは、従来の主語、述語、目的語で構成されるRDFトリプルを、グラフ名を表す追加の構成要素を含めるように拡張することで実現されます。拡張されたRDFトリプルは、4つの構成要素を含みますが、このドキュメントでは引き続きRDFトリプルと呼びます。また、次の用語が使用されることもあります。

- N-Triple: 拡張トリプルを許可しない形式です。したがって、n-tripleは3つのコンポーネントを持つトリプルのみを含むことができます。

- N-Quad: 通常のトリプル(3つのコンポーネント)と拡張トリプル(グラフ名を含む4つのコンポーネント)を許可する形式です。詳細は、http://www.w3.org/TR/2013/NOTE-n-quads-20130409/を参照してください。
拡張トリプルを含むファイル(通常は標準トリプルが混在)をOracle Databaseにロードする場合、入力ファイルはN-Quad形式である必要があります。

RDFトリプルのグラフ名の構成要素は、NULLまたはURIである必要があります。これがNULLの場合、RDFトリプルはデフォルト・グラフに属していると言われます(それ以外の場合、URIで指定された名前を持つ名前付きグラフに属していると言われます)。

また、SDO_RDF_TRIPLE_Sオブジェクト型(「セマンティク・データの型、コンストラクタ、およびメソッド」を参照)の名前付きグラフをサポートするため、モデル-グラフ(モデルとグラフ(存在する場合)の組合せ)を指定するための新しい構文が用意され、RDF_M_ID属性はモデル-グラフの識別子(グラフ(存在する場合)のモデルIDと値IDの組合せ)を保持します。モデル-グラフの名前をmodel_nameとして指定し、グラフが存在する場合は、その後にコロン(:)区切り文字とグラフ名が続きます(これはURIであり、山カッコ< >で囲まれる必要があります)。

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

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

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

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

- 問合せ: 「GRAPHキーワードのサポート」と「SELECT句の式」

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

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のTriGファイルをDatasetGraphOracleSemオブジェクトにロード(たとえば、「RDF Semantic Graph Support for Apache Jenaを使用したバルク・ロード」の例7-12を使用)する場合に、定数"N-QUADS"を"TRIG"に置き換えると、デフォルト・グラフ内のトリプルは、トリプルとしてnullグラフ名とともにOracle Databaseにロードされ、名前付きグラフ内のトリプルは指定されたグラフ名とともにOracle Databaseにロードされます。

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

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

<http://my.com/John> <http://purl.org/dc/elements/1.1/publisher> <http://publisher/Xyz> .
<http://my.com/John> <http://xmlns.com/foaf/0.1/name> "John Doe" <http://my.com/John>

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

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

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

名前

含まれる情報

参照先

RDF_VALUE$

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

文

RDFOLS_SECURE_RESOURCE

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

RDFOLS_SECURE_RESOURCEビュー

RDFVPD_MODELS

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

RDFVPD_MODELSビュー

RDFVPD_POLICIES

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

RDFVPD_POLICIESビュー

RDFVPD_POLICY_CONSTRAINTS

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

RDFVPD_PREDICATE_MDATAビュー

RDFVPD_PREDICATE_MDATA

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

RDFVPD_PREDICATE_MDATAビュー

RDFVPD_RESOURCE_REL

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

RDFVPD_RESOURCE_RELビュー

SEM_DTYPE_INDEX_INFO

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

データ型索引の使用

SEM_MODEL$

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

モデルのメタデータ

SEM_NETWORK_INDEX_INFO$

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

MDSYS.SEM_NETWORK_INDEX_INFOビュー

SEM_RULEBASE_INFO

ルールベース

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

SEM_RULES_INDEX_DATASETS

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

伴意(ルール索引)

SEM_RULES_INDEX_INFO

伴意(ルール索引)

伴意(ルール索引)

SEM_VMODEL_INFO

仮想モデル

仮想モデル

SEM_VMODEL_DATASETS

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

仮想モデル

SEMCL_entailment-name

owl:sameAsクリーク・メンバーと正規形の代表

owl:sameAs推論の最適化

SEMI_entailment-name

指定した伴意のトリプル

伴意(ルール索引)

SEMM_model-name

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

モデルのメタデータ

SEMR_rulebase-name

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

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

SEMU_virtual-model-name

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

仮想モデル

SEMV_virtual-model-name

仮想モデル内のトリプル

仮想モデル

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です。仮想モデルを問い合せる場合、他のモデル名は指定せず、その仮想モデルの名前のみを指定します。(仮想モデルの詳細は、「仮想モデル」を参照してください。)

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

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

SEM_MATCH表関数とSEM_CONTAINSおよびSEM_RELATED演算子では、次のデフォルトの名前空間(namespace_id属性とnamespace_val属性)が使用されます。

('ogc', 'http://www.opengis.net/ont/geosparql#')
('ogcf', 'http://www.opengis.net/def/function/geosparql/')
('ogcgml', 'http://www.opengis.net/ont/gml#')
('ogcsf', 'http://www.opengis.net/ont/sf#')
('orardf', 'http://xmlns.oracle.com/rdf/')
('orageo', 'http://xmlns.oracle.com/rdf/geo/')
('owl',    'http://www.w3.org/2002/07/owl#')
('rdf',    'http://www.w3.org/1999/02/22-rdf-syntax-ns#')
('rdfs',   'http://www.w3.org/2000/01/rdf-schema#')
('xsd',    'http://www.w3.org/2001/XMLSchema#')

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

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

注意:

filter属性を使用するかわりに、できるかぎり問合せパターン内でFILTERキーワードを使用してください(「グラフ・パターン: 中カッコの構文とOPTIONAL、FILTER、UNIONおよびGRAPHキーワードのサポート」を参照)。FILTERキーワードを使用すると、内部が最適化されるため、パフォーマンスが向上する傾向があります。ただし、FILTERキーワードで表現できないSQL構成要素が必要な場合は、filter引数が便利です。

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

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

- ALL_BGP_HASHおよびALL_BGP_NLは、すべてのBGP間の結合(ルートBGPとOPTIONAL BGPの間の結合など)で指定の結合タイプを使用する必要があることを示すグローバル問合せオプティマイザ・ヒントです。(BGPは、basic graph patternの略語です)。W3C勧告の「SPARQL Query Language for RDF」の説明では、「SPARQLのグラフ・パターン照合は、基本グラフ・パターンの照合結果を組み合せるという観点で定義されています。単一の基本グラフ・パターンは、フィルタの割込がある一連のトリプル・パターンによって形成されます。任意のグラフ・パターンによって、基本グラフ・パターンが終了します」と記述されています。
BGP_JOIN(USE_NL)およびBGP_JOIN(USE_HASH) HINT0問合せオプティマイザ・ヒントを使用して、結合タイプをきめ細かく制御できます。

例1-14に、SEM_MATCH問合せで使用されるALL_BGP_HASHオプションを示します。

- ALL_LINK_HASHおよびALL_LINK_NLは、すべてのRDF_LINK$結合(BGP内のトリプル・パターン間のすべての結合)の結合タイプを指定するグローバル問合せオプティマイザ・ヒントです。ALL_LINK_HASHとALL_LINK_NLも、きめ細かい制御のためにHINT0問合せオプティマイザ内で使用できます。

- ALL_MAX_PP_DEPTH(n)はグローバル問合せオプティマイザ・ヒントです。これは、プロパティ・パス演算子*と+の評価に使用する最大深度を設定します。デフォルト値は10です。MAP_PP_DEPTH(n) HINT0ヒントは、さらに細かく最大深度を指定するために使用できます。

- ALL_ORDEREDは、問合せ内の各BGPのトリプル・パターンが順番に評価される必要があることを指定するグローバル問合せオプティマイザ・ヒントです。
例1-14に、SEM_MATCH問合せで使用されるALL_ORDEREDオプションを示します。

- ALL_USE_PP_HASHおよびALL_USE_PP_NLは、プロパティ・パス表現の評価に使用する結合タイプを指定するグローバル問合せオプティマイザ・ヒントです。USE_PP_HASHおよびUSE_PP_NL HINT0ヒントは、結合タイプをさらにきめ細かく指定するために使用できます。

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

- ALLOW_PP_DUP=Tは、+および*プロパティ・パス問合せで結果の重複を許可します。結果の重複が認められると、最初の結果行が早く戻されます。

- CLOB_AGG_SUPPORT=Tは、集計(MIN、MAX、GROUP_CONCAT、SAMPLE)でCLOB値のサポートを有効にします。CLOBサポートを有効化するとパフォーマンスが大幅に低下することに注意してください。

- CLOB_EXP_SUPPORT=Tは、一部の組込みSPARQL関数でのCLOB値のサポートを有効にします。CLOBサポートを有効化するとパフォーマンスが大幅に低下することに注意してください。

- CONSTRUCT_STRICT=Tは、SPARQL CONSTRUCTまたはSPARQL DESCRIBE構文の問合せの結果から無効なRDFトリプルを消去します。主語の位置にリテラルがあるRDFトリプル、または述語の位置にリテラルか空白ノードがあるRDFトリプルは無効とみなされます。

- CONSTRUCT_UNIQUE=Tは、SPARQL CONSTRUCTまたはSPARQL DESCRIBE構文の問合せの結果から重複RDFトリプルを消去します。

- DO_UNESCAPE=Tは、返却列のvar、var$_PREFIX、var$_SUFFIX、var$RDFCLOB、var$RDFLTYP、var$RDFLANGおよびvar$RDFTERMの文字を、W3CのN-Triples仕様(http://www.w3.org/TR/rdf-testcases/#ntriples)に従ってエスケープしません。
SEM_APIS.ESCAPE_CLOB_TERM、SEM_APIS.ESCAPE_CLOB_VALUE、SEM_APIS.ESCAPE_RDF_TERM、SEM_APIS.ESCAPE_RDF_VALUE、SEM_APIS.UNESCAPE_CLOB_TERM、SEM_APIS.UNESCAPE_CLOB_VALUE、SEM_APIS.UNESCAPE_RDF_TERMおよびSEM_APIS.UNESCAPE_RDF_VALUEのリファレンス情報も参照してください。

- FINAL_VALUE_HASHおよびFINAL_VALUE_NLは、FILTER句で使用されていない問合せ変数の字句の値を取得するために、使用する必要がある結合メソッドを指定するグローバル問合せオプティマイザ・ヒントです。

- GRAPH_MATCH_UNNAMED=Tを使用すると、名前なしトリプル(null G_ID)をGRAPH句内で照合可能になります。つまり、グラフが等しい場合、またはグラフの一方または両方がnullの場合、2つのトリプルはグラフ結合条件を満たすことになります。データセットに名前なしTBOXトリプルまたは名前なし伴意トリプルが含まれている場合に、このオプションが役立つことがあります。

- HINT0={<hint-string>}(発音および表記は"hint (ヒント)"と数字のゼロ)は、1つ以上のキーワードを、問合せの実行計画および結果に影響を与えるヒントとともに指定します。概念的には、n個のトリプル・パターンを持つグラフ・パターンで、m個の固有の変数を参照した場合、(n+m)方向の結合となります。つまり、ターゲットRDFモデルおよび対応する伴意(オプション)のn方向の自己結合が実行された後、値からm個の変数を検索するために、RDF_VALUE$でm個の結合が実行されます。ヒント指定は、問合せ実行で使用される結合順序と結合タイプに影響を与えます。
ヒント指定<hint-string>では、キーワードを使用します。一部のキーワードは、問合せで使用される各トリプル・パターンおよび変数ごとに、一連(一群)の別名または参照で構成されるパラメータを持ちます。トリプル・パターンの別名の形式は、tiです。iは、問合せ内のトリプル・パターンの0から始まる序数です。たとえば、問合せ内の最初のトリプル・パターンの別名はt0で、2番目のトリプル・パターンの別名はt1、...のようになります。問合せで使用される変数の別名は単に、その変数の名前です。このため、ヒント指定では、グラフ・パターンで使用される変数?xの別名として?xが使用されます。

問合せの実行計画に影響を与えるために使用するヒントには、LEADING(<sequence of aliases)、USE_NL(<set of aliases)、USE_HASH(<set of aliases)およびINDEX(<alias <index_name)があります。これらのヒントの書式と基本的な意味は、SQL文のヒントと同じです(『Oracle Database SQL言語リファレンス』を参照)。

例1-10に、SEM_MATCH問合せで使用されるHINT0オプションを示します。

- HTTP_METHOD=POST_PARは、URLエンコーディング・パラメータ・パスを含むHTTP POSTメソッドをSERVICEリクエストに対して使用する必要があると指定します。リクエストのデフォルト・オプションはHTTP GETメソッドです。SPARQLプロトコルの詳細は、http://www.w3.org/TR/2013/REC-sparql11-protocol-20130321/#protocolを参照してください。

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

- PLUS_RDFT=Tは、SPARQL SELECT構文(「SELECT句の式」を参照)で、射影される各問合せ変数のvar$RDFTERM CLOB列を追加で返す場合に使用できます。この列の値は、SEM_APIS.COMPOSE_RDF_TERM(var, var$RDFVTYP, var$RDFLTYP, var$RDFLANG, var$RDFCLOB)の結果と同等です。このオプションを使用する場合、各変数varの戻り列は、var、var$RDFVID、var$_PREFIX、var$_SUFFIX、var$RDFVTYP、var$RDFCLOB、var$RDFLTYP、var$RDFLANGおよびvar$RDFTERMになります。

- PLUS_RDFT=VCは、SPARQL SELECT構文(「SELECT句の式」を参照)で、射影される各問合せ変数のvar$RDFTERM VARCHAR2(4000)列を追加で返す場合に使用できます。この列の値は、SEM_APIS.COMPOSE_RDF_TERM(var, var$RDFVTYP, var$RDFLTYP, var$RDFLANG)の結果と同等です。このオプションを使用する場合、各変数varの戻り列は、var、var$RDFVID、var$_PREFIX、var$_SUFFIX、var$RDFVTYP、var$RDFCLOB、var$RDFLTYP、var$RDFLANGおよびvar$RDFTERMになります。

- PROJ_EXACT_VALUES=Tは、関数から返される値と、値割当て文で使用される定数値の正規化を無効にします。これらの値はデフォルトでは正規化されます。

- SERVICE_CLOB=Fは、サービスをコールするときにvar$RDFCLOBの列値を保存するかわりに値にnullを設定します。CLOBデータがアプリケーションで必要ない場合、このオプションを使用してCLOB処理を省略するとパフォーマンスを向上させることができます。

- SERVICE_ESCAPE=Fは、SPARQL SERVICEコールから返されるRDFリテラル値の文字のエスケープを無効にします。RDFリテラル値はデフォルトではエスケープされます。文字のエスケープがアプリケーションに関係ない場合は、文字のエスケープを無効にするとパフォーマンスを向上させることができます。

- SERVICE_JPDWN=Tは、SPARQL SERVICEでネステッド・ループ結合を使用するための問合せオプティマイザ・ヒントです。例1-70に、SEM_MATCH問合せで使用されるSERVICE_JPDWN=Tオプションを示します。

- SERVICE_PROXY=<proxy-string>は、http接続を実行するときに使用されるプロキシ・アドレスを設定します。指定したproxy-stringがSERVICE問合せで使用されます。例1-73に、プロキシ・アドレスを含むSEM_MATCH問合せを示します。

- STRICT_AGG_CARD=Tは、一致しなかったグラフ・パターンを含む集計問合せで、SPARQLセマンティク(1つのnull行)をSQLセマンティク(0行)のかわりに使用します。このオプションによってパフォーマンスがわずかに低下します。

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

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

named_graphs属性は、GRAPH句で照合可能な名前付きグラフのセットを指定します。そのデータ型はSEM_GRAPHSで、TABLE OF VARCHAR2(4000)という定義を持ちます。この属性のデフォルト値はNULLです。named_graphsがNULLの場合、問合せモデルのセット内のすべての名前付きグラフを、GRAPH句によって照合することができます。

SEM_MATCH表関数では、入力変数に応じた要素とともにANYDATASET型のオブジェクトが戻されます。次の説明において、varは問合せで使用される変数名を示します。変数varごとに、結果要素にはvar、var$RDFVID、var$_PREFIX、var$_SUFFIX、var$RDFVTYP、var$RDFCLOB、var$RDFLTYPおよびvar$RDFLANGの各属性が含まれます。

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

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

変数値の列とともに、SPARQL SELECT構文を使用するSEM_MATCH問合せは、追加のNUMBER列であるSEM$ROWNUMを戻します(この列は、SPARQL ORDER BY句を含む問合せの正しい結果順序を保証するために使用できます)。

SPARQL ASK構文を使用するSEM_MATCH問合せは、列ASK、ASK$RDFVID、ASK$_PREFIX、ASK$_SUFFIX、ASK$RDFVTYP、ASK$RDFCLOB、ASK$RDFLTYP、ASK$RDFLANGおよびSEM$ROWNUMを返します。これは、1つの?ask変数を射影するSPARQL SELECT構文の問合せと同じです。

SPARQL CONSTRUCTまたはSPARQL DESCRIBE構文を使用するSEM_MATCH問合せは、問合せ結果バインディングではなくRDFトリプル・データを含む列を返します。これらの問合せは、主語、述語および目的語のコンポーネントについて値を返します。詳細は、「グラフ・パターン: SPARQL CONSTRUCT構文のサポート」を参照してください。

SEM_RELATED演算子を使用してOWLオントロジを問い合せる方法の詳細は、「セマンティク演算子を使用したリレーショナル・データの問合せ」を参照してください。

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

この項には次のトピックも含まれます。

- 不完全または無効な伴意による問合せの実行

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

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

- グラフ・パターン: SPARQL 1.1の構成要素のサポート

- グラフ・パターン: SPARQL 1.1のフェデレーテッド問合せのサポート

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

- 全文検索

- 空間のサポート

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

- SEM_MATCH使用時の特別な考慮事項

例1-9 SEM_MATCH表関数

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

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

例1-10 SEM_MATCH表関数を使用したHINT0オプション

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

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

例1-11 SEM_MATCH表関数

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

SELECT t.r
FROM TABLE (SEM_MATCH (
'{?r rdfs:subClassOf :Proteins .
?r rdfs:subClassOf :Complexes}',
SEM_Models ('BioPax'),
SEM_Rulebases ('rdfs'),
SEM_Aliases (SEM_ALIAS('', 'http://www.biopax.org/release1/biopax-release1.owl')),
NULL)) t;

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

1.6.1 不完全または無効な伴意による問合せの実行

関連する伴意のステータスが無効の場合でも、SEM_MATCH表関数のindex_status属性に文字列値INCOMPLETEまたはINVALIDを指定すると、セマンティク・データを問い合せることができます。(伴意のステータスは、「伴意(ルール索引)」に記載されているとおり、MDSYS.SEM_RULES_INDEX_INFOビューのSTATUS列に格納されます。)(SEM_MATCH表関数については、「SEM_MATCH表関数を使用したセマンティク・データの問合せ」を参照してください。)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

表1-12 FILTER句で使用できる組込み関数

機能

説明

ABS(RDF term)

termの絶対値を戻します。termが数値以外の場合は、nullを戻します。

BNODE(literal)またはBNODE()

問合せのデータセット内のすべての空白ノード、および他の問合せでこの関数によって作成された空白ノードとは別の空白ノードを構築します。引数を指定しない形式では、すべてのコールで異なる空白ノードが構築されます。単純なリテラルを指定する形式の場合、異なる単純なリテラルに対しては異なる空白ノードが構築され、同じ単純なリテラルを使用したコールでは同じ空白ノードが構築されます。

BOUND(variable)

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

CEIL(RDF term)

term以上の最も近い小数部分なしの数値を戻します。termが数値以外の場合は、nullを戻します。

COALESCE(term list)

エラーが発生せずに評価された引数リストの最初の要素を戻します。評価される場合は、バインドされていない変数でエラーが発生します。有効な要素が語句リストにない場合は、nullを戻します。

CONCAT(term list)

語句リスト内の文字列値を連結した結果のxsd:String値を戻します。

CONTAINS(literal, match)

文字列matchがliteral内で検出された場合に、trueを戻します。それ以外の場合はfalseを戻します。

DATATYPE(literal)

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

DAY(argument)

引数の日部分に対応する整数を戻します。引数がdateTimeまたはdateデータ型でない場合は、null値を戻します。

ENCODE_FOR_URI(literal)

literal内の予約済文字がエスケープされ、そのパーセントエンコード形式に変換される文字列を戻します。

EXISTS(pattern)

含まれているグループ・グラフ・パターンと現在のアクティブ・グラフ内の現在のバインディングを使用して、パターンが問合せデータセットと一致する場合に、trueを戻します。一致がない場合は、falseを戻します。

FLOOR(RDF term)

termを下回る、最も近い小数部分なしの数を戻します。termが数値以外の場合は、nullを戻します。

HOURS(argument)

argumentの時間部分に対応する整数を戻します。引数がdateTimeまたはdateデータ型でない場合は、null値を戻します。

IF(condition, expression1, expression2)

条件を評価して、有効なブール値を取得します。trueの場合、最初の式が評価され、その値が戻されます。falseの場合、2つ目の式が使用されます。条件でエラーが発生した場合、エラーはIF文の結果として渡されます。

IRI(RDF term)

引数termの文字列表現を解決するIRIを戻します。問合せで定義されているベースIRIがある場合、IRはそれに対して解決され、結果は絶対IRIになる必要があります。

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を戻します。

IsNUMERIC(RDF term)

termが数値の場合は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を戻します。

LCASE(literal)

リテラル内の各文字を対応する子文字に変換して、文字列を戻します。

MD5(literal)

MD5ハッシュ関数に対応する、literalのチェックサムを戻します。

MINUTES(argument)

argumentの分部分に対応する整数を戻します。引数がdateTimeまたはdateデータ型でない場合は、null値を戻します。

MONTH(argument)

argumentの月部分に対応する整数を戻します。引数がdateTimeまたはdateデータ型でない場合は、null値を戻します。

NOT_EXISTS(pattern)

含まれているグループ・グラフ・パターンと現在のアクティブ・グラフ内の現在のバインディングを使用して、パターンが問合せデータセットと一致しない場合に、trueを戻します。それ以外の場合はfalseを戻します。

NOW()

問合せ実行時点の現在の時刻に対応するxsd:dateTime値を戻します。

RAND()

[0,1)のレンジ内の数値を生成します。

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'は照合前に正規表現から空白文字を削除します。

REPLACE(string, pattern, replacement)

string内の正規表現patternの一致箇所が、それぞれreplacementに置き換えられた文字列を戻します。サポートされる正規表現の詳細は、『Oracle Database SQL言語リファレンス』の付録「Oracleの正規表現のサポート」を参照してください。

REPLACE(string, pattern, replacement, flags)

string内の正規表現patternの一致箇所が、それぞれreplacementに置き換えられた文字列を戻します。使用可能なオプション: 's'はドットがすべてに一致するモード('.'は改行文字を含む任意の文字と一致)、'm'は複数行モード('^'は任意の行の先頭と一致し、'$'は任意の行の末尾と一致)、'i'は大/小文字を区別しないモード、'x'は照合前に正規表現から空白文字を削除します。

サポートされる正規表現の詳細は、『Oracle Database SQL言語リファレンス』の付録「Oracleの正規表現のサポート」を参照してください。

ROUND(RDF term)

termに最も近い小数部分なしの数を戻します。2つの値が存在する場合、正の無限大に近い方の値が戻されます。termが数値以外の場合は、nullを戻します。

sameTerm(RDF term, RDF term)

sameTerm(x, y)は、xおよびyが同じRDF語句の場合にtrueを戻し、それ以外の場合はfalseを戻します。

SECONDS(argument)

argumentの秒部分に対応する整数を戻します。引数がdateTimeまたはdateデータ型でない場合は、null値を戻します。

SHA1(literal)

SHA1ハッシュ関数に対応する、literalのチェックサムを戻します。

SHA256(literal)

SHA256ハッシュ関数に対応する、literalのチェックサムを戻します。

SHA384(literal)

SHA384ハッシュ関数に対応する、literalのチェックサムを戻します。

SHA512(literal)

SHA512ハッシュ関数に対応する、literalのチェックサムを戻します。

STR(RDF term)

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

STRAFTER(literal, literal)

StrAfter (x,y)は、x内でyの最初の一致からxの末尾までの部分文字列に対応する文字列部分を戻します。x内にyの一致がない場合は、空の文字列が戻されます。

STRBEFORE(literal, literal)

StrBefore (x,y)は、xの先頭からyの最初の一致までに対応する文字列部分を戻します。x内にyの一致がない場合は、空の文字列が戻されます。

STRDT(string, datatype)

引数として渡されるstring字句形式とdatatypeで構成されるリテラル語句を構築します。datatypeはURIである必要があり、そうでない場合はNULL値を戻します。

STRENDS(literal, match)

文字列literalが文字列matchで終わる場合にtrueを戻します。それ以外の場合はfalseを戻します。

STRLANG (string, languageTag)

引数として渡されたstring字句形式と言語タグから成る文字列を構築します。

STRLEN(literal)

literalの字句形式の長さを戻します。

STRSTARTS(literal, match)

文字列literalが文字列matchで始まる場合に、trueを戻します。それ以外の場合はfalseを戻します。

STRUUID()

新しいUUIDのスキーム・セクションを含む文字列を戻します。

SUBSTR(term, startPos)

startPosからtermの末尾までの、termの部分と対応する文字列を戻します。先頭文字の索引は1です。

SUBSTR(term, startPos, length)

startPosからlength文字までの、termの部分に対応する文字列を戻します。先頭文字の索引は1です。

term IN (term list)

xをtermlistの値のいずれかで検出できた場合、式x IN(term list)はtrueを戻します。検出されない場合は、falseを戻します。長さ0のリストは有効です。termlistの値のいずれかでエラーが発生すると、エラーのためxは検出されません。

term NOT IN (term list)

xをterm listの値のいずれかで検出できた場合、式x NOT IN(term list)はfalseを戻します。検出されない場合は、trueを戻します。長さ0のリストは有効です。term listの値のいずれかでエラーが発生すると、エラーのためxは検出されません。

TIMEZONE(argument)

xsd:dayTimeDuration値としてargumentのタイムゾーン・セクションを戻します。引数がdateTimeまたはdateデータ型でない場合は、null値を戻します。

TZ(argument)

argumentのタイムゾーン部分に対応する整数を戻します。引数がdateTimeまたはdateデータ型でない場合は、null値を戻します。

UCASE(literal)

literal内の各文字を対応する大文字に変換して、文字列を戻します。

URI(RDF term)

IRI(RDF term)のシノニム

UUID()

新しいUniversal Unique Identifierを含むURIを戻します。この値およびバージョンは、PL/SQL関数sys_guid ()と対応します。

YEAR(argument)

argumentの年部分に対応する整数を戻します。

SEM_MATCHで使用可能な組込み関数の理解を深めるには、SPARQL問合せ言語指定(http://www.w3.org/TR/sparql11-query/)において定義される組込み関数の説明も参照してください。

次のXMLスキーマをキャストする関数は、FILTER句で使用できます。これらの関数は、RDF語句を入力として取得して必要な型の新しいRDF語句を戻すか、RDF語句を目的の型にキャストできない場合はエラーを発生させます。型キャストの詳細は、XPath問合せの仕様(http://www.w3.org/TR/xpath-functions/#casting-from-primitive-to-primitive)の17.1項を参照してください。これらの関数は、XMLネームスペースxsd : http://www.w3.org/2001/XMLSchema#を使用します。

- xsd:string (RDF term)

- xsd:dateTime (RDF term)

- xsd:boolean (RDF term)

- xsd:integer (RDF term)

- xsd:float (RDF term)

- xsd:double (RDF term)

- xsd:decimal (RDF term)

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

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

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

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

例1-12 中カッコの構文

例1-12は、中カッコとピリオドを含む構文を使用してSEM_MATCH表関数内のグラフ・パターンを表現しています。

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

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

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

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

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

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

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

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

単一の問合せに複数のOPTIONALグラフ・パターンを含むことが可能であり、ネスト化またはパラレル化することもできます。例1-15は、例1-14を変更してOPTIONALグラフ・パターンをネスト化したものです。この例では、祖父ごとに、(1)祖父が参加した試合、または祖父が試合に参加しなかった場合はnullを戻し、(2)祖父が試合に参加した場合は同じ試合に参加した孫の年齢、または孫と共通の試合がなかった場合はnullを戻します。例1-15では、ネストされたOPTIONALグラフ・パターン「?y :plays ?game . ?y :age ?age」が一致しない場合でも、?gameに対して値が戻される点に注意してください。

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

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

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

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

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

例1-17では、NYまたはCAに居住している祖父のみの孫の情報が戻されるように、FILTER構成要素を使用して例1-12を変更しています。

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

例1-18 中カッコの構文とREGEXおよびSTR組込み関数を使用したFILTER構成要素

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

SELECT x, y, z
FROM TABLE(SEM_MATCH(
'{?x :grandParentOf ?y . ?x rdf:type :Male . ?x :email ?z
FILTER (REGEX(STR(?z), "@oracle\\.com$"))}',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null));

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

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

SELECT x, y
FROM TABLE(SEM_MATCH(
'{?x :grandParentOf ?y . ?x rdf:type :Male
{{?x :residentOf ?z} UNION {?x :ownsPropertyIn ?z}}
FILTER (?z = "NY"  || ?z = "CA")}',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null));

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

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

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

パラメータの値

デフォルト・グラフ

名前付きグラフのセット

graphs: NULL

named_graphs: NULL

すべての名前なしトリプルと、すべての名前付きグラフ・トリプルのすべての和集合。(ただし、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}

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

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

例1-20では、GRAPH構成要素を使用して、グラフ・パターン照合の範囲を特定の名前付きグラフに指定しています。この例では、<http://www.example.org/family/Smith>名前付きグラフで、すべての人の名前および電子メール・アドレスを検出します。

SELECT name, email
FROM TABLE(SEM_MATCH(
'{GRAPH :Smith {
?x :name ?name . ?x :email ?email } }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null));

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

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

SELECT name, email
FROM TABLE(SEM_MATCH(
'{GRAPH ?g {
?x :name ?name . ?x :email ?email } }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null,null,null,null,
SEM_GRAPHS('<http://www.example.org/family/Smith>',
':Jones')));

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

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

FROM TABLE(SEM_MATCH(
'{?x :name ?name . ?x :email ?email }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null,null,null,
SEM_GRAPHS('<http://www.example.org/family/Smith>',
':Jones'),
null));

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

SEM_MATCHでは、問合せパラメータに完全指定のSPARQL ASK問合せを使用できます。

ASK問合せは、指定の問合せパターンに対する解が存在するかどうかをテストするために使用されます。他の形式のSPARQL問合せとは異なり、ASK問合せでは問合せパターンの解に関する情報は返されません。かわりに、解が存在する場合は"true"^^xsd:boolean、解が存在しない場合は"false"^^xsd:booleanが返されます。

すべてのSPARQL ASK問合せは同じ列(ASK、ASK$RDFVID、ASK$_PREFIX、ASK$_SUFFIX、ASK$RDFVTYP、ASK$RDFCLOB、ASK$RDFLTYP、ASK$RDFLANG、SEM$ROWNUM)を返します。これらの列は、1つの?ask変数を射影するSPARQL SELECT構文の問合せと同じであることに注意してください。

SPARQL ASK問合せは、同等のSPARQL SELECT構文の問合せよりもパフォーマンスが高くなります。ASK問合せは、問合せ変数の字句の値を取得する必要がなく、1つの結果が見つかると問合せの実行を停止できるためです。

SPARQL ASK問合せはSPARQL SELECT問合せと同じ構文を使用しますが、最上位のSELECT句をキーワードASKで置き換える必要があります。

例1-23 SPARQL ASK

例1-23に、10メガ・ピクセル超で50ドル未満のカメラが売り出されているかどうかを判別するSPARQL ASK問合せを示します。

SELECT ask
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
ASK
WHERE
{?x :price ?p .
?x :megapixels ?m .
FILTER (?p < 50 && ?m > 10)
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

SPARQL ASK問合せの詳細は、W3C SPARQL仕様、特にhttp://www.w3.org/TR/sparql11-query/#askも参照してください。

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

SEM_MATCHでは、問合せパラメータに完全指定のSPARQL CONSTRUCT問合せを使用できます。

CONSTRUCT問合せは、格納されているRDFデータからRDFグラフを構築するために使用されます。SPARQL SELECT問合せとは対照的に、CONSTRUCT問合せは問合せの解(変数バインディング)のセットではなくRDFトリプルのセットを返します。

すべてのSPARQL CONSTRUCT問合せは、SEM_MATCHから同じ列を返します。これらの列は、RDFトリプルの主語、述語および目的語に対応し、トリプルの構成要素ごとに10個の列があります。この他にSEM$ROWNUM列も返されます。具体的には返される列は次のとおりです。

SUBJ
SUBJ$RDFVID
SUBJ$_PREFIX
SUBJ$_SUFFIX
SUBJ$RDFVTYP
SUBJ$RDFCLOB
SUBJ$RDFLTYP
SUBJ$RDFLANG
SUBJ$RDFTERM
SUBJ$RDFCLBT
PRED
PRED$RDFVID
PRED$_PREFIX
PRED$_SUFFIX
PRED$RDFVTYP
PRED$RDFCLOB
PRED$RDFLTYP
PRED$RDFLANG
PRED$RDFTERM
PRED$RDFCLBT
OBJ
OBJ$RDFVID
OBJ$_PREFIX
OBJ$_SUFFIX
OBJ$RDFVTYP
OBJ$RDFCLOB
OBJ$RDFLTYP
OBJ$RDFLANG
OBJ$RDFTERM
OBJ$RDFCLBT
SEM$ROWNUM

各コンポーネントで、COMP、COMP$RDFVID、COMP$_PREFIX、COMP$_SUFFIX、COMP$RDFVTYP、COMP$RDFCLOB、COMP$RDFLTYPおよびCOMP$RDFLANGは、SPARQL SELECT問合せの同じ列の値に対応します。COMP$RDFTERMはN-Triple構文のVARCHAR2(4000) RDF語句を保持し、COMP$RDFCLBTはN-Triple構文のCLOB RDF語句を保持します。

SPARQL CONSTRUCT問合せはSPARQL SELECT問合せと同じ構文を使用しますが、最上位のSELECT句をCONSTRUCTテンプレートで置き換えます。CONSTRUCTテンプレートは、WHERE句に定義された問合せパターンの結果を使用して結果のRDFグラフの作成方法を決定します。CONSTRUCTテンプレートでは、キーワードCONSTRUCTの後に、中カッコで囲まれた一連のSPARQLトリプル・パターンが続きます。キーワードOPTIONAL、UNION、FILTER、MINUS、BIND、VALUESおよびGRAPHは、CONSTRUCTテンプレートでは使用できません。プロパティ・パス表現もCONSTRUCTテンプレート内で使用できません。ただし、WHERE句内の問合せパターンではこれらのキーワードを使用できます。

SPARQL CONSTRUCT問合せは、次の方法で結果のRDFグラフを構築します。WHERE句から返される結果行ごとに、変数値がCONSTRUCTテンプレートに代入され、1つ以上のRDFトリプルが作成されます。例1-24のWHERE句のグラフ・パターンが次の結果行を返すとします。

E$RDFTERM

FNAME$RDFTERM

LNAME$RDFTERM

ent:employee1

"Fred"

"Smith"

ent:employee2

"Jane"

"Brown"

ent:employee3

"Bill"

"Jones"

例1-24のSEM_MATCH CONSTRUCT問合せ全体は、6個のRDFトリプルに対応する次の行を返します(問合せパターンの結果行ごとに2個ずつ)。

SUBJ$RDFTERM

PRED$RDFTERM

OBJ$RDFTERM

ent:employee1

foaf:givenName

"Fred"

ent:employee1

foaf:familyName

"Smith"

ent:employee2

foaf:givenName

"Jane"

ent:employee2

foaf:familyName

"Brown"

ent:employee3

foaf:givenName

"Bill"

ent:employee3

foaf:familyName

"Jones"

SPARQL CONSTRUCTの動作に影響を与えるSEM_MATCH問合せオプションが2つあります。CONSTRUCT_UNIQUE=TおよびCONSTRUCT_STRICT=Tです。CONSTRUCT_UNIQUE=T問合せオプションを使用すると、CONSTRUCT問合せから一意のRDFトリプルのみが返されます。 CONSTRUCT_STRICT=T問合せオプションを使用すると、CONSTRUCT問合せから有効なRDFトリプルのみが返されます。有効なRDFトリプルは、主語の位置にURIまたは空白ノードがあり(1)、述語の位置にURIがあり(2)、目的語の位置にURI、空白ノードまたはRDFリテラルがあります(3)。問合せのパフォーマンスが向上するように、これらの問合せオプションはいずれもデフォルトではオフになっています。

例1-24 SPARQL CONSTRUCT

例1-24に、foafボキャブラリを使用して従業員名のRDFグラフを構築するSPARQL CONSTRUCT問合せを示します。

SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm
FROM TABLE(SEM_MATCH(
'PREFIX  ent: <http://www.example.org/enterprise/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
CONSTRUCT
{?e foaf:givenName  ?fname .
?e foaf:familyName ?lname
}
WHERE
{?e ent:fname ?fname .
?e ent:lname ?lname
}',
SEM_Models('enterprise'),
SEM_Rulebases('RDFS'),
null, null));

例1-25 解の修飾子を含むCONSTRUCT

SPARQLの解の修飾子をCONSTRUCT問合せで使用できます。例1-25に、ORDER BYとLIMITを使用して、最も給与が高い2人の従業員のグラフを構築する方法を示します。LIMIT 2句はCONSTRUCT問合せ全体ではなく問合せパターンに適用されることに注意してください。つまり、問合せパターンは2つの結果行を返しますが、CONSTRUCT問合せ全体は6個のRDFトリプル(?eにバインドされた従業員2人に3個ずつ)を返します。

SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm
FROM TABLE(SEM_MATCH(
'PREFIX  ent: <http://www.example.org/enterprise/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
CONSTRUCT
{ ?e ent:fname       ?fname .
?e ent:lname       ?lname .
?e ent:dateOfBirth ?dob }
WHERE
{ ?e ent:fname  ?fname .
?e ent:lname  ?lname .
?e ent:salary ?sal
}
ORDER BY DESC(?sal)
LIMIT 2',
SEM_Models('enterprise'),
SEM_Rulebases('RDFS'),
null, null));

例1-26 SPARQL 1.1機能とCONSTRUCT

SPARQL 1.1の機能は、CONSTRUCT問合せパターン内でサポートされます。例1-26に、CONSTRUCT問合せで使用されている副問合せとSELECT式を示します。

SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm
FROM TABLE(SEM_MATCH(
'PREFIX  ent: <http://www.example.org/enterprise/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
CONSTRUCT
{ ?e foaf:name  ?name }
WHERE
{ SELECT ?e (CONCAT(?fname," ",?lname) AS ?name)
WHERE { ?e ent:fname ?fname .
?e ent:lname ?lname }
}',
SEM_Models('enterprise'),
SEM_Rulebases('RDFS'),
null, null));

例1-27 名前付きグラフを含むSPARQL CONSTRUCT

名前付きグラフ・データをSPARQL CONSTRUCT問合せで返すことはできません。W3C SPARQL仕様に従って、RDFクワッドではなくRDFトリプルのみが返されるためです。ただし、FROM、FROM NAMEDおよびGRAPHキーワードは、WHERE句に定義された問合せパターンと一致する場合に使用できます。

例1-27は、名前付きグラフent:g1とent:g2のUNIONのent:nameトリプル、名前付きグラフent:g3のent:dateOfBirthトリプル、および名前付きグラフent:g4のent:ssnトリプルを含むRDFグラフを作成します。

SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm
FROM TABLE(SEM_MATCH(
'PREFIX  ent: <http://www.example.org/enterprise/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
CONSTRUCT
{ ?e ent:name ?name .
?e ent:dateOfBirth ?dob .
?e ent:ssn ?ssn
}
FROM ent:g1
FROM ent:g2
FROM NAMED ent:g3
FROM NAMED ent:g4
WHERE
{ ?e foaf:name ?name .
GRAPH ent:g3 { ?e ent:dateOfBirth ?dob }
GRAPH ent:g4 { ?e ent:ssn ?ssn }
}',
SEM_Models('enterprise'),
SEM_Rulebases('RDFS'),
null, null));

例1-28 SPARQL CONSTRUCTの標準形

SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm
FROM TABLE(SEM_MATCH(
'PREFIX  ent: <http://www.example.org/enterprise/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
CONSTRUCT
{?e foaf:givenName  ?fname .
?e foaf:familyName ?lname
}
WHERE
{?e ent:fname ?fname .
?e ent:lname ?lname
}',
SEM_Models('enterprise'),
SEM_Rulebases('RDFS'),
null, null));

例1-29 SPARQL CONSTRUCTの短縮形

CONSTRUCTテンプレートがWHERE句とまったく同じ場合、CONSTRUCTの短縮形を使用できます。このケースではキーワードCONSTRUCTのみが必要です。WHERE句のグラフ・パターンもCONSTRUCTテンプレートとして使用されます。例1-29に、例1-28の短縮形を示します。

SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm
FROM TABLE(SEM_MATCH(
'PREFIX  ent: <http://www.example.org/enterprise/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
CONSTRUCT
WHERE
{?e ent:fname ?fname .
?e ent:lname ?lname
}',
SEM_Models('enterprise'),
SEM_Rulebases('RDFS'),
null, null));

1.6.4.1 SPARQL CONSTRUCTの一般的なワークフロー

SPARQL CONSTRUCTの一般的なワークフローでは、CONSTRUCT問合せを実行して、既存のセマンティク・モデルのRDFトリプル・データを抽出または変換し(あるいは両方を行い)、そのデータを既存または新規セマンティク・モデルにロードします。データのロードは、単純なINSERT文を使用するかSEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャを実行して行います。

例1-30 SPARQL CONSTRUCTのワークフロー

例1-30は、既存のent:fnameおよびent:lnameトリプルからfoaf:nameトリプルを作成し、それらの新しいトリプルを元のモデルにバルク・ロードします。その後、元のモデルにfoaf:name値を問い合せることができます。

-- use create table as select to build a staging table
CREATE TABLE STAB(RDF$STC_sub, RDF$STC_pred, RDF$STC_obj) AS
SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm
FROM TABLE(SEM_MATCH(
'PREFIX  ent: <http://www.example.org/enterprise/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
CONSTRUCT
{ ?e foaf:name  ?name }
WHERE
{ SELECT ?e (CONCAT(?fname," ",?lname) AS ?name)
WHERE { ?e ent:fname ?fname .
?e ent:lname ?lname }
}',
SEM_Models('enterprise'),
null, null, null));

-- grant privileges on STAB
GRANT SELECT ON STAB TO MDSYS;

-- bulk load data back into the enterprise model
BEGIN
SEM_APIS.BULK_LOAD_FROM_STAGING_TABLE(
model_name=>'enterprise',
table_owner=>'rdfuser',
table_name=>'stab',
flags=>' parallel_create_index parallel=4 ');
END;
/

-- query for foaf:name data
SELECT e$rdfterm, name$rdfterm
FROM TABLE(SEM_MATCH(
'PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?e ?name
WHERE { ?e foaf:name ?name }',
SEM_Models('enterprise'),
null, null, null));

SPARQL CONSTRUCT問合せの詳細は、W3C SPARQL仕様、特にhttp://www.w3.org/TR/sparql11-query/#constructも参照してください。

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

SEM_MATCHでは、問合せパラメータに完全指定のSPARQL DESCRIBE問合せを使用できます。

SPARQL DESCRIBE問合せは、RDFデータセットの調査に役立ちます。データセットで使用される正確なRDFプロパティの情報を把握していなくても、指定された1つのリソースまたは一連のリソースについて簡単に情報を見つけることができます。DESCRIBE問合せはリソースrの説明を返します。この説明は、主語または目的語の位置にrを含む、問合せデータセットの一連のRDFトリプルです。

CONSTRUCT問合せと同じく、DESCRIBE問合せは結果バインディングのかわりにRDFグラフを返します。したがって、各DESCRIBE問合せはCONSTRUCT問合せと同じ列を返します(戻り列のリストは、「グラフ・パターン: SPARQL CONSTRUCT構文のサポート」を参照してください)。

SPARQL DESCRIBE問合せはSPARQL SELECT問合せと同じ構文を使用しますが、最上位のSELECT句をDESCRIBE句で置き換えます。DESCRIBE句の構成として、DESCRIBEキーワードの後に一連のURIまたは変数(あるいは両方)を空白で区切って指定するか、DESCRIBEキーワードの後に* (1つのアスタリスク)を指定します。

SPARQL DESCRIBE問合せに影響を与えるSEM_MATCH問合せオプションが2つあります。CONSTRUCT_UNIQUE=TおよびCONSTRUCT_STRICT=Tです。CONSTRUCT_UNIQUE=Tによって結果から重複したトリプルが消去され、CONSTRUCT_STRICT=Tによって結果から無効なトリプルが消去されます。これらのオプションは両方ともデフォルトではオフになっています。これらのオプションの詳細は、「グラフ・パターン: SPARQL CONSTRUCT構文のサポート」を参照してください。

SPARQL DESCRIBET問合せの詳細は、W3C SPARQL仕様、特にhttp://www.w3.org/TR/sparql11-query/#describeも参照してください。

例1-31 SPARQL DESCRIBEの短縮形

SPARQL DESCRIBEの短縮形は、一定の1つのURIを記述するために用意されています。短縮形ではDESCRIBE句のみが必要です。例1-31に、SPARQL DESCRIBE問合せの短縮形を示します。

SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm
FROM TABLE(SEM_MATCH(
'DESCRIBE <http://www.example.org/enterprise/emp_1>',
SEM_Models('enterprise'),
null, null, null));

例1-32 SPARQL DESCRIBEの標準形

SPARQL DESCRIBEの標準形では、DESCRIBE句とSPARQL問合せパターン(解の修飾子を含む場合もある)が指定されます。例1-32に、所属部門がニュー・ハンプシャーにあるすべての従業員を説明するSPARQL DESCRIBE問合せを示します。

SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm
FROM TABLE(SEM_MATCH(
'PREFIX  ent: <http://www.example.org/enterprise/>
DESCRIBE ?e
WHERE
{ ?e ent:department ?dept .
?dept ent:locatedIn "New Hampshire" }',
SEM_Models('enterprise'),
null, null, null));

例1-33 DESCRIBE *

例1-32に示す標準形のDESCRIBEでは、DESCRIBE句に指定された変数にバインドされるすべてのリソースが説明されます。例1-32では、問合せパターンから返され、?eにバインドされているすべての従業員が説明されます。DESCRIBE *が使用されると、問合せに含まれるすべての変数が説明されます。

例1-33は例1-32を変更したもので、従業員(?eにバインド)と部門(?deptにバインド)の両方を説明しています。

SELECT subj$rdfterm, pred$rdfterm, obj$rdfterm
FROM TABLE(SEM_MATCH(
'PREFIX  ent: <http://www.example.org/enterprise/>
DESCRIBE *
WHERE
{ ?e ent:department ?dept .
?dept ent:locatedIn "New Hampshire" }',
SEM_Models('enterprise'),
null, null, null));

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

中カッコのグラフ・パターンに加えて、SEM_MATCHでは、queryパラメータに完全指定のSPARQL SELECT問合せを使用できます。SPARQL SELECT構文オプションを使用すると、SEM_MATCHは問合せ構成要素のBASE、PREFIX、SELECT、SELECT DISTINCT、FROM、FROM NAMED、WHERE、ORDER BY、LIMITおよびOFFSETをサポートします。各SPARQL SELECT構文の問合せは、SELECT句とグラフ・パターンを含める必要があります。

SEM_MATCHを使用する場合の中カッコとSPARQL SELECT構文の主な違いは、SPARQL SELECT構文を使用する場合、SPARQL SELECT句に出現している変数のみがSEM_MATCHから戻されるところにあります。

SPARQL SELECT構文を使用する場合、SEM$ROWNUMという1つの追加列がSEM_MATCHから戻されます。このNUMBER列を使用して、結果の順序がSPARQL ORDER BY句で指定された順序と一致するようにSEM_MATCH問合せの結果を並べ替えることができます。

SPARQL ORDER BY句を使用すると、SEM_MATCH問合せの結果を並べ替えることができます。この句によって、指定された問合せの結果を並べ替えるために使用する一連のコンパレータを指定します。コンパレータは、変数、RDF語句、算術演算子(+、-、*、/)、ブール演算子と論理連結語(||、&&、!)、比較演算子(<、>、<=、>=、=、!=)およびFILTER式で使用可能な任意の関数で作成される式で構成されます。

SPARQL SELECT問合せを評価する場合は、次の順序で操作を実行します。

1. グラフ・パターン照合

2. グループ化(「グループ化と集計」を参照してください。)

3. 集計(「グループ化と集計」を参照してください。)

4. HAVING (「グループ化と集計」を参照してください。)

5. VALUES (「値の割当て」を参照してください。)

6. SELECT式

7. 並べ替え

8. 投影

9. 個別

10. オフセット

11. 制限

SPARQL BASE、PREFIX、SELECT、SELECT DISTINCT、FROM、FROM NAMED、WHERE、ORDER BY、LIMITおよびOFFSET構成要素については、W3C SPARQL仕様、特にhttp://www.w3.org/TR/sparql11-query/を参照してください。

例1-34 SPARQL PREFIX、SELECTおよびWHERE句

例1-34では、次のSPARQL構成要素を使用しています。

- SPARQL PREFIX句(http://www.example.org/family/およびhttp://xmlns.com/foaf/0.1/名前空間に対して略称を指定する場合)

- SPARQL SELECT句: 問合せから抽出する変数のセットを指定します。

- SPARQL WHERE句: 問合せグラフ・パターンを指定します。

SELECT y, name
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/family/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?y ?name
WHERE
{?x :grandParentOf ?y .
?x foaf:name ?name }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
null, null));

例1-34では、y、y$RDFVID、y$_PREFIX、y$_SUFFIX、y$RDFVTYP、y$RDFCLOB、y$RDFLTYP、y$RDFLANG、name、name$RDFVID、name$_PREFIX、name$_SUFFIX、name$RDFVTYP、name$RDFCLOB、name$RDFLTYP、name$RDFLANGおよびSEM$ROWNUMの各列を戻します。

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

SPARQL SELECT句では、(A)一連の変数または式あるいはその両方(「SELECT句の式」を参照)を指定するか、(B) アスタリスク(*)を使用して、指定されたトリプル・パターンで出現するすべての変数を射影します。例1-35では、SPARQL SELECT句を使用して、指定されたトリプル・パターンで出現するすべての変数を選択しています。

SELECT x, y, name
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/family/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT *
WHERE
{?x :grandParentOf ?y .
?x foaf:name ?name }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
null, null));

例1-36 SPARQL SELECT DISTINCT

DISTINCTキーワードをSELECTの後に使用すると重複結果行を除外できます。例1-36では、SELECT DISTINCTを使用して重複しない名前のみを選択しています。

SELECT name
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/family/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?name
WHERE
{?x :grandParentOf ?y .
?x foaf:name ?name }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
null, null));

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

SPARQL FROMおよびFROM NAMEDは、問合せに対してRDFデータセット指定する場合に使用します。FROM句はデフォルト・グラフを構成するグラフのセットを指定する場合に使用し、FROM NAMED句は名前付きグラフ・セットを構成するグラフ・セットを指定する場合に使用します。例1-37では、FROMおよびFROM NAMEDを使用して、<http://www.friends.com/friends>および<http://www.contacts.com/contacts>グラフの和集合から電子メール・アドレスと友人を選択し、<http://www.example.org/family/Smith>および<http://www.example.org/family/Jones>グラフから祖父母情報を選択しています。

SELECT x, y, z, email
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/family/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX friends: <http://www.friends.com/>
PREFIX contacts: <http://www.contacts.com/>
SELECT *
FROM friends:friends
FROM contacts:contacts
FROM NAMED :Smith
FROM NAMED :Jones
WHERE
{?x foaf:frendOf ?y .
?x :email ?email .
GRAPH ?g {
?x :grandParentOf ?z }
}',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
null, null));

例1-38 SPARQL ORDER BY

SPARQL ORDER BY句の場合:

- 単一の変数の順序付け条件には前後のカッコは不要ですが、より複雑な順序付け条件にはカッコが必要です。

- オプションのASC()またはDESC()順序修飾子を使用して、それぞれ昇順または降順となる目的の順序を指定できます。デフォルトの順序は昇順です。

- SEM_MATCHでSPARQL ORDER BYを使用する場合、取り囲んでいるSQLブロック全体を通じて目的の順序を維持するためには、格納側のSQL問合せをSEM$ROWNUMで並べ替える必要があります。

例1-38では、SPARQL ORDER BY句ですべてのカメラを選択し、タイプの降順かつ合計(price * (1 - discount) * (1 + tax))の昇順になるように順序を指定しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT *
WHERE
{?x :price ?p .
?x :discount ?d .
?x :tax ?t .
?x :cameraType ?cType .
}
ORDER BY DESC(?cType) ASC(?p * (1-?d) * (1+?t))',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null))
ORDER BY SEM$ROWNUM;

例1-39 SPARQL LIMIT

SPARQL LIMITおよびSPARQL OFFSETは、問合せの解の異なるサブセットを選択するために使用できます。例1-39ではSPARQL LIMITを使用して最も安価なカメラを5つ選択し、例1-40ではSPARQL LIMITおよびOFFSETを使用して5番目から10番目に安価なカメラを選択しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
}
ORDER BY ASC(?p)
LIMIT 5',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null))
ORDER BY SEM$ROWNUM;

例1-40 SPARQL OFFSET

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
}
ORDER BY ASC(?p)
LIMIT 5
OFFSET 5',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null))
ORDER BY SEM$ROWNUM;

例1-41 完全なURIを使用した問合せ

SPARQL BASEキーワードは、グローバル接頭辞を設定するために使用します。すべての相対IRIは、「Uniform Resource Identifier (URI): Generic Syntax」(RFC3986)(http://www.ietf.org/rfc/rfc3986.txt)の5.2項で説明されている基本的なアルゴリズムを使用して、ベースIRIで解決されます。例1-41は完全なURIを使用する簡単な問合せで、例1-42はベースIRIを使用する同等の問合せです。

SELECT *
FROM TABLE(SEM_MATCH(
'SELECT ?employee ?position
WHERE
{?x <http://www.example.org/employee> ?p .
?p <http://www.example.org/employee/name> ?employee .
?p <http://www.example.org/employee/position> ?pos .
?pos <http://www.example.org/positions/name> ?position
}',
SEM_Models('enterprise'),
null,
null, null))
ORDER BY 1,2;

例1-42 ベースIRIを使用した問合せ

SELECT *
FROM TABLE(SEM_MATCH(
'BASE <http://www.example.org/>
SELECT ?employee ?position
WHERE
{?x <employee> ?p .
?p <employee/name> ?employee .
?p <employee/position> ?pos .
?pos <positions/name> ?position
}',
SEM_Models('enterprise'),
null,
null, null))
ORDER BY 1,2;

1.6.7 グラフ・パターン: SPARQL 1.1の構成要素のサポート

SEM_MATCHでは、次のSPARQL 1.1の構成要素がサポートされています。

- 関数の拡張セット(「グラフ・パターン: 中カッコの構文とOPTIONAL、FILTER、UNIONおよびGRAPHキーワードのサポート」の表1-12に示す全項目)

- SELECT句の式

- サブ問合せ

- グループ化と集計

- 否定

- 値の割当て

- プロパティ・パス

1.6.7.1 SELECT句の式

SELECT句では式を使用して、問合せから式の値を射影することができます。SELECT式は、変数、RDF語句、算術演算子(+、-、*、/)、ブール演算子と論理連結語(||、&&、!)、比較演算子(<、>、<=、>=、=、!=)およびFILTER式で使用可能な任意の関数で構成されます。式は、ASキーワードを使用して別名として単一の変数を指定する必要があり、<expression> AS <alias>フラグメント全体をカッコで囲む必要があります。この別名変数は、問合せで事前に定義することはできません。SELECT式は、前のSELECT式(つまり、SELECT句の前の方で指定された式)の結果を参照する場合があります。

例1-43 SPARQL SELECT式

例1-43では、SELECT式を使用してカメラごとの合計を射影しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ((?p * (1-?d) * (1+?t)) AS ?totalPrice)
WHERE
{?x :price ?p .
?x :discount ?d .
?x :tax ?t .
?x :cameraType ?cType .
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-44 SPARQL SELECT式(2)

例1-44では、2つのSELECT式を使用して、売上税がある場合とない場合の割引価格を射影しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ((?p * (1-?d)) AS ?preTaxPrice) ((?preTaxPrice * (1+?t)) AS ?finalPrice)
WHERE
{?x :price ?p .
?x :discount ?d .
?x :tax ?t .
?x :cameraType ?cType .
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

1.6.7.2 副問合せ

副問合せは、SPARQL SELECT構文で可能です。つまり、完全指定のSPARQL SELECT問合せが、他のSPARQL SELECT問合せ内に埋め込まれる場合があります。副問合せには、問合せのサブコンポーネントからの結果数を制限する場合など、多くの用途があります。

例1-45 SPARQL SELECT副問合せ

例1-45では、最も安価なカメラを製造するメーカーを検索し、このメーカーが製造した他のすべてのカメラを検索するために副問合せを使用しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?c1
WHERE {?c1 rdf:type :Camera .
?c1 :manufacturer ?m .
{
SELECT ?m
WHERE {?c2 rdf:Type :Camera .
?c2 :price ?p .
?c2 :manufacturer ?m .
}
ORDER BY ASC(?p)
LIMIT 1
}
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

副問合せが最初に論理的に評価され、その結果が外部問合せに射影されます。外部問合せから参照できるのは、副問合せのSELECT句で射影された変数のみです。

1.6.7.3 グループ化と集計

グループ化を実行するにはGROUP BYキーワードを使用します。構文上、GROUP BYキーワードはWHERE句の後、および解の修飾子(ORDER BYまたはLIMITなど)の前に使用する必要があります。

集計は、グループ内の結果全体の値を計算するために使用されます。集計は値のコレクションを操作して、結果として単一の値を生成します。SEM_MATCHは、組込みの集計としてCOUNT、SUM、MIN、MAX、AVG、GROUP_CONCATおよびSAMPLEをサポートしています。これらの集計を、表1-14で説明します。

表1-14 組込みの集計

集計

説明

AVG(expression)

グループ内の値に対するexpressionの平均値を返します。

COUNT(* | expression)

expressionがグループ内にバインドされた非エラー値を持つ回数がカウントされ、アスタリスク(*)ではグループ内の結果数がカウントされます。

GROUP_CONCAT(expression [; SEPARATOR = "STRING"])

グループ内の値に関して、expressionの文字列連結を実行します。オプションのセパレータ文字列を指定すると、各値の間にセパレータ文字が配置されます。

MAX(expression)

SPARQL ORDER BYによって定義される順序付けに基づいて、グループ内のexpressionの最大値を戻します。

MIN(expression)

SPARQL ORDER BYによって定義される順序付けに基づいて、グループ内のexpressionの最少値を戻します。

SAMPLE(expression)

グループから単一の任意の値と評価されるexpressionを戻します。

SUM(expression)

グループ内の値に関してexpressionの数値合計を計算します。

グループ化と集計の使用時には、変数参照に特定の制限が適用されます。グループ化変数(GROUP BY句の単一の変数)およびGROUP BY値割当てからの別名変数のみを、SELECT句またはHAVING句内の非集計式で使用できます。

例1-46 簡単なグループ化の問合せ

例1-46に、GROUP BYキーワードを使用してすべての種類のカメラを検索する問合せを示します。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?cType
WHERE
{?x rdf:type :Camera .
?x :cameraType ?cType .
}
GROUP BY ?cType',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

グループ化問合せは、グループ化式(例1-46の?cType)に基づいて問合せ結果をグループのコレクションに分割して、グループ内の各結果がグループ化式に関しては同じ値を持つようにします。グループ操作の最終結果には、各グループに1つの行が含まれます。

例1-47 複雑なグループ化式

グループ化式では、変数、式、または「<expression> as <alias>」の形式を持つ値割当てを1つ以上、ひと続きで指定します。例1-47は、グループ化式で各タイプのコンポーネントを1つずつ使用しているグループ化問合せを示しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?cType ?totalPrice
WHERE
{?x rdf:type :Camera .
?x :cameraType ?cType .
?x :manufacturer ?m .
?x :price ?p .
?x :tax ?t .
}
GROUP BY ?cType (STR(?m)) ((?p*(1+?t)) AS ?totalPrice)',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-48 集計

例1-48では、集計を使用して、各種類のカメラの最高、最低、平均価格を選択しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?cType
(MAX(?p) AS ?maxPrice)
(MIN(?p) AS ?minPrice)
(AVG(?p) AS ?avgPrice)
WHERE
{?x rdf:type :Camera .
?x :cameraType ?cType .
?x :manufacturer ?m .
?x :price ?p .
}
GROUP BY ?cType',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-49 グループ化なしの集計

集計をグループ化式なしで使用すると、結果セット全体が単一のグループとして処理されます。例1-49では、データセット全体のカメラの合計数を計算しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT (COUNT(?x) as ?cameraCnt)
WHERE
{ ?x rdf:type :Camera
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-50 DISTINCTを使用した集計

DISTINCTキーワードは、必要に応じて、集計ごとに修飾子として使用できます。DISTINCTを使用すると、集計を計算する前に各グループから重複値が除外されます。構文上、DISTINCTは集計の最初の引数として使用される必要があります。例1-50では、重複なしのカメラ・メーカー数を検索するためにDISTINCTを使用しています。この場合、STR(?m)の重複値は、カウント前に除外されます。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT (COUNT(DISTINCT STR(?m)) as ?mCnt)
WHERE
{ ?x rdf:type :Camera .
?x :manufacturer ?m
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-51 HAVING句

制約に基づいてグループをフィルタ処理するには、HAVINGキーワードを使用できます。HAVING式は、変数、RDF語句、算術演算子(+、-、*、/)、ブール演算子と論理連結語(||、&&、!)、比較演算子(<、>、<=、>=、=、!=)、集計、およびFILTER式で使用可能な任意のファンクションで構成できます。構文上、HAVINGキーワードはGROUP BY句の後、および他の解の修飾子(ORDER BYまたはLIMITなど)の前に使用します。

例1-51では、HAVING式を使用して、200ドル未満のカメラを販売するすべてのメーカーを検索しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?m
WHERE
{ ?x rdf:type :Camera .
?x :manufacturer ?m .
?x :price ?p
}
GROUP BY ?m
HAVING (MIN(?p) < 200)
ORDER BY ASC(?m)',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

1.6.7.4 否定

SEM_MATCHでは、SPARQL問合せパターンでNOT EXISTSおよびMINUSの2つの形式の否定がサポートされています。NOT EXISTSはグラフ・パターンが一致したかどうかに基づいて結果をフィルタ処理するために使用可能で、MINUSは別のグラフ・パターンとの関係に基づいて解を除外するために使用できます。

例1-52 NOT EXISTSによる否定

例1-52では、NOT EXISTS FILTERを使用して、ユーザー・レビューのないカメラを選択しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
FILTER( NOT EXISTS({?x :userReview ?r}) )
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-53 EXISTS

逆に、EXISTS演算子は、パターンの一致を確認する場合に使用できます。例1-53では、EXISTS FILTERを使用して、ユーザー・レビューを持つカメラのみを選択しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
FILTER( EXISTS({?x :userReview ?r}) )
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-54 MINUSによる否定

例1-54では、MINUSを使用して、例1-52と同じ結果を得ています。MINUSパターンの解と互換性がない解のみが、結果に含まれます。つまり、解がすべての共有変数にMINUSパターンの解と同じ値を持つ場合、それは結果から除外されます。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
MINUS {?x :userReview ?r}
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-55 NOT EXISTSによる否定(2)

NOT EXISTSとMINUSは2つの異なるスタイルの否定を表し、特定の状況では異なる結果を持ちます。例としては、否定パターンと残りの問合せの間で変数が共有されない場合が挙げられます。たとえば、例1-55のNOT EXISTS問合せでは{?subj ?prop ?obj}がどのトリプルにも一致するためすべての解が除外されますが、例1-56のMINUS問合せでは、共有変数がないため除外される解はありません。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
FILTER( NOT EXISTS({?subj ?prop ?obj}) )
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-56 MINUSによる否定(2)

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?p
WHERE
{?x :price ?p .
?x :cameraType ?cType .
MINUS {?subj ?prop ?obj}
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

1.6.7.5 値の割当て

SEM_MATCHには、値をSPARQL問合せの変数に割り当てる様々な方法が提供されています。

式の値を新しい変数に割り当てる方法には、(1)SELECT句の式、(2)GROUP BY句の式、および(3)BINDキーワードの3つがあります。どの場合も、新しい変数を問合せで事前に定義しておく必要はありません。割当て後は、この新しい変数を問合せで使用して、結果に戻すことが可能です。「SELECT句の式」で説明したように、値割当ての構文は(<expression> AS <alias>)となり、aliasは新しい変数を示し、たとえば((?price * (1+?tax)) AS ?totalPrice)とします。

例1-57 ネストしたSELECT式

例1-57では、ネストしたSELECT式を使用して、カメラの合計価格を計算し、その値を変数(?totalPrice)に割り当てています。その後、この変数を外部問合せのFILTERで使用して、200ドル未満のカメラを検索します。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?totalPrice
WHERE
{?x :cameraType ?cType .
{ SELECT ?x ( ((?price*(1+?tax)) AS ?totalPrice )
WHERE { ?x :price ?price .
?x :tax ?tax }
}
FILTER (?totalPrice < 200)
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-58 BIND

BINDキーワードは、基本グラフ・パターン内で値を割り当てるために使用可能で、構文上は同等のネストしたSELECT式より簡潔です。例1-58では、BINDキーワードを使用して、例1-57と論理的に同等な問合せを表しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?totalPrice
WHERE
{?x :cameraType ?cType .
?x :price ?price .
?x :tax ?tax .
BIND ( ((?price*(1+?tax)) AS ?totalPrice )
FILTER (?totalPrice < 200)
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-59 GROUP BY式

GROUP BY句の値割当ては、その後SELECT句、HAVING句および外部問合せ(ネストしたグループ化問合せの場合)で使用することができます。例1-59では、GROUP BY式を使用して、1000ドル未満の各価格のカメラの最大メガピクセル数を検索しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?totalPrice (MAX(?mp) as ?maxMP)
WHERE
{?x rdf:type :Camera .
?x :price ?price .
?x :tax ?tax .
GROUP BY ( ((?price*(1+?tax)) AS ?totalPrice )
HAVING (?totalPrice < 1000)
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-60 VALUES

新しい変数に式の値を割り当てる方法には、前述の3つの方法の他にVALUESキーワードを使用する方法があり、順序付けられていない解の順序を取得して、結合操作によって問合せ結果と組み合せることができます。VALUESブロックは、問合せパターン内、またはSPARQL SELECT問合せブロックの末尾の解の修飾子の後に使用できます。VALUES構成要素は、副問合せで使用できます。

例1-60では、VALUESキーワードを使用して、問合せ結果を:Company1製造のDSLRカメラ、または:Company2製造の任意の種類のカメラに制限しています。キーワードUNDEFは、解の順序内でバインドされていない変数を表すために使用されます。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?m
WHERE
{ ?x rdf:type :Camera .
?x :cameraType ?cType .
?x :manufacturer ?m
}
VALUES (?cType ?m)
{ ("DSLR" :Company1)
(UNDEF  :Company2)
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-61 簡略化されたVALUES構文

変数が1つの一般的な例では、簡略化された構文を使用できます。特に、変数および各解の前後のカッコは省略できます。例1-61は、簡略化された構文を使用して、問合せ結果を:Company1または:Company2によって製造されたカメラに制限しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?m
WHERE
{ ?x rdf:type :Camera .
?x :cameraType ?cType .
?x :manufacturer ?m
}
VALUES ?m
{ :Company1
:Company2
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

例1-62 インラインVALUESブロック

例1-62でも、問合せ結果を:Company1または:Company2製造のカメラに制限していますが、問合せパターン内でVALUESブロックを指定しています。

SELECT *
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?x ?cType ?m
WHERE
{ VALUES ?m { :Company1 :Company2 }
?x rdf:type :Camera .
?x :cameraType ?cType .
?x :manufacturer ?m
}',
SEM_Models('electronics'),
SEM_Rulebases('RDFS'),
null, null));

1.6.7.6 プロパティ・パス

SPARQLプロパティ・パスは、RDFグラフ内の2つのRDFリソース(ノード)の間の可能なパスを示しています。プロパティ・パスはトリプル・パターンの述語位置に出現するもので、トリプル・パターンの主語からトリプル・パターンの目的語までのパスを形成するプロパティ(エッジ)に制約を適用するために、正規表現のような構文を使用します。プロパティ・パスによって、SPARQL問合せはRDFグラフの任意の長さのパスを照合し、他のグラフ・パターンを表現する簡潔な方法を提供できます。

表1-15に、SPARQLプロパティ・パスの構築に使用可能な構文構成要素を示します。iriはIRIまたは接頭辞の付いた名前で、eltはプロパティ・パス要素で、それ自体が他のプロパティ・パス要素で構成される場合があります。

表1-15 プロパティ・パスの構文の構成要素

構文の構成要素

一致

iri

IRIまたは接頭辞の付いた名前。長さが1のパス。

^elt

逆のパス(目的語から主語へ)。

!iriまたは!(iri1 | … | irin)

否定プロパティ・セット。 iriiのいずれかではないIRI。

!^iriまたは!(iri1 | … | irij | ^irij+1 | … | ^irin)

逆のプロパティを持つ否定プロパティ・セット。iriiまたはirij+1...irinのいずれでもない逆パスのIRI。!^iriは!(^iri)の短縮形。プロパティと逆のプロパティの順番は、どちらが先でも問題ありません。順不同で実行されます。

(elt)

グループ・パスelt(カッコは優先順位を制御します)。

elt_1 / elt_2

elt_1、elt_2の順の順序パス。

elt_1 | elt_2

elt_1またはelt_2の代替パス(すべての可能性が試行されます)。

elt*

0個以上のeltのパス。

elt+

1個以上のeltのパス。

elt?

0個または1個のeltのパス。

構文構成要素の優先順位を、高いものから順に示します。

- IRI、接頭辞の付いた名前

- 否定プロパティ・セット

- グループ

- 単項演算子 *、?、+

- 単項^逆リンク

- 二項演算子 /

- 二項演算子 |

グループ内の優先順位は左から右に評価されます。

プロパティ演算子+および*の特別な考慮事項

通常、+ (プラス記号)と* (アスタリスク)演算子を使用した、完全に無制限のグラフ・トラバースはコストが非常に高くなります。この理由から、デフォルトでは深度制限のある+演算子と*演算子が使用されます。デフォルトの深度制限は10です。また、深度制限の実装は並列で実行できます。ALL_MAX_PP_DEPTH(n) SEM_MATCH問合せオプションまたはPP_MAX_DEPTH(n)インラインHINT0問合せオプティマイザ・ヒントを使用して、深度制限設定を変更できます。完全に無制限のトラバースを実現するには、深度制限を1未満に設定して、CONNECT BYベースの実装に戻ります。

プロパティ・パスの問合せヒント

プロパティ・パス問合せのパフォーマンスに影響するその他の問合せヒントも使用できます。ALLOW_PP_DUP=T問合せオプションを*問合せや+問合せと使用すると、結果の重複を認めることができます。結果の重複が認められると、問合せから最初の行が早く戻されます。また、ALL_USE_PP_HASHおよびALL_USE_PP_NL問合せオプションは、プロパティ・パス表現を評価するときに使用される結合タイプに影響します。同様のUSE_PP_HASHおよびUSE_PP_NLインラインHINT0問合せオプティマイザ・ヒントも使用できます。

例1-63 SPARQLプロパティ・パス(rdfs:subClassOf関係を使用)

例1-63では、プロパティ・パスを使用して、rdfs:subClassOf関係の推移性に基づいてすべての男性を検索しています。プロパティ・パスでは、任意の数の連続的なrdfs:subClassOf関係の一致が可能です。

SELECT x, name
FROM TABLE(SEM_MATCH(
'{ ?x foaf:name ?name .
?x rdf:type ?t .
?t rdfs:subClassOf* :Male }',
SEM_Models('family'),
null,
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')
SEM_ALIAS('foaf',' http://xmlns.com/foaf/0.1/')),
null));

例1-64 SPARQLプロパティ・パス(foaf:friendOfまたはfoaf:knows関係を使用)

例1-64では、プロパティ・パスを使用して、Scottの親しい友人(foaf:friendOfまたはfoaf:knows関係を使用して2ホップ以内に到達可能な人々)をすべて検索しています。

SELECT name
FROM TABLE(SEM_MATCH(
'{ { :Scott (foaf:friendOf | foaf:knows) ?f }
UNION
{ :Scott (foaf:friendOf | foaf:knows)/(foaf:friendOf | foaf:knows) ?f }
?f foaf:name ?name .
FILTER (!sameTerm(?f, :Scott)) }',
SEM_Models('family'),
null,
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/'),
SEM_ALIAS('foaf',' http://xmlns.com/foaf/0.1/')),
null));

例1-65 プロパティ・パスの最大深度値の指定

例1-65では、ALL_MAX_PP_DEPTH(n)問合せオプション値を使用してすべてのプロパティ・パス表現に最大深度12を指定します。

SELECT x, name
FROM TABLE(SEM_MATCH(
'{ ?x foaf:name ?name .
?x rdf:type ?t .
?t rdfs:subClassOf* :Male }',
SEM_Models('family'),
null,
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')
SEM_ALIAS('foaf',' http://xmlns.com/foaf/0.1/')),
null,
null,
' ALL_MAX_PP_DEPTH(12) '));

例1-66 プロパティ・パス結合ヒントの指定

例1-66に、プロパティ・パス表現の評価にネステッド・ループ結合をリクエストするインラインHINT0問合せオプティマイザ・ヒントを示します。

SELECT x, name
FROM TABLE(SEM_MATCH(
'{ # HINT0={ USE_PP_NL }
?x foaf:name ?name .
?x rdf:type ?t .
?t rdfs:subClassOf* :Male }',
SEM_Models('family'),
null,
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')
SEM_ALIAS('foaf',' http://xmlns.com/foaf/0.1/')),
null));

1.6.8 グラフ・パターン: SPARQL 1.1のフェデレーテッド問合せのサポート

SEM_MATCHは、SPARQL 1.1のフェデレーテッド問合せをサポートしています(http://www.w3.org/TR/sparql11-federated-query/#SPROTを参照)。SERVICE構成要素を使用して、指定したSPARQLエンドポイントURLから結果を取得できます。この機能により、ローカルのRDFデータ(ネイティブRDFデータまたはリレーショナル・データのRDFビュー)を、W3C標準準拠のSPARQLエンドポイントによって提供される他のRDFデータ(おそらくリモート)と組み合せることができます。

この項には次のトピックも含まれます。

- フェデレーテッドSPARQL問合せの実行に必要な権限

- SPARQL SERVICEの結合プッシュ・ダウン

- SPARQL SERVICE SILENT

- SPARQL SERVICEでのプロキシ・サーバーの使用

- HTTP基本認証でのSPARQLエンドポイントへのアクセス

例1-67 すべてのトリプルを取得するSPARQL SERVICE句

例1-67は、SERVICE句を使用して、http://www.example1.org/sparqlにあるSPARQLエンドポイントからすべてのトリプルを取得する問合せです。

SELECT s, p, o
FROM TABLE(SEM_MATCH(
'SELECT ?s ?p ?o
WHERE {
SERVICE <http://www.example1.org/sparql>{ ?s ?p ?o }
}',
SEM_Models('electronics'),
null, null, null, null, ' '));

例1-68 リモートとローカルのRDFデータを結合するSPARQL SERVICE句

例1-68は、リモートRDFデータとローカルRDFデータを結合します。この例は、ローカル・モデルelectronicsのカメラのタイプ?cTypeを、http://www.example1.org/sparqlのSPARQLエンドポイントのカメラの名前?nameに結合します。

SELECT cType, name
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?cType ?name
WHERE {
?s :cameraType ?cType
SERVICE <http://www.example1.org/sparql>{ ?s :name ?name }
}',
SEM_Models('electronics'),
null, null, null, null, ' '));

1.6.8.1 フェデレーテッドSPARQL問合せの実行に必要な権限

SEM_MATCH問合せでSERVICE構成要素を使用するには、特定のデータベース権限が必要です。DBA権限を持つユーザーによって、SPARQL_SERVICE MDSYSファンクションのEXECUTE権限が付与される必要があります。次の例では、このアクセス権がRDFUSERという名前のユーザーに付与されます。

grant execute on mdsys.sparql_service to rdfuser;

また、アクセス制御リスト(ACL)を使用して、フェデレーテッド問合せを試行するユーザーにCONNECT権限を付与する必要があります。例1-69は、新しいACLを作成して、ユーザーRDFUSERにCONNECT権限を付与し、ドメイン*をACLに割り当てます。ACLの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

例1-69 アクセス制御リストとホスト割当て

dbms_network_acl_admin.create_acl (
acl       => 'rdfuser.xml',
description => 'Allow rdfuser to query SPARQL endpoints',
principal => 'RDFUSER',
is_grant  => true,
privilege => 'connect'
);

dbms_network_acl_admin.assign_acl (
acl  => 'rdfuser.xml',
host => '*'
);

必要な権限が付与されると、SEM_MATCHからフェデレーテッド問合せを実行する準備が整います。

1.6.8.2 SPARQL SERVICEの結合プッシュ・ダウン

SPARQL SERVICEの結合プッシュ・ダウン(SERVICE_JPDWN=T)機能を使用すると、特定のSPARQL SERVICE問合せのパフォーマンスを改善できます。デフォルトでは、SERVICE句の問合せパターンがリモートSPARQLエンドポイントで最初に実行されます。このリモート実行のすべての結果が、問合せのローカルの部分に結合されます。この方法では、問合せのローカル部分の選択性が非常に高く、問合せのリモート部分の選択性が非常に低いと、パフォーマンスが低下することがあります。

SPARQL SERVICEの結合プッシュ・ダウン機能は、SERVICE句を複数含む問合せでは使用できません。

例1-70 SPARQL SERVICEの結合プッシュ・ダウン

例1-70に、SPARQL SERVICEの結合プッシュ・ダウン機能を示します。

SELECT s, prop, obj
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?s ?prop ?obj
WHERE {
?s rdf:type   :Camera .
?s :modelName "Camera 12345"
SERVICE <http://www.example1.org/sparql> { ?s ?prop ?obj }
}',
SEM_Models('electronics'),
null, null, null, null, ' SERVICE_JPDWN=T '));

例1-70では、問合せのローカル部分ではごく少数の行が返されますが、問合せのリモート部分は完全に無制限であるためリモート・データセット全体が返されます。SERVICE_JPDWN=Tオプションが指定されると、SEM_MATCHはネステッド・ループ方式の評価を実行します。まず、問合せのローカル部分を実行してから、ローカル部分によって返された行ごとに、変更したリモート問合せを1回ずつ実行します。結合変数?sにかわって効率よく実行するFILTER句を使用してリモート問合せを変更します。たとえば、<urn:camera1>と<urn:camera2>が?sのバインディングとして例1-70のローカル部分から返されると、2つの問合せ、{ ?s ?prop ?obj FILTER (?s = <urn:camera1>) }と{ s ?prop ?obj FILTER (?s = <urn:camera2>) }がリモート・エンドポイントに送られます。

1.6.8.3 SPARQL SERVICE SILENT

SILENTキーワードがフェデレーテッド問合せで使用されるとき、指定されたリモートSPARQLエンドポイントにアクセスする際のエラーが無視されます。SERVICE SILENTリクエストが失敗すると、バインディングなしの1つの解が返されます。

例1-71は、OPTIONAL句内でSILENTキーワードと一緒にSERVICEを使用しています。このため、http://www.example1.org/sparqlにアクセスする際に接続エラーが発生しても、そのようなエラーは無視され、トリプル?s :cameratype ?kから取得されたすべての行が?nのnull値と結合されます。

例1-71 SILENTキーワードを含むSPARQL SERVICE

SELECT s, n
FROM TABLE(SEM_MATCH(
'PREFIX : <http://www.example.org/electronics/>
SELECT ?s ?n
WHERE {
?s :cameraType ?k
OPTIONAL { SERVICE SILENT <http://www.example1.org/sparql>{ ?k :name ?n } }
}',
SEM_Models('electronics'),
null, null, null, null));

1.6.8.4 SPARQL SERVICEでのプロキシ・サーバーの使用

次の方法を使用して、SPARQL SERVICEリクエストをHTTPプロキシで送信できます。

- 現在のセッションでリクエストに使用する必要があるHTTPプロキシを指定します。これは、UTL_HTTPパッケージのSET_PROXY関数を使用して行うことができます。例1-72は、HTTPリクエストで使用するプロキシproxy.example.comを設定し、ドメインexample2.comのホストに対するリクエストを除外します。(SET_PROXYプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。)

- SPARQL SERVICEリクエストのプロキシ・アドレスを設定できるようにするSERVICE_PROXY SEM_MATCHオプションを使用します。ただし、このケースでは例外を指定できません。すべてのリクエストは指定したプロキシ・サーバーに送信されます。例1-73に、ポート80のプロキシ・アドレスproxy.example.comが指定されたSEM_MATCH問合せを示します。

例1-72 UTL_HTTP.SET_PROXYでのプロキシ・サーバーの設定

BEGIN
UTL_HTTP.SET_PROXY('proxy.example.com:80', 'example2.com');
END;
/

例1-73 SPARQL SERVICEでのプロキシ・サーバーの設定

SELECT *
FROM TABLE(SEM_MATCH(
'SELECT *
WHERE {
SERVICE <http://www.example1.org/sparql>{ ?s ?p ?o }
}',
SEM_Models('electronics'),
null, null, null, null, ' SERVICE_PROXY=proxy.example.com:80 '));

1.6.8.5 HTTP基本認証でのSPARQLエンドポイントへのアクセス

HTTP基本認証でSPARQLエンドポイントへのアクセスを許可するには、ユーザー資格証明をセッション・コンテキストSDO_SEM_HTTP_CTXに保存する必要があります。DBA権限を持つユーザーが、基本認証の使用を希望するユーザーにこのコンテキストのEXECUTEを付与する必要があります。次の例では、このアクセス権をRDFUSERというユーザーに付与しています。

grant execute on mdsys.sdo_sem_http_ctx to rdfuser;

権限が付与されると、ユーザーは各SPARQLエンドポイントのユーザー名とパスワードをHTTP認証に保存する必要があります。これには、関数mdsys.sdo_sem_http_ctx.set_usrおよびmdsys.sdo_sem_http_ctx.set_pwdを使用します。次の例では、SPARQLエンドポイント(http://www.example1.org/sparql)のユーザー名とパスワードが設定されます。

BEGIN
mdsys.sdo_sem_http_ctx.set_usr('http://www.example1.org/sparql','user');
mdsys.sdo_sem_http_ctx.set_pwd('http://www.example1.org/sparql','pwrd');
END;
/

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

SEM_MATCHでは、HINT0インライン問合せオプティマイザ・ヒントを許可するために、SPARQLコメント構成要素がオーバーロードされています。SPARQLのハッシュ(#)文字は、行のそれ以降の部分がコメントであることを示します。インライン・ヒントを特定のBGPと関連付けるには、HINT0ヒント文字列をSPARQLコメント内に配置し、開始中カッコ({)とBGPの最初のトリプル・パターンの間にコメントを挿入します。インライン・ヒントを使用すると、問合せ内の各BGPの実行計画に影響を与えることができます。例1-74に、インライン問合せオプティマイザ・ヒントを含む問合せを示します。

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

SELECT x, y, hp, cp
FROM TABLE(SEM_MATCH(
'{ # HINT0={ LEADING(t0) USE_NL(?x ?y ?bd) }
?x :grandParentOf ?y . ?x rdf:type :Male . ?x :birthDate ?bd
OPTIONAL { # HINT0={ LEADING(t0 t1) BGP_JOIN(USE_HASH) }
?x :homepage ?hp . ?x :cellPhoneNum ?cp }
}',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null));

BGP_JOINヒントはBGP結合間に影響を与えるもので、BGP_JOIN(<join_type>)という構文を使用します(<join_type>はUSE_HASHまたはUSE_NLです)。例1-74では、BGP_JOIN(USE_HASH)ヒントを使用して、OPTIONAL BGPをその親BGPと結合する場合にハッシュ結合を使用する必要があることを指定しています。

インライン・オプティマイザ・ヒントは、options引数を使用してSEM_MATCHに渡されるすべてのヒントをオーバーライドします。たとえば、インライン・オプティマイザ・ヒントを指定していない各BGPには、グローバルALL_ORDEREDヒントが適用されますが、インライン・ヒントを持つBGPには、ALL_ORDEREDヒントではなくインライン・ヒントが使用されます。

1.6.10 全文検索

Oracle固有のorardf:textContains SPARQL FILTER関数は、MDSYS.RDF_VALUE$表で全文索引を使用します。この関数は次の構文を使用します(orardfは<http://xmlns.oracle.com/rdf/>に展開される組込みの接頭辞です)。

orardf:textContains(variable, pattern)

orardf:textContainsへの最初の引数はローカル変数(つまり、orardf:textContainsフィルタを含むBGPに存在する変数)である必要があり、2つ目の引数は一定のプレーン・リテラルである必要があります。

たとえば、orardf:textContains(x, y)は、xが式yと一致する場合にtrueを戻します(yはOracle Text SQL演算子CONTAINSの有効な式です)。そのような式の詳細は、『Oracle Textリファレンス』を参照してください。

orardf:textContainsを使用する前に、RDFネットワークのOracle Text索引を作成する必要があります。そのような索引を作成するには、SEM_APIS.ADD_DATATYPE_INDEXプロシージャを次のように起動します。

EXECUTE SEM_APIS.ADD_DATATYPE_INDEX('http://xmlns.oracle.com/rdf/text');

orardf:textContains(?x, "%abc%")のようなワイルドカード検索のパフォーマンスは、プリフィックス索引と部分文字列索引を使用することで向上します。次の任意のオプションをSEM_APIS.ADD_DATATYPE_INDEXプロシージャに含めることができます。

- prefix_index=true - プリフィックス索引の追加

- prefix_min_length=<number> – プリフィックス索引トークンの最小長さ

- prefix_max_length=<number> – プリフィックス索引トークンの最大長さ

- substring_index=true - 部分文字列索引の追加

Oracle Textの索引付け要素の詳細は、『Oracle Textリファレンス』を参照してください。

テキスト索引のあるセマンティク・ネットワークに対して大規模バルク・ロードを実行する場合、テキスト索引を削除してバルク・ロードを実行してからテキスト索引を再作成すると、ロード時間全体が短縮される可能性があります。データ型索引の詳細は、「データ型索引の使用」を参照してください。

テキスト索引を作成すると、SEM_MATCH問合せでorardf:textContains FILTER関数を使用できます。例1-75では、orardf:textContainsを使用して、名前が文字AまたはBで始まるすべての祖父を検索しています。

例1-75 全文検索

SELECT x, y, hp, cp
FROM TABLE(SEM_MATCH(
'{ ?x :grandParentOf ?y . ?x rdf:type :Male . ?x :name ?n
FILTER (orardf:textContains(?n, " A% | B% ")) }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null));

1.6.11 空間のサポート

RDFセマンティク・グラフは、OGC GeoSPARQL標準を介して、およびOracle固有のSPARQL拡張機能を介して空間ジオメトリ・データの記憶域および問合せをサポートしています。ジオメトリ・データはorageo:WKTLiteralまたはogc:wktLiteral型付きリテラルとして格納可能で、空間操作用のいくつかの問合せ関数を使用してジオメトリ・データを問い合せることができます。パフォーマンス向上のための空間索引付けも、サポートされます。

orageoは<http://xmlns.oracle.com/rdf/geo/>に展開される組込み接頭辞、ogcは<http://www.opengis.net/ont/geosparql#>に展開される組込み接頭辞、ogcfは<http://www.opengis.net/def/function/geosparql>に展開される組込み接頭辞です。

この項の内容は次のとおりです。

- OGC GeoSPARQLのサポート

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

- 空間データの索引付け

- 空間データの問合せ

1.6.11.1 OGC GeoSPARQLのサポート

RDFセマンティク・グラフは、Well-Known Text (WKT)シリアライズとシンプル・フィーチャのリレーション・ファミリを使用して、OGC GeoSPARQL標準(http://www.opengeospatial.org/standards/geosparql)に準拠する次のクラスをサポートします。

- コア

- トポロジ・ボキャブラリ拡張(シンプル・フィーチャ)

- ジオメトリ拡張(WKT、1.2.0)

- ジオメトリ・トポロジ拡張(シンプル・フィーチャ、WKT、1.2.0)

- RDFS伴意拡張(シンプル・フィーチャ、WKT、1.2.0)

GeoSPARQLを使用した空間データの表現および問合せの詳細は、以降の項で説明します。

1.6.11.2 RDFでの空間データの表現

空間ジオメトリは、RDFでorageo:WKTLiteralまたはogc:wktLiteral型付きリテラルとして表現できます。

例1-76 orageo:WKTLiteralとして表現される空間点ジオメトリ

例1-76は単純な点ジオメトリのorageo:WKTLiteralエンコーディングを示し、例1-77は同じ点のGeoSPARQLエンコーディングを示しています。

"Point(-83.4 34.3)"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral>

例1-77 ogc:wktLiteralとして表現される空間点ジオメトリ

"Point(-83.4 34.3)"^^<http://www.opengis.net/ont/geosparql#wktLiteral>

例1-78 orageo:WKTLiteral値を使用してエンコードされる空間データ

orageo:WKTLiteralとogc:wktLiteralエンコーディングはどちらも、オプションの空間参照システムURIと、それに続くWell-Known Text(WKT)文字列(ジオメトリ値をエンコードする)で構成されます。空間参照システムURIとWKT文字列は、空白文字で分離する必要があります。(このドキュメントでは、ジオメトリ・リテラルという用語で、orageo:WKTLiteralとogc:wktLiteral型付きリテラルの両方を指しています。)

サポートされる空間参照システムURIは、<http://xmlns.oracle.com/rdf/geo/srid/{srid}>という形式を取ります({srid}は、Oracle Spatial and Graphからの有効な空間参照システムIDです)。ジオメトリ・リテラル値に空間参照システムURIが含まれない場合、デフォルトの空間参照システムのWGS84経度-緯度(URI <http://xmlns.oracle.com/rdf/geo/srid/8307>)が使用されます。問合せ文字列内にジオメトリ・リテラル値が見つかると、同じデフォルトの空間参照システムが使用されます。

いくつかのジオメトリ・タイプは、点、線ストリング、ポリゴン、多面体面、三角形、TIN、複数点、複数の線ストリング、複数のポリゴンおよびジオメトリ・コレクションを含む、ジオメトリ・リテラル値として表現できます。2次元ジオメトリでは、1ジオメトリ当たり最大500,000の頂点がサポートされます。

例1-78は、orageo:WKTLiteral値を使用してエンコードされるいくつかのRDF空間データ(N-triple形式)を示しています。この例では、最初の2つのジオメトリ(lot1内)はデフォルトの座標系(SRID 8307)を使用し、その他の2つのジオメトリ(lot2内)はSRID 8265を指定しています。

# spatial data for lot1 using the default WGS84 Longitude-Latitude spatial reference system
<urn:lot1> <urn:hasExactGeometry> "Polygon((-83.6 34.1, -83.6 34.5, -83.2 34.5, -83.2 34.1, -83.6 34.1))"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral> .
<urn:lot1> <urn:hasPointGeometry> "Point(-83.4 34.3)"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral> .
# spatial data for lot2 using the NAD83 Longitude-Latitude spatial reference system
<urn:lot2> <urn:hasExactGeometry> "<http://xmlns.oracle.com/rdf/geo/srid/8265> Polygon((-83.6  34.1, -83.6 34.3, -83.4 34.3, -83.4 34.1, -83.6 34.1))"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral> .
<urn:lot2> <urn:hasPointGeometry> "<http://xmlns.oracle.com/rdf/geo/srid/8265> Point(-83.5 34.2)"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral> .

詳細は、『Oracle Spatial and Graph開発者ガイド』の座標系(空間参照システム)に関する章を参照してください。Open Geospatial Consortium (OGC)のシンプル・フィーチャのドキュメント(http://www.opengeospatial.org/standards/sfa)で、WKTジオメトリ表現に関する資料も参照してください。

1.6.11.3 空間データの索引付け

任意のSPARQL拡張関数(「空間データの問合せ」を参照)を使用して空間データを問い合せる前に、SEM_APIS.ADD_DATATYPE_INDEXプロシージャをコールしてRDFネットワークに空間索引を作成する必要があります。

空間索引を作成する場合、次の情報を指定する必要があります。

- SRID: 空間索引を作成する空間参照システムのID。Oracle Spatial and Graphからの任意の有効な空間参照システムIDを、SRID値として使用できます。

- TOLERANCE: 空間索引の許容値。許容値は、2つの点が同じ点とみなされるためにどの程度近接している必要があるかを示す正数です。この値の単位は、使用されるSRIDのデフォルト単位によって決定されます(たとえば、WGS84経度/緯度の場合はメートル)。許容差は、『Oracle Spatial and Graph開発者ガイド』で詳細に説明されています。

- DIMENSIONS: 空間索引のテキスト文字列エンコーディングの次元情報。各次元は、カンマ区切りの一連の3つの値(名前、最小値および最大値)で表現されます。各次元をカッコで囲み、それらの次元のセットを外側のカッコで囲みます。

例1-79 RDFデータ上の空間データ型索引の追加

例1-79では、RDFネットワーク上の空間データ型索引を追加し、この座標系を使用する空間データの索引付けに関する、WGS84経度-緯度空間参照システム、10メートルの許容差値、推奨次元を指定しています。TOLERANCE、SRIDおよびDIMENSIONSキーワードの大/小文字は区別され、<http://xmlns.oracle.com/rdf/geo/WKTLiteral>に対してデータ型索引を作成すると、<http://www.opengis.net/ont/geosparql#wktLiteral>ジオメトリ・リテラルにも索引付けされ、この逆も同様に行われます(つまり、<http://www.opengis.net/ont/geosparql#wktLiteral>に対してデータ型索引を作成すると<http://xmlns.oracle.com/rdf/geo/WKTLiteral>ジオメトリ・リテラルにも索引付けされます)。

EXECUTE sem_apis.add_datatype_index('http://xmlns.oracle.com/rdf/geo/WKTLiteral',  options=>'TOLERANCE=10 SRID=8307 DIMENSIONS=((LONGITUDE,-180,180) (LATITUDE,-90,90))');

RDFネットワークについては1つの空間データ型索引のみサポートされます。RDFネットワークに格納されるジオメトリ・リテラル値は、索引に使用される空間参照システムに自動的に正規化されるため、単一の空間索引では複数の空間参照システムからのジオメトリ・リテラル値を同時にサポートできます。この座標変換は、索引付けと空間の計算に対して透過的に行われます。ジオメトリ・リテラル値がSEM_MATCH問合せから戻されるときは、元の未変換のジオメトリが戻されます。

空間索引付けの詳細は、『Oracle Spatial and Graph開発者ガイド』で空間データの索引付けおよび問合せに関する章を参照してください。

1.6.11.4 空間データの問合せ

SEM_MATCHで空間問合せを実行するために、複数のSPARQL拡張関数を使用できます。たとえば、空間RDFデータでは、ジオメトリの領域と境界線(長さ)、2つのジオメトリ間の距離、およびジオメトリの重心と最小外接矩形を検出することや、ジオメトリ間の様々な位相関係を確認することができます。

「空間問合せのSEM_MATCHサポート」には、利用可能な関数のリファレンスおよび使用法に関する情報が記載されています。

- GeoSPARQLの関数

- Oracle固有の関数

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

この項では、SEM_MATCHテーブル・ファンクションを使用してセマンティク・データを問い合せる場合に推奨される方法について説明します。次のサブセクションが含まれます:

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

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

- リレーショナル式を含むFILTER構成要素

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

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

- OLTP索引圧縮によるシステムの圧縮

- 無制限のプロパティ・パス表現

- グループ化と集計

1.6.12.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)と想定されます。

FAST_DATE_FILTER=Tを使用すると、(1)データセットのすべてのカレンダ値がタイムゾーンを持つ場合も、(2)データセットのすべてのカレンダ値がタイムゾーンを持たない場合も、問合せの正確性には影響ありません。

1.6.12.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)の評価の速度が向上する場合があります。

これらの関数ベース索引の作成、変更および削除のために、便利なインタフェースが用意されています。詳細は、「データ型索引の使用」を参照してください。

ただし、MDSYS.RDF_VALUE$表にこれらの関数ベース索引が存在することで、バルク・ロード操作の速度は大幅に低下する可能性があります。多くの場合、索引付きのままバルク・ロードを実行する場合と比較すると、索引を削除し、バルク・ロードを実行してから索引を再作成する方が高速です。

1.6.12.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.12.4 オプティマイザ統計と動的サンプリング

問合せオプティマイザに十分な統計を確保することは、優れた問合せパフォーマンスのために非常に重要です。通常は、SEM_PERF.GATHER_STATSプロシージャを使用して、セマンティク・ネットワークの基本的な統計が収集されていることを確認する必要があります(「SEM_PERFパッケージのサブプログラム」を参照)。

RDFデータ・モデル本来の柔軟性のため、静的情報ではSEM_MATCH問合せの最適実行計画が生成されない場合があります。通常、動的サンプリングでは、非常によい問合せ実行プランを生成できます。動的サンプリング・レベルは、optimizer_dynamic_samplingパラメータを使用してセッションまたはシステム・レベルで設定することも、dynamic_sampling(level) SQL問合せヒントを使用して個別の問合せレベルで設定することもできます。通常は3から6の間の動的サンプリング・レベルで試すことをお薦めします。動的サンプリングの統計の見積りの詳細は、『Oracle Database SQLチューニング・ガイド』を参照してください。

例1-80では、動的サンプリング・レベルが6のSQLヒントを使用しています。

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

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

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

複数のセマンティク・モデル、セマンティク・モデルと伴意、および仮想モデルの使用には、次の推奨事項が適用されます。

- 複数のセマンティク・モデルに対して、またはセマンティク・モデルと伴意に対してSEM_MATCH問合せを実行する場合は、問い合せるすべてのモデルと伴意を含む仮想モデル(「仮想モデル」を参照)を作成して、この単一の仮想モデルを問い合せると、問合せパフォーマンスが向上する可能性があります。

- ALLOW_DUP=T問合せオプションを使用します。このオプションを使用しない場合は、RDFデータの設定済セマンティクを保持するために、問合せ処理中に高コストな(処理に関して)重複除去手順が必要になります。ただし、このオプションを使用した場合、重複除去手順は実行されず、パフォーマンスが大幅に向上します。

1.6.12.6 OLTP索引圧縮によるシステムの圧縮

OLTP索引圧縮がサポートされるシステム(Exadataなど)では、セマンティク・ネットワークによって使用される一部のBツリー索引の圧縮率を向上させる機能を利用できます。

たとえば、DBAは次のコマンドを使用して、MDSYS.RDF_VAL_NAMETYLITLNG_IDX索引での圧縮スキームを接頭辞圧縮からOLTP索引圧縮に変更できます。

SQL> alter index mdsys.RDF_VAL_NAMETYLITLNG_IDX rebuild compress for oltp high;

1.6.12.7 無制限のプロパティ・パス表現

+および*プロパティ・パス演算子では、可能な場合には常に深度制限検索を使用する必要があります。*および+の深度制限実装のパフォーマンスは、大規模なグラフや関連性が高いグラフにおいてはCONNECT BYベースの実装を大幅に上回ります。深度制限10がデフォルトで使用されます。どのグラフでもグラフの直径を超えた深度制限は役立ちません。深度制限の設定の詳細は、「プロパティ・パス」を参照してください。

クラス階層が非常に深いオントロジに対してrdfs:subClassOf+を使用する後方連鎖スタイルの推論は、このルールの例外になることがあります。このようなケースでは、無制限のCONNECT BYベース評価のパフォーマンスが、非常に大きな深度制限(たとえば50)の深度制限評価よりもよくなることがあります。

1.6.12.8 グループ化と集計

MIN、MAXおよびGROUP_CONCAT集計では、不均一なタイプ(たとえば、MAX(?x))の入力についてSPARQLセマンティクを完全にキャプチャするために特別なロジックが必要です。均一入力タイプをコンパイル時に判別できるケース(たとえば、MAX(STR(?x)) - プレーン・リテラル入力)では、組込みSQL集計の最適化を使用できます。通常は、このような最適化によってパフォーマンスが1桁向上します。次のケースは最適化されます。

- MIN/MAX(<plain literal>)

- MIN/MAX(<numeric>)

- MIN/MAX(<dateTime>)

- GROUP_CONCAT(<plain literal>)

図1-81はMIN/MAX(<numeric>)最適化を使用しています。

例1-81 集計の最適化

SELECT dept, minSal, maxSal
FROM TABLE(SEM_MATCH(
'SELECT ?dept (MIN(xsd:decimal(?sal)) AS ?minSal) (MAX(xsd:decimal(?sal)) AS ?maxSal)
WHERE
{?x :salary ?y .
?x :department ?dept }
GROUP BY ?dept',
SEM_Models('hr_data'),
null, null, null, null, '' ));

1.6.13 SEM_MATCH使用時の特別な考慮事項

次の考慮事項は、SEM_MATCHを使用してRDFセマンティク・グラフで実行されるSPARQL問合せに適用されます。

- 値の割当て

- 値割り当てのソースで未定義の変数が参照されると、コンパイル時にエラーが発生します。

- グループ化と集計

- 非グループ化変数(グループ化に使用されないため、射影には妥当でない問合せ変数)は、値割り当てのターゲットとして再利用できません。

- 数値以外の値は、AVGおよびSUM集計によって無視されます。

- デフォルトでは、SEM_MATCHは、グラフ・パターンが一致しない集計問合せの場合に行を返しません。W3C仕様では、このケースでは1つのnull行が必要です。STRICT_AGG_CARD=T問合せオプションを使用すると動作がW3Cに準拠しますが、パフォーマンスがわずかに低下します。

- ORDER BY

- SEM_MATCHでSPARQL ORDER BYを使用する場合、取り囲んでいるSQLブロック全体を通じて目的の順序を維持するためには、格納側のSQL問合せをSEM$ROWNUMで並べ替える必要があります。

- 数値計算

- ネイティブのOracleのNUMBER型はすべての演算処理のために内部的に使用され、すべての算術演算の結果はxsd:decimalとしてシリアライズされます。ネイティブのOracleのNUMBER型は、BINARY_FLOATおよびBINARY_DOUBLEよりも正確です。組込みデータ型NUMBERの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

- ゼロで除算した場合は、バインドされていない値が生成されるのではなく、ランタイム・エラーが発生します。

- 否定

- 潜在的にバインドされていない変数を参照するEXISTSおよびNOT EXISTSフィルタは、次のコンテキストではサポートされません。

- GROUP BY内の別名のない式

- 集計への入力

- ORDER BY内の式

- OPTIONALグラフ・パターン内に出現しない変数も参照するOPTIONALグラフ・パターン内のFILTER式

最初の3つのケースは、BIND句またはSELECT式を使用して変数にEXISTSまたはNOT EXISTSフィルタの結果を最初に割り当てることで実現できます。

これらの制限は、明確にバインドされた変数のみを参照するEXISTSおよびNOT EXISTSフィルタには、当てはまりません。

- 空白ノード

- 空白ノードは、グラフ・パターン内ではサポートされません。

- BNODE(literal)関数は、同じリテラル引数でコールされるたびに、同じ空白ノード値を戻します。

- プロパティ・パス

- 無制限の演算子+および*は、パフォーマンスの理由からデフォルトでは10ホップの深度制限を使用します。深度制限を0に設定すると、この動作を完全に無制限の検索に変更できます。詳細は、「プロパティ・パス」を参照してください。

- ロング・リテラル(CLOB)

- SPARQLのファンクションと集計は、デフォルトではロング・リテラルをサポートしていません。

- CLOB_EXP_SUPPORT=T問合せオプションを指定すると、SPARQL関数(IF、COALESCE、STRLANG、STRDT、SUBSTR、STRBEFORE、STRAFTER、CONTAINS、STRLEN、STRSTARTS、STRENDS)でのロング・リテラルのサポートが有効になります。

- CLOB_AGG_SUPPORT=T問合せオプションを指定すると、集計(MIN、MAX、SAMPLE、GROUP_CONCAT)でのロング・リテラルのサポートが有効になります。

- RDFリテラルの正規化

- デフォルトでは、SPARQLファンクションから返されるRDFリテラルと、値割当て文(BIND、SELECT式、GROUP BY式)で使用される定数RDFリテラルは正規化されます。この動作は、SPARQL 1.1の「D-Entailment Regime」と一致しています。

- 正規化を無効にするにはPROJ_EXACT_VALUES=T問合せオプションを使用します。

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

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

- RDFトリプル(およびオプションで名前付きグラフ)の3つの構成要素(主語、述語、目的語)を含む行を持つステージング表からセマンティク・データ・ストアにデータをバルク・ロードまたは追加します。詳細は、「ステージング表を使用したセマンティク・データのバルク・ロード」を参照してください。
このオプションは、大量のデータをロードする場合の最も高速な方法ですが、4000バイトを超える目的語の値を含むトリプルは処理できません。

- バッチ・ロード: Javaクライアント・インタフェースを使用してN-Triple形式のファイルのデータをセマンティク・データ・ストアにロードまたは追加します(「Java APIを使用したN-Triple形式のセマンティク・データのバッチ・ロード」を参照)。
このオプションは、バルク・ロードより低速ですが、4000バイトを超える目的語の値を含むトリプルも処理できます。ただし、このオプションでは名前付きグラフは処理されません。

- SDO_RDF_TRIPLE_SコンストラクタをコールするSQL INSERT文を使用してアプリケーション表にロードし、対応するRDFトリプル(状況によりグラフ名も含む)のセマンティク・データ・ストアに挿入します(「INSERT文を使用したセマンティク・データのロード」を参照)。
このオプションは、小規模なデータをロードする場合に便利です。

セマンティク・データをエクスポートする、言い換えると、セマンティク・データをステージング表に格納できるN-Triple形式またはN-Quad形式でOracle Databaseから取り出すには、「セマンティク・データのエクスポート」で説明されているSQL問合せを使用します。

注意:

Oracle Databaseリリース12.1では、「Oracle Data Pumpを使用したセマンティク・ネットワークのエクスポートまたはインポート」の説明にあるとおり、Oracle Data Pumpユーティリティの全てのデータベース・エクスポートおよびインポートの機能を使用して、セマンティク・ネットワークのエクスポートとインポートを行うことができます。

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

ステージング表を使用して、セマンティク・データ(およびオプションでセマンティク・データ以外の関連データ)をバルク・ロードできます。SEM_APIS.LOAD_INTO_STAGING_TABLEプロシージャ(「SEM_APISパッケージ・サブプログラム」を参照)をコールしてデータをロードします(ロード操作中に構文の正確性をチェックできます)。その後、SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャをコールして、データをステージング表からセマンティク・ストアにロードできます。(データがステージング表へのロード操作中に解析されていない場合は、SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャをコールするときにflagsパラメータにPARSEキーワードを指定する必要があります。)

次の例では、すべての必須列とそれらの列の必須名(およびロードする1つ以上のRDFトリプルにグラフ名が含まれる場合は、含まれる必要のあるオプションのRDF$STC_graph列)を含むステージング表の書式を示します。

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

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

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

注意:

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

起動側とMDSYSユーザーは、両方ともステージング表に対するSELECT権限と、アプリケーション表に対するINSERT権限を持っている必要があります。

次の項も参照してください。

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

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

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

セマンティク・ストアへのロードの準備として、複数の方法でセマンティク・データをステージング表にロードできます。一般的な方法は次のとおりです。

- 「SQL*Loaderを使用してN-Triple形式データをステージング表にロードする方法」の説明に従い、Oracle SQL*Loaderを使ってステージング表をロード

- 「外部表を使用してN-Quad形式データをステージング表にロードする方法」の説明に従い、外部表を使ってステージング表をロード

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文を使用してアプリケーション表に挿入することによってロードできます(「INSERT文を使用したセマンティク・データのロード」を参照)。

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文を発行してトランザクションを完了します。

例1-82 外部表を使用してステージング表をロードする方法

-- Create a source external table (note: table names are case sensitive)
BEGIN
sem_apis.create_source_external_table(
source_table    => 'stage_table_source'
,def_directory   => 'DATA_DIR'
,bad_file        => 'CLOBrows.bad'
);
END;
/
grant SELECT on "stage_table_source" to MDSYS;

-- Use ALTER TABLE to target the appropriate file(s)
alter table "stage_table_source" location ('demo_datafile.nt');

-- Load the staging table (note: table names are case sensitive)
BEGIN
sem_apis.load_into_staging_table(
staging_table => 'STAGE_TABLE'
,source_table  => 'stage_table_source'
,input_format  => 'N-QUAD');
END;
/

オブジェクトとグラフURI (結合)の長さが4000バイトを超える行は、拒否されて不良ファイルに格納されます。ただし、これらの拒否された行は、SQL INSERT文を使用してアプリケーション表に挿入することによってロードできます(「INSERT文を使用したセマンティク・データのロード」を参照)。

例1-82は、外部表を使用してステージング表をロードする方法を示します。

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データのロードをサポートしていません。

かわりに、「RDF Semantic Graph Support for Apache Jenaを使用したバルク・ロード」で説明する、RDF Semantic Graph Support for Apache Jenaのバルク・ロード機能の使用をお薦めします。

N-Triple形式のセマンティク・データのバッチ(バルク)・ロード操作を実行するには、<ORACLE_HOME>/md/jlib/sdordf.jarにパッケージされているJavaクラス oracle.spatial.rdf.client.BatchLoaderを使用します。バッチ・ロード操作を実行する前に、次のことを確認してください。

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

- Oracle Databaseリリース11以上が、Oracle Spatial and Graphとともにインストールされており、パーティショニング機能が有効であること。

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

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

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

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

- Linuxシステム:

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

- Windowsシステム:

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

-Ddb.userと-Ddb.passwordの値は、モデル<modelName>の所有者またはDBAユーザーに一致している必要があります。

デフォルトでは、BatchLoaderは、少なくともNUMBER型のIDおよびSDO_RDF_TRIPLE_S型のTRIPLEをそれぞれ名前に持つ2列がユーザーのアプリケーション表にあることを前提としています。ただし、デフォルトの名前をJVMプロパティの-DidColumn=<idColumnName>および-DtripleColumn=<tripleColumnName>をオーバーライドして変更できます。ID列は必要ありません。BatchLoaderが順序風の識別子を各トリプルのID列のかわりに生成しないように、追加のJVMプロパティで-DjustTriple=trueと指定します。

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

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

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

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

関連項目:

「RDF Semantic Graph support for Apache Jenaを使用したバルク・ロード」

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

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

注意:

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

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

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

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

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

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 セマンティク・データのエクスポート

この項には、セマンティク・データのエクスポート(つまり、セマンティク・データをステージング表に格納できるN-Triple形式またはN-Quad形式でOracle Databaseから取り出す)に関連する、次のトピックがあります。

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

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

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

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

例1-83に示すように、セマンティク・データは、SDO_RDF_TRIPLE_Sのメンバー・ファンクションを使用してアプリケーション表から取得できます。

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

--
-- Retrieves model-graph, subject, predicate, and object
--
SQL> SELECT a.triple.GET_MODEL() AS model_graph, a.triple.GET_SUBJECT() AS sub, a.triple.GET_PROPERTY() pred, a.triple.GET_OBJECT() obj FROM articles_rdf_data a where id in (2,99);

MODEL_GRAPH
------------------------------------------------------------
SUB
------------------------------------------------------------
PRED
------------------------------------------------------------
OBJ
------------------------------------------------------------
ARTICLES
<http://nature.example.com/Article1>
<http://purl.org/dc/elements/1.1/creator>
"Jane Smith"

ARTICLES:<http://examples.com/ns#Graph1>
<http://nature.example.com/Article101>
<http://purl.org/dc/elements/1.1/creator>
"John Smith"

--
-- Retrieves graph, subject, predicate, and object
--
SQL> select (case sep_pos when 0 then NULL else substr(model_graph,sep_pos+1) end) graph, sub, pred, obj from (SELECT instr(a.triple.GET_MODEL(),':') AS sep_pos, a.triple.GET_MODEL() AS model_graph, a.triple.GET_SUBJECT() AS sub, a.triple.GET_PROPERTY() pred, a.triple.GET_OBJECT() obj FROM articles_rdf_data a where id in (2,99));

GRAPH
--------------------------------------------------------------------------------
SUB
------------------------------------------------------------
PRED
------------------------------------------------------------
OBJ
------------------------------------------------------------

<http://nature.example.com/Article1>
<http://purl.org/dc/elements/1.1/creator>
"Jane Smith"

<http://examples.com/ns#Graph1>
<http://nature.example.com/Article101>
<http://purl.org/dc/elements/1.1/creator>
"John Smith"

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

例1-84に示すように、SEM_MATCH表関数(「SEM_MATCH表関数を使用したセマンティク・データの問合せ」を参照)を使用して、セマンティク・データをRDFモデルから取得できます。

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

--
-- Retrieves graph, subject, predicate, and object
--
SQL> select to_char(g$rdfterm) graph, to_char(x$rdfterm) sub, to_char(p$rdfterm) pred, y$rdfterm obj from table(sem_match('Select ?g ?x ?p ?y FROM NAMED <http://examples.com/ns#Graph1> {GRAPH ?g {?x ?p ?y}}',sem_models('articles'),null,null,null,null,' GRAPH_MATCH_UNNAMED=T PLUS_RDFT=T '));

GRAPH
------------------------------------------------------------
SUB
------------------------------------------------------------
PRED
------------------------------------------------------------
OBJ
---------------------------------------------------------------------------
<http://examples.com/ns#Graph1>
_:m99g3C687474703A2F2F6578616D706C65732E636F6D2F6E73234772617068313Egmb2
<http://purl.org/dc/elements/1.1/creator>
_:m99g3C687474703A2F2F6578616D706C65732E636F6D2F6E73234772617068313Egmb1

<http://examples.com/ns#Graph1>
<http://nature.example.com/Article102>
<http://purl.org/dc/elements/1.1/creator>
_:m99g3C687474703A2F2F6578616D706C65732E636F6D2F6E73234772617068313Egmb1

<http://examples.com/ns#Graph1>
<http://nature.example.com/Article101>
<http://purl.org/dc/elements/1.1/creator>
"John Smith"

<http://nature.example.com/Article1>
<http://purl.org/dc/elements/1.1/creator>
"Jane Smith"

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

セマンティク・データの取得中に取得された空白ノード識別子は、例1-85のコード抜粋に示す変換を使用してモデルとグラフ情報を削除するようにトリミング可能であり、それぞれVARCHAR2 (主語コンポーネントなど)およびCLOB (目的語コンポーネントなど)データに適用できます。

例1-86に、「RDFモデルからのセマンティク・データの取得」に説明されているセマンティク・データ取得問合せを使用して、それぞれsub列とobj列に対して例1-85の2つの変換を使用した後に取得された結果を示します。

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

--
-- Transformation on column "sub VARCHAR2"
-- holding blank node identifier values
--
Select (case substr(sub,1,2) when '_:' then '_:' || substr(sub,instr(sub,'m',1,2)+1) else sub end) from …
--
-- Transformation on column "obj CLOB"
-- holding blank node identifier values
--
Select (case dbms_lob.substr(obj,2,1) when '_:' then to_clob('_:' || substr(obj,instr(obj,'m',1,2)+1)) else obj end) from …

例1-86 例1-85の変換の適用による結果

--
-- Results obtained by applying transformations on the sub and pred cols
--
SQL> select (case substr(sub,1,2) when '_:' then '_:' || substr(sub,instr(sub,'m',1,2)+1) else sub end) sub, pred, (case dbms_lob.substr(obj,2,1) when '_:' then to_clob('_:' || substr(obj,instr(obj,'m',1,2)+1)) else obj end) obj from (select to_char(g$rdfterm) graph, to_char(x$rdfterm) sub, to_char(p$rdfterm) pred, y$rdfterm obj from table(sem_match('Select ?g ?x ?p ?y FROM NAMED <http://examples.com/ns#Graph1> {GRAPH ?g {?x ?p ?y}}',sem_models('articles'),null,null,null,null,' GRAPH_MATCH_UNNAMED=T PLUS_RDFT=T ')));

SUB
------------------------------------------------------------
PRED
------------------------------------------------------------
OBJ
---------------------------------------------------------------------------
_:b2
<http://purl.org/dc/elements/1.1/creator>
_:b1

<http://nature.example.com/Article102>
<http://purl.org/dc/elements/1.1/creator>
_:b1

1.7.5 Oracle Data Pumpを使用したセマンティク・ネットワークのエクスポートまたはインポート

Oracle Databaseリリース12.1では、Oracle Data Pumpユーティリティの全データベース・エクスポートおよびインポートの機能を使用して、セマンティク・ネットワークをエクスポートおよびインポートできます。ネットワークは、全データベース・エクスポートまたはインポートの一部として移動し、データベース全体がOracleのダンプ・ファイル(.dmp)で表現されます。

データ・ポンプを使用したセマンティク・ネットワークのエクスポートまたはインポートには、次の使用上の注意があります。

- インポートのターゲット・データベースには、RDFセマンティク・グラフのソフトウェアがインストールされ、既存のセマンティク・ネットワークが存在していないことが必要です。

- ファイングレイン・アクセス制御を使用するセマンティク・ネットワーク(トリプルレベルまたはリソースレベルのOLSまたはVPD)は、エクスポートまたはインポートできません。

- Workspace Managerを使用する、バージョン対応のセマンティク・ネットワークは、エクスポートまたはインポートできません。

- SEM_CONTAINS (MDSYS.SEMCONTEXT索引タイプ)のセマンティク・ドキュメント索引と、SEM_RELATED (MDSYS.SEM_INDEXTYPE索引タイプ)のセマンティク索引は、エクスポートの前に削除し、インポート後に再作成する必要があります。

- エクスポートおよびインポート中は、セマンティク・ネットワーク・オブジェクトに対するデフォルトの(オブジェクトの作成直後に存在する)権限のみが保持されます。たとえばユーザーAがセマンティク・モデルMを作成し、MDSYS.RDFM_Mに対するSELECTをユーザーBに付与した場合、インポート後に残るのは、MDSYS.RDFM_Mに対するユーザーAのSELECT権限のみです。インポート後、ユーザーBには、MDSYS.RDFM_Mに対するSELECT権限がありません。かわりにユーザーBのSELECT権限が再度付与されます。

- セマンティク・ネットワーク・データのエクスポートまたはインポート時には、データ・ポンプのコマンドライン・オプションtransform=oid:nを使用する必要があります。たとえば、次の形式のコマンドを使用します。

impdp system/<password-for-system> directory=dpump_dir dumpfile=rdf.dmp full=YES version=12 transform=oid:n

データ・ポンプの使用方法に関する情報および例については、『Oracle Databaseユーティリティ』を参照してください。

1.7.6 未使用値のパージ

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

パージする前に、MDSYSに、すべてのRDFモデルのアプリケーション表に対するSELECT権限を付与する必要があります。これを行うには、GRANTコマンドを直接使用するか、SEM_APIS.PRIVILEGE_ON_APP_TABLESサブプログラムを使用します。

パージ操作中に実行されたタスクのイベント・トレースは、RDF$ET_TAB表が起動側のスキーマに存在する場合、そこに記録できます(「バルク・ロード中のイベント・トレースの記録」を参照)。

次の例では、RDF_VALUE$表から使用されていない値をパージします。例では、名前付きグラフまたはCLOBを考慮しません。「例: 雑誌記事の情報」の例のデータがロードされていることも前提としています。

例1-87 未使用値のパージ

-- Purging unused values
set numwidth 20

-- Create view to show the values actually used in the RDF model
CREATE VIEW values_used_in_model (value_id) as
SELECT a.triple.rdf_s_id FROM articles_rdf_data a UNION
SELECT a.triple.rdf_p_id FROM articles_rdf_data a UNION
SELECT a.triple.rdf_c_id FROM articles_rdf_data a UNION
SELECT a.triple.rdf_o_id FROM articles_rdf_data a;

View created.

-- Create views to show triples in the model
CREATE VIEW triples_in_app_table as
SELECT a.triple.GET_SUBJECT() AS s, a.triple.GET_PROPERTY() AS p, a.triple.GET_OBJ_VALUE() AS o
FROM articles_rdf_data a;

View created.

CREATE VIEW triples_in_rdf_model as
SELECT s, p, o FROM TABLE ( SEM_MATCH('{?s ?p ?o}', SEM_MODELS('articles'), null, null, null ));

View created.

--
-- Content before deletion
--

-- Values in mdsys.RDF_VALUE$
CREATE TABLE values_before_deletion as select value_id from mdsys.rdf_value$;

Table created.

-- Values used in the RDF model
CREATE TABLE used_values_before_deletion as
SELECT * FROM values_used_in_model;

Table created.

-- Content of RDF model
CREATE TABLE atab_triples_before_deletion
as select * from triples_in_app_table;

Table created.

CREATE TABLE model_triples_before_deletion
as select * from triples_in_rdf_model;

Table created.

-- Delete some triples so that some of the values become unused
DELETE FROM articles_rdf_data a
WHERE a.triple.GET_PROPERTY() = '<http://purl.org/dc/elements/1.1/title>'
OR a.triple.GET_SUBJECT() = '<http://nature.example.com/Article1>';

5 rows deleted.

-- Content of RDF model after deletion
CREATE TABLE atab_triples_after_deletion
as select * from triples_in_app_table;

Table created.

CREATE TABLE model_triples_after_deletion
as select * from triples_in_rdf_model;

Table created.

-- Values that became unused in the RDF model
SELECT * from used_values_before_deletion
MINUS
SELECT * FROM values_used_in_model;

VALUE_ID
--------------------
1399113999628774496
4597469165946334122
6345024408674005890
7299961478807817799
7995347759607176041

-- RDF_VALUE$ content, however, is unchanged
SELECT value_id from values_before_deletion
MINUS
select value_id from mdsys.rdf_value$;

no rows selected

-- Now purge the values from RDF_VALUE$ (requires that MDSYS has
-- SELECT privilege on *all* the app tables in the semantic network)
EXECUTE sem_apis.privilege_on_app_tables;

PL/SQL procedure successfully completed.

EXECUTE sem_apis.purge_unused_values;

PL/SQL procedure successfully completed.

-- RDF_VALUE$ content is NOW changed due to the purge of unused values
SELECT value_id from values_before_deletion
MINUS
select value_id from mdsys.rdf_value$;

VALUE_ID
--------------------
1399113999628774496
4597469165946334122
6345024408674005890
7299961478807817799
7995347759607176041

-- Content of RDF model after purge
CREATE TABLE atab_triples_after_purge
as select * from triples_in_app_table;

Table created.

CREATE TABLE model_triples_after_purge
as select * from triples_in_rdf_model;

Table created.

-- Compare triples present before purging of values and after purging
SELECT * from atab_triples_after_deletion
MINUS
SELECT * FROM atab_triples_after_purge;

no rows selected

SELECT * from model_triples_after_deletion
MINUS
SELECT * FROM model_triples_after_purge;

no rows selected

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'を指定することで、所有する特定のモデルや伴意でセマンティク・ネットワーク索引を使用または不使用に設定できます。セマンティク・ネットワーク索引を使用または不使用にして、パフォーマンスに違いが出るか確認できます。たとえば、次の文はPSCGM索引をFAMILYモデルで使用できるように設定します。

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

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

- 自分で作成したセマンティク・ネットワーク索引とは無関係に、セマンティク・ネットワークが作成されると自動的に作成される索引の1つに、この項に示したサブプログラムをコールするときにindex_codeを'PSCGM'と指定することで管理できる索引があります。

- 新規のモデルまたは新規の伴意を作成すると、セマンティク・ネットワーク索引ごとに一意でない新規のBツリー索引が作成されますが、このようなBツリー索引はいずれも、USABLEステータスになります。

- (index_code値に'M'を含めることにより)セマンティク・ネットワーク索引キーにMODEL_ID列を含めると、問合せのパフォーマンスが向上することがあります。特に、仮想モデルを使用する場合はこの操作が有効です。

1.8.1 MDSYS.SEM_NETWORK_INDEX_INFOビュー

モデルおよび伴意のすべてのネットワーク索引に関する情報は、MDSYS.SEM_NETWORK_INDEX_INFOビューに保持されます。表1-16に、このビューの列(一部のリスト)を示します(1つの行が1つのネットワーク索引に対応します)。

表1-16 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-16に示した列の他に、MDSYS.SEM_NETWORK_INDEX_INFOビューには、ALL_INDEXESおよびALL_IND_PARTITIONSビュー(どちらも『Oracle Databaseリファレンス』を参照)から得られる次の列を含みます。

- ALL_INDEXESビュー: UNIQUENESS、COMPRESSION、PREFIX_LENGTH

- ALL_IND_PARTITIONSビュー: STATUS、TABLESPACE_NAME、BLEVEL、LEAF_BLOCKS、NUM_ROWS、DISTINCT_KEYS、AVG_LEAF_BLOCKS_PER_KEY、AVG_DATA_BLOCKS_PER_KEY、CLUSTERING_FACTOR、SAMPLE_SIZE、LAST_ANALYZED

MDSYS.SEM_NETWORK_INDEX_INFOビューの情報は失効している場合があることに注意してください。この情報をリフレッシュするには、SEM_APIS.REFRESH_SEM_NETWORK_INDEX_INFOプロシージャを使用します。

1.9 データ型索引の使用

データ型索引は、セマンティク・ネットワークに格納される型付きリテラルの値の索引です。この索引を使用すると、特定のタイプのFILTER式を含むSEM_MATCH問合せのパフォーマンスが大幅に向上する場合があります。たとえば、xsd:dateTimeリテラルのデータ型索引によって、フィルタ(?x < "1929-11-16T13:45:00Z"^^xsd:dateTime)の評価の速度が向上する場合があります。索引を作成できるいくつかのデータ型を、表1-17に示します。

表1-17 データ型索引が可能なデータ型

データ型URI

Oracleタイプ

索引タイプ

http://www.w3.org/2001/XMLSchema#decimal

NUMBER

一意でないBツリー(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

http://www.opengis.net/geosparql#wktLiteral

SDO_GEOMETRY

MDSYS.SPATIAL_INDEX

データ型索引が適切かどうかは、問合せのワークロードに応じて異なります。xsdデータ型でのデータ型索引は、変数を定数値と比較するフィルタに使用可能であり、特に、非常に選択的なフィルタ条件を持つ選択的でないグラフ・パターンが問合せに含まれる場合に役立ちます。適切なデータ型索引は、空間フィルタまたはテキスト・フィルタを使用する問合せに必要です。

データ型索引によって問合せパフォーマンスは向上しますが、徐々に増加する索引のメンテナンスによって、セマンティク・ネットワークに対するDMLおよびバルク・ロード操作のパフォーマンスが低下する可能性があります。バルク・ロード操作では、通常、データ型索引を削除し、バルク・ロードを実行してからデータ型索引を再作成する方が高速です。

以下のプロシージャを使ってデータ型索引を追加、変更、削除することができます。これらのプロシージャの説明は、「SEM_APISパッケージのサブプログラム」に記載されています。

- SEM_APIS.ADD_DATATYPE_INDEX

- SEM_APIS.ALTER_DATATYPE_INDEX

- SEM_APIS.DROP_DATATYPE_INDEX

既存のデータ型索引に関する情報は、MDSYS.SEM_DTYPE_INDEX_INFOビューに保持されます。表1-18に、このビューの列を示します(1つの行が1つのルール索引に対応します)。

表1-18 MDSYS.SEM_DTYPE_INDEX_INFOビューの列

列名

データ型

説明

DATATYPE

VARCHAR2(51)

データ型URI

INDEX_NAME

VARCHAR2(30)

索引の名前

STATUS

VARCHAR2(8)

索引のステータス: USABLEまたはUNUSABLE

TABLESPACE_NAME

VARCHAR2(30)

索引の表領域

例1-88に示すとおり、誕生日が1929年11月16日より前のすべての祖父を見つける問合せの評価中にデータ型索引が使用されるよう、HINT0ヒントを使用できます。

例1-88 HINT0を使用してデータ型索引が使用されるようにする方法

SELECT x, y
FROM TABLE(SEM_MATCH(
'{?x :grandParentOf ?y . ?x rdf:type :Male . ?x :birthDate ?bd
FILTER (?bd <= "1929-11-15T23:59:59Z"^^xsd:dateTime) }',
SEM_Models('family'),
SEM_Rulebases('RDFS','family_rb'),
SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/')),
null, null,
'HINT0={ LEADING(?bd) INDEX(?bd rdf_v$dateTime_idx) }
FAST_DATE_FILTER=T' ));

1.10 セマンティク・モデルおよびセマンティク・ネットワークの統計の管理

統計は、Oracle Databaseに格納されているセマンティク・データに対するSPARQL問合せおよびOWL推論のパフォーマンスに重要な意味を持ちます。Oracle Databaseリリース11gでは、セマンティク・データを分析して、統計を最新に保持するために、SEM_APIS.ANALYZE_MODEL、SEM_APIS.ANALYZE_ENTAILMENTおよびSEM_PERF.GATHER_STATSが導入されています。これらのAPIは使用しやすく、表およびパーティション統計の内部的な詳細に関心がない一般ユーザーを対象としています。

次のサブプログラムを使用して、モデルおよび伴意の統計をエクスポート、インポート、設定および削除したり、ネットワーク統計をエクスポート、インポートおよび削除することができます。

- SEM_APIS.DELETE_ENTAILMENT_STATS

- SEM_APIS.DELETE_MODEL_STATS

- SEM_APIS.EXPORT_ENTAILMENT_STATS

- SEM_APIS.EXPORT_MODEL_STATS

- SEM_APIS.IMPORT_ENTAILMENT_STATS

- SEM_APIS.IMPORT_MODEL_STATS

- SEM_APIS.SET_ENTAILMENT_STATS

- SEM_APIS.SET_MODEL_STATS

- SEM_PERF.DELETE_NETWORK_STATS

- SEM_PERF.EXPORT_NETWORK_STATS

- SEM_PERF.IMPORT_NETWORK_STATS

この項では、セマンティク・モデルとセマンティク・ネットワークの統計の管理に関連する、次の内容について説明します。

- モデル・レベルでの統計の保存

- モデル・レベルでの統計のリストア

- ネットワーク・レベルでの統計の保存

- ネットワーク・レベルでの統計のリストア

- モデル・レベルでの統計の設定

- モデル・レベルでの統計の削除

1.10.1 モデル・レベルでの統計の保存

既存のモデルに対する問合せおよび推論が効率的に実行された場合、モデルの所有者として、既存のモデルの統計を保存できます。

-- Login as the model owner (for example, SCOTT)
-- Create a stats table. This is required.
execute dbms_stats.create_stat_table('scott','rdf_stat_tab');

-- You must grant access to MDSYS
SQL> grant select, insert, delete, update on scott.rdf_stat_tab to MDSYS;

-- Now export the statistics of model TEST
execute sdo_rdf.export_model_stats('TEST','rdf_stat_tab', 'model_stat_saved_on_AUG_10', true, 'SCOTT', 'OBJECT_STATS');

また、SEM_APIS.EXPORT_ENTAILMENT_STATS を使用して、伴意の統計(伴意グラフ)を保存できます。

execute sem_apis.create_entailment('test_inf',sem_models('test'),sem_rulebases('owl2rl'),0,null);
PL/SQL procedure successfully completed.

execute sem_apis.export_entailment_stats('TEST_INF','rdf_stat_tab', 'inf_stat_saved_on_AUG_10', true, 'SCOTT', 'OBJECT_STATS');

1.10.2 モデル・レベルでの統計のリストア

モデルの所有者として、以前にSEM_APIS.EXPORT_MODEL_STATS に保存した統計をリストアできます。これは、このモデルに更新が割り当てられ、統計が再収集された場合に必要となることがあります。統計に変更があると既存のSPARQL問合せの計画変更が生じることがあり、このような計画変更を望まない場合には、古いセットの統計をリストアできます。

execute sem_apis.import_model_stats('TEST','rdf_stat_tab', 'model_stat_saved_on_AUG_10', true, 'SCOTT', false, true, 'OBJECT_STATS');

また、SEM_APIS.IMPORT_ENTAILMENT_STATS を使用して、伴意の統計(伴意グラフ)をリストアできます。

execute sem_apis.import_entailment_stats('TEST','rdf_stat_tab', 'inf_stat_saved_on_AUG_10', true, 'SCOTT', false, true, 'OBJECT_STATS');

1.10.3 ネットワーク・レベルでの統計の保存

統計はネットワーク・レベルで保存できます。

-- First, create a user RDF_ADMIN and assign access to package SEM_PERF to RDF_ADMIN
--
-- As SYS
--
create user RDF_ADMIN identified by RDF_ADMIN;

grant connect, resource, unlimited tablespace to RDF_ADMIN;

grant execute on sem_perf to RDF_ADMIN;

conn RDF_ADMIN/<password>

execute dbms_stats.create_stat_table('RDF_ADMIN','rdf_stat_tab');
grant select, insert, delete, update on RDF_ADMIN.rdf_stat_tab to MDSYS;

--
-- This API call will save the statistics of both MDSYS.RDF_VALUE$ table
-- and MDSYS.RDF_LINK$
--
execute sem_perf.export_network_stats('rdf_stat_tab', 'NETWORK_ALL_saved_on_Aug_10', true, 'RDF_ADMIN', 'OBJECT_STATS');

--
-- Alternatively, you can save statistics of the MDSYS.RDF_VALUE$ table
--
execute sem_perf.export_network_stats('rdf_stat_tab', 'NETWORK_VALUE_TAB_saved_on_Aug_10', true, 'RDF_ADMIN', 'OBJECT_STATS', options=> mdsys.sdo_rdf.VALUE_TAB_ONLY);

--
-- Or, you can save statistics of the MDSYS.RDF_LINK$ table
--
execute sem_perf.export_network_stats('rdf_stat_tab', 'NETWORK_LINK_TAB_saved_on_Aug_10', true, 'RDF_ADMIN', 'OBJECT_STATS', options=> mdsys.sdo_rdf.LINK_TAB_ONLY);

1.10.4 ネットワーク・レベルでの統計のリストア

「ネットワーク・レベルでの統計の保存」の特権ユーザーは、SEM_PERF.IMPORT_NETWORK_STATSを使用して、ネットワーク・レベル統計をリストアできます。

conn RDF_ADMIN/<password>

execute sem_perf.import_network_stats('rdf_stat_tab', 'NETWORK_ALL_saved_on_Aug_10', true, 'RDF_ADMIN', false, true, 'OBJECT_STATS');

1.10.5 モデル・レベルでの統計の設定

モデルの所有者として、このモデルの統計を手動で調整できます。(ただし、統計を調整する前に、統計を必要に応じてリストアできるように先に保存しておく必要があります。)次の例では、モデルの行数とブロック数の2つのメトリックを設定します。

execute sem_apis.set_model_stats('TEST', numrows=>10, numblks=>1,no_invalidate=>false);

また、SEM_APIS.SET_ENTAILMENT_STATS を使用して、伴意の統計を設定できます。

execute sem_apis.set_entailment_stats('TEST_INF', numrows=>10, numblks=>1,no_invalidate=>false);

1.10.6 モデル・レベルでの統計の削除

統計の削除も実行計画に影響を及ぼすことがあります。モデルの所有者として、モデルの統計を削除できます。

execute sem_apis.delete_model_stats('TEST', no_invalidate=> false);

また、SEM_APIS.DELETE_ENTAILMENT_STATSを使用して、伴意の統計を削除できます。(ただし、モデルまたは伴意の統計を削除する前に、統計を必要に応じてリストアできるように先に保存しておく必要があります。)

execute sem_apis.delete_entailment_stats('TEST_INF', no_invalidate=> false);

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

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

モデルを作成した後は、表にトリプルを挿入できます(「セマンティク・データの例(PL/SQLおよびJava)」を参照)。

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

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

- 例: 雑誌記事の情報

- 例: 家系の情報

このガイドで示されている例の他に、http://www.oracle.com/technetwork/indexes/samplecode/semantic-sample-522114.htmlのサンプル・コードを参照してください。

1.12.1 例: 雑誌記事の情報

この項では、雑誌記事に関する文のモデルに対応する簡単なPL/SQLの例を示します。例1-89では、説明のためのコメントとともに、この章で説明されている各概念が参照され、「SEM_APISパッケージ・サブプログラム」で述べられている関数とプロシージャが使用されています。

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

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

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

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

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

-- Insert rows into the table.

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

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

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

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

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

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

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

COMMIT;

-- Query semantic data.

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

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

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

-- Use SDO_RDF_TRIPLE_S member functions in queries.

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

1.12.2 例: 家系の情報

この項では、ファミリ・ツリー(家系)情報に関する文のモデルに対応する簡単なPL/SQLの例を示します。例1-89では、説明のためのコメントとともに、この章で説明されている各概念が参照され、「SEM_APISパッケージ・サブプログラム」で述べられている関数とプロシージャが使用されています。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

COMMIT;

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

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

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

-- General inferencing in the family model

EXECUTE SEM_APIS.CREATE_RULEBASE('family_rb');

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

COMMIT;

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

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

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

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

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

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

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

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

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

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

1.13 リリース11.1以上でのソフトウェアの名前の変更

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

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

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

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

古い名前

新しい名前

RDF_ALIASデータ型

SEM_ALIAS

RDF_MODEL$ビュー

SEM_MODEL$

RDF_RULEBASE_INFOビュー

SEM_RULEBASE_INFO

RDF_RULES_INDEX_DATASETSビュー

SEM_RULES_INDEX_DATASETS

RDF_RULES_INDEX_INFOビュー

SEM_RULES_INDEX_INFO

RDFI_rules-index-nameビュー

SEMI_rules-index-name

RDFM_model-nameビュー

SEMM_model-name

RDFR_rulebase-nameビュー

SEMR_rulebase-name

SDO_RDFパッケージ

SEM_APIS

SDO_RDF_INFERENCEパッケージ

SEM_APIS

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

SEM_MATCH

SDO_RDF_MODELSデータ型

SEM_MODELS

SDO_RDF_RULEBASESデータ型

SEM_RULEBASES

1.14 RDFセマンティク・グラフの詳細

RDFセマンティク・グラフのサポートの詳細および関連トピックについては、次のリソースが役立つ場合があります。

- 「Oracle Spatial and Graph RDFセマンティク・グラフ」ページ(OTN) (ダウンロード、技術やビジネスに関するホワイト・ペーパー、ディスカッション・フォーラム、その他の情報源のリンクが含まれる): http://www.oracle.com/technetwork/database/options/spatialandgraph/overview/rdfsemantic-graph-1902016.html

- World Wide Web Consortium (W3C)の「RDF Primer」: http://www.w3.org/TR/rdf-primer/

- World Wide Web Consortium (W3C)の「OWL Web Ontology Language Reference」: http://www.w3.org/TR/owl-ref/

2 OWLの概要

この章では、Web Ontology Language(OWL)のサブセットのサポートに関連する概念について説明します。この章の内容は、「RDFセマンティク・グラフの概要」の情報に基づいており、読者がオントロジ、プロパティ、関係などのOWLに関する主要な概念について十分に理解していることを前提としています。OWLの詳細は、http://www.w3.org/TR/owl-ref/にある「OWL Web Ontology Language Reference」を参照してください。

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

- オントロジ

- OWL推論の使用方法

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

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機能またはサポートされないOWL機能の詳細は、「サポートされるOWLサブセット」を参照してください。

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テーブル・ファンクション(「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」を参照)を使用するか、SEM_RELATED演算子とその補助演算子(「セマンティク演算子を使用したリレーショナル・データの問合せ」を参照)を使用します。

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 2RLの項(http://www.w3.org/TR/owl2-profiles/#OWL_2_RL)では、「OWL 2 RLプロファイルは、あまり表現力を犠牲にせずにスケーラブルな推論を必要とするアプリケーションを対象としています。これは、言語の最大限の表現性と引き換えに効率を提供するアプリケーション、およびOWL 2による表現性の強化を必要とするRDF(S)アプリケーションの両方のOWL 2アプリケーションに対応するように設計されています」と説明されています。
システム定義のルールベース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など)がすべて適用可能になります。

- OWL 2 EL: W3Cの「OWL 2 Web Ontology Language Profiles」に記載された推奨事項のOWL 2 ELの項(http://www.w3.org/TR/owl2-profiles/#OWL_2_EL)では、OWL 2 ELプロファイルはOWL 2のサブセットとして設計されており、次の特色を持つと記述されています。

- 非常に多数のクラスまたはプロパティ、あるいはその両方を定義するオントロジを採用するアプリケーションに特に適しています。

- このような多数のオントロジで使用される表現力を獲得しています。

- オントロジの一貫性、クラス表現の組込みおよびインスタンス・チェックを多項式時間で決定できます。

OWL 2 ELオントロジの主な例は、生物医学オントロジのSNOMED Clinical Terms (SNOMED CT)です。SNOMED CTの詳細は、http://www.ihtsdo.org/snomed-ct/を参照してください。

システム定義のルールベースOWL2ELは、EL構文をサポートしています。

OWLPRIMEおよびOWL2RLと同様に、このOWL2ELルールベースのルールはユーザーに表示されず、OWL2ELルールベースがまだ存在しない場合は自動的に作成されます。

次のコードの抜粋では、有名なSNOMEDオントロジに対してOWL2ELルールベースを使用しています。

CREATE TABLE snomed_tpl (triple SDO_RDF_TRIPLE_S) COMPRESS;
EXECUTE sem_apis.create_sem_model('snomed','snomed_tpl','triple') compress;
-- Insert data into model SNOMED. Details omitted
...
-- Now run inference using the OWL2EL rulebase
EXECUTE sem_apis.create_entailment('snomed_inf',sem_models('snomed'),sem_rulebases('owl2el'));

OWL2ELルールベース・サポートには再帰オブジェクト・プロパティ(ReflexiveObjectProperty)は含まれていませんが、これは、再帰オブジェクト・プロパティがそれ自体ですべての個体をリンクし、推論グラフの不必要かつ高コストな拡張が行われる可能性があるためです。

表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/owl2-profiles/#OWL_2_RLを参照)

OWL2EL

(http://www.w3.org/TR/owl2-profiles/#OWL_2_ELを参照)

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ルールはRDFセマンティク・グラフ推論エンジンにすでに組み込まれているため、ルールベースを作成してそれにルールを追加する必要はありません。

例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プロシージャをコールします。

パフォーマンス上の理由で、デフォルトでは、推論エンジンは各ユーザー・ルールを、推論されたトリプル(主語としてのリテラル値、述語としての空白ノードなど)の構文の正当性をチェックすることなく、最終ラウンドの伴意の後まで実行します。最終伴意ラウンドの完了後に、推論エンジンは構文違反のすべてのトリプルを除外します(これらのトリプルのエラーはスローされません)。ただし、構文違反のトリプルが複数ラウンドの推論中に存在する場合があるため、ルールはこれらのトリプルをルールの前件の一部として使用できます。たとえば、次のユーザー定義ルールを検討します。

- ルール1:

(?s :account ?y)
(?s :country :Spain) --> (?y rdf:type :SpanishAccount)

- ルール2:

(?s :account ?y)
(?y rdf:type :SpanishAccount) --> (?s :language "es_ES")

ルール1はスペインのすべてのユーザーを検索し、そのアカウントをスペイン・アカウントとして指定します。ルール2は、スペイン・アカウントを持つすべてのユーザーの言語をes_ES(スペイン語)に設定します。次のデータを検討します(Turtle形式で示します)。

:Juan      :account "123ABC4Z"
:country :Spain

:Alejandro :account "5678DEF9Y"
:country :Spain

ルール1およびルール2を適用すると、次の推論されたトリプルが生成されます。

(:Juan      :language "es_ES")
(:Alejandro :language "es_ES")

アカウントのタイプが:SpanishAccountであることを指定するトリプルがないことに注意します。ユーザー定義ルールは伴意の作成中にこれらのトリプルを推論しますが、推論エンジンは推論の最終ラウンド後にそのトリプルを除外します(構文違反があるためです)。アカウントはリテラル値であるため、RDFトリプルでは主語として使用できません。

推論されたトリプルの構文の正当性を強制的にチェックするには、ルールのFILTER式の先頭に、/*+ ENABLE_SYNTAX_CHECKING */オプティマイザ・ヒントを追加します。ルールの構文チェックを強制すると、パフォーマンス・ペナルティとなり、構文違反があるトリプルに対して例外がスローされます。次の例では、ルール1と同様に、構文チェックを強制しています。(また、この例では、単にフィルタ式の使用方法を示すために、アカウントを末尾の文字が'Z'ではないものに制限しています。)

INSERT INTO mdsys.semr_user_rulebase VALUES (
'spanish_account_rule',
'(?s <http://example.com/account> ?y)(?y <http://example.com/account> <http://example.com/Spain>)',
'/*+ ENABLE_SYNTAX_CHECKING */ y not like ''%Z'' ',
'(?y <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.com/SpanishAccount>)',
NULL
);

例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

例2-4 証明情報の表示

証明用の主語、述語、目的語の完全なURIを取得するには、モデル・ビューおよび伴意(ルール索引)ビューを問い合せます。例2-4では、モデル・ビューMDSYS.SEMM_OWLTSTと伴意ビューMDSYS.SEMI_OWLTST_IDXを使用して、LINK_ID値および関連するトリプルの内容を表示します。

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 伴意の検証

例2-5では、SEM_APIS.VALIDATE_ENTAILMENT関数を使用します。この関数では、エラーが検出されない場合はNULL値が戻され、エラーが検出された場合は文字列のVARRAYが戻されます。

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プロシージャを実行する必要があります。使用に関する重要な情報については、当該プロシージャの「使用上の注意」(「SEM_PERFパッケージ・サブプログラム」内)を参照してください。

- 推論操作用に十分な一時表領域を割り当てます。OracleのOWL推論サポートは、表結合に大きく依存するため、かなりの量の一時表領域を使用します。

- SVFHおよびAVFH推論コンポーネントの適切な実装を使用します。
owl:someValuesFromやowl:allValuesFromによって定義される制限クラス数が少ない場合は(LUBMデータセットと同様)、SVFHおよびAVFH推論コンポーネントのデフォルトの実装が最適に動作します。ただし、Gene Ontology (http://www.geneontology.org/)のようにこれらのクラスの数が多い場合、SVFHおよびAVFHの非手続き型の実装を使用するとパフォーマンスが大幅に向上する可能性があります。

手続き実装を無効にする場合、また、SVFHおよびAVFHの非手続き型の実装を選択する場合は、SEM_APIS.CREATE_ENTAILMENTに対するオプションに'PROCSVFH=F'または'PROCAVFH=F'、あるいはその両方を含めます。オントロジに適切な実装を使用すると、大きなパフォーマンス上のメリットが得られます。たとえば、NCI Thesaurusオントロジ(http://www.cancer.gov/research/resources/terminologyを参照)に対してSVFHの非手続き型実装を選択すると、SVFH推論コンポーネントのパフォーマンスが960%向上しました(デュアルコア、8GB RAM、Oracle ASMと連携する3つのSATAディスクが付いたデスクトップ・システムでテストされています)。

「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" .

OWLPrime推論を(SAMコンポーネントを指定して)このセットに適用すると、次の新しいトリプルが生成されます。

: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.SEMC_entailment-nameというビューに格納されます(entailment-nameは伴意(ルール索引)の名前です)。表2-3に、各MDSYS.SEMC_entailment-nameビューの列を示します。

表2-3 MDSYS.SEMC_entailment_nameビューの列

列名

データ型

説明

MODEL_ID

NUMBER

推論されたモデルのID番号

VALUE_ID

NUMBER

CLIQUE_IDで識別されるowl:sameAsクリークのメンバーであるリソースのID番号

CLIQUE_ID

NUMBER

VALUE_IDリソースのクリーク代表のID番号

領域を節約するために、MDSYS.SEMC_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.SEMC_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.SEMC_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.SEMC_M_IDX
UNION ALL
SELECT DISTINCT clique_id, clique_id
FROM MDSYS.SEMC_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つ以上の名前付きグラフが含まれる場合でも、すべての表明は、それが名前付きグラフの一部であるかどうかにかかわらず、単一のグラフから取得された場合と同様に扱われるため、違いはありません。(RDFセマンティク・グラフの名前付きグラフのサポートの概要は、「名前付きグラフ」を参照してください)。

このデフォルトの推論は、名前付きグラフがまったく考慮されないという点で、完全にグローバルなものと考えることができます。

ただし、名前付きグラフを使用する場合は、次のいずれかの機能を使用することで、デフォルトの推論をオーバーライドし、名前付きグラフを考慮に入れることができます。

- 名前付きグラフ・ベースのグローバル推論(NGGI): すべての指定された名前付きグラフを統合グラフとして処理します。NGGIでは、考慮されるトリプルの有効範囲を絞り込みながら、高い柔軟性を実現できます(「名前付きグラフをベースしたグローバル推論」を参照)。

- 名前付きグラフ・ベースのローカル推論(NGLI): 指定された名前付きグラフをそれぞれ個別エンティティとして処理します。NGLIについては、「名前付きグラフをベースにしたローカル推論(NGLI)」を参照してください。

NGGIとNGLIを一緒に使用する場合は、「NGGとNGLIの併用」で推奨される使用フローを参照してください。

伴意(ルール索引)の作成時に、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グラフ名を持ちます。)

この例では、名前付きグラフをベースにしたローカル推論(NGLI)は、:Maryがowl:sameAs :Bellaであるとは推論しません(この2つの表明が2つの異なるグラフG1およびG2から得られているためです)。対照的に、G1、G2および機能的属性定義を含む名前付きグラフ・ベースのグローバル推論(NGGI)では、:Maryがowl:sameAs :Bellaであると推測できます。

現在、NGLIは証明の生成、ユーザー定義ルール、最適化されたowl:sameAsの処理または増分推論とは連携しません。

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

例2-7に、NGLIを示します。

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)は、名前付きグラフの1つに格納する必要があります。

NGLIを使用して、セマンティクに索引付けされたドキュメントでドキュメント中心の推論を実行する方法の説明および例については、「ドキュメント中心の推論の実行」を参照してください。

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

ENTAIL_ANYWAY=Tを指定していますが、これはENTAIL_ANYWAY=Tが指定されていないと、手順1のNGGIコールは推論されたグラフのステータスをVALIDに設定し、手順2のSEM_APIS.CREATE_ENTAILMENTプロシージャ・コールがすぐに終了するためです。

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

選択的推論は、コンポーネント・ベースの推論です。この操作では、推論を関心のある特定のOWLコンポーネントに限定します。選択的推論を実行するには、SEM_APIS.CREATE_ENTAILMENTプロシージャのinf_components_inパラメータを使用して、コンポーネントのカンマ区切りのリストを指定します。最終的な推論は、指定したルールベースと指定したコンポーネントの和集合によって決定されます。

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

例2-8では、サブクラス(SCOH)関係に基づくクラス階層と、サブプロパティ(SPOH)関係に基づくプロパティ階層に推論を限定します。この例では、空のルールベースを作成してから、SEM_APIS.CREATE_ENTAILMENTプロシージャのコールで2つのコンポーネント('SCOH,SPOH')を指定します。

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

使用可能なコンポーネント・コードは、SCOHCOMPH、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演算子の使用

「例: がんのオントロジ」を題材として、セマンティクな一致を必要とする「診断がImmune_System_Disorderタイプの患者をすべて検出する」という問合せについて検討します。構文的な一致に基づくPATIENTS表(「例: がんのオントロジ」を参照)の一般的なデータベース問合せでは、どの行も戻されません。Immune_System_Disorderとまったく同じ値を含むDIAGNOSIS列のある行は存在しないからです。たとえば、次の問合せではどの行も戻されません。

SELECT diagnosis FROM patients WHERE diagnosis = 'Immune_System_Disorder';

例2-9 SEM_RELATED演算子

ただし、患者のデータ表の多くの行は、診断上このクラスに分類されるため、関連性を保持しています。例2-9では、(字句の等価性ではなく) SEM_RELATED演算子を使用して、患者のデータ表から関連するすべての行を取得します。(この例の場合、Immune_System_Disorderという語句には名前空間の接頭辞が付けられており、デフォルトの仮定として表の列の値にも名前空間の接頭辞が含まれます。ただし、「値がURIとして格納されない場合のURIPREFIXの使用」で説明されているように、いつでもそうなるわけではありません。)

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オプション属性では、関連する語句間の関係の距離量に対して限界値を指定できます。距離量の詳細は、「SEM_DISTANCE補助演算子の使用」を参照してください。

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 SEM_DISTANCE補助演算子

例2-10は、例2-9を拡張したもので、SEM_DISTANCE補助演算子を含む複数の文が使用されています。SEM_DISTANCE補助演算子は、2つの語句間の距離を測定することで、それらの語句(ここでは、患者の診断と語句Immune_System_Disorder)の関連がどの程度近似しているかを計算します。「例: がんのオントロジ」に示すがんのオントロジを使用すると、AIDSとImmune_System_Disorder間の距離は3です。

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
AND SEM_DISTANCE(123) <= 3;

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

例2-11では、距離情報を使用して、主演算子により戻される行の数を制限します。SEM_RELATEDの起動で指定された目的語属性に関連する用語を含む行のうち、距離が2以上4以下のすべての行が取得されます。

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 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 セマンティク索引の作成

例2-12では、Cancer_Ontologyオントロジを使用するPATIENTS表のDIAGNOSIS列に対してDIAGNOSIS_SEM_IDXというセマンティク索引を作成します。

CREATE INDEX diagnosis_sem_idx
ON patients (diagnosis)
INDEXTYPE IS MDSYS.SEM_INDEXTYPE;

索引を使用するには、索引の作成される列(例2-12ではDIAGNOSIS)がSEM_RELATED演算子の最初のパラメータである必要があります。最初のパラメータではない場合、その索引は問合せの実行時に使用されません。

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

特定のセマンティク問合せのパフォーマンスを向上するため、索引の作成時に1つ以上のモデルおよびルールベースを指定して、セマンティク索引用の統計情報を生成できます。例2-13では、指定したモデルおよびルールベースの統計情報も同時に生成する索引を作成します。この索引は、問合せ時に他のモデルやルールベースと組み合せて使用できますが、統計情報は、索引の作成時に指定したモデルおよびルールベースが問合せで指定したモデルおよびルールベースと同じ場合にのみ使用されます。

CREATE INDEX diagnosis_sem_idx
ON patients (diagnosis)
INDEXTYPE IS MDSYS.SEM_INDEXTYPE('ONTOLOGY_MODEL(medical_ontology),
RULEBASE(OWLPrime)');

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

統計情報は、セマンティク関係の距離でソートされた上位k個の結果を戻す問合せを実行する場合に便利です。例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/を参照)。

約40個のSKOS固有の語句が、RDFセマンティク・グラフ・サポートに含まれています(skos:broader、skos:relatedMatch、skos:Conceptなど)。SKOSの公理トリプルが100個以上追加されて、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.1.2 サポートされないSKOSセマンティク

SKOSセマンティクの次の機能は、サポートされていません。

- S12およびS51: 関連する述語のrdfs:rangeは、RDFプレーン・リテラルのクラスです。これらの述語の目的語値が本当にプレーン・リテラルであるかどうかのチェックは存在しませんが、アプリケーションでそのようなチェックを実行できます。

- S14: リソースは、言語タグごとにskos:prefLabelの値を1つのみ持ちます。この整合性条件はOWL FULLセマンティクの範囲も超えており、現在のリリースでは実施されません。

- S32: skos:memberのrdfs:rangeは、クラスskos:Conceptおよびskos:Collectionの和集合です。この整合性条件は実施されません。

- S55、S56およびS57は、デフォルトではサポートされませんが、OWL 2サブプロパティ・チェーン構成要素を使用して実装できます(「サポートされるSKOSセマンティクス」を参照)。

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パッケージで提供されます。「SEM_RDFCTXパッケージ・サブプログラム」に、SEM_RDFCTXパッケージのサブプログラムに関するリファレンス情報があります。

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

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

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

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

- SEM_CONTAINSと補助演算子

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

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

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

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

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

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

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

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

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

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

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

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

- 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スキーマを使用して抽出情報を取得する場合は、同等のRDF/XMLを生成するためにXMLスタイル・シートを使用できます。startDriverおよびcloseDriverメソッドは、情報エクストラクタに関係するハウスキーピング操作を実行できます。オプションのparamsパラメータを使用すると、エクストラクタが必要な抽出タイプ(たとえば、目的の抽出品質)に関する追加情報を取得できます。

必要に応じて、batchExtractRdfメンバー関数の実装を提供することによって、エクストラクタ・タイプの実装でバッチ・インタフェースをサポートする場合があります。この関数は入力パラメータdocCursorを介してカーソルを受け入れ、通常はそのカーソルを使用して各ドキュメントを取得し、ドキュメントから情報を抽出し、その抽出情報をextracted_info_table表のpartition_nameパーティションで識別される指定されたパーティションに挿入します。preferencesパラメータは、ポリシーに関連付けられたプリファレンス値の取得に使用されます(「外部ドキュメントの索引付け」および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ドキュメントに変換します。Oracle DatabaseでGATEエンジンを使用する構成の詳細は、「General Architecture for Text Engineering (GATE)の使用」を参照してください。新しい情報エクストラクタを作成する例は、「新たなエクストラクタ・タイプの作成」を参照してください。

Webサービスとしてデプロイされる情報エクストラクタは、RDFCTX_WS_EXTRACTORタイプ(RDFCTX_EXTRACTORタイプのサブタイプ)を拡張することでデータベースから起動できます。RDFCTX_WS_EXTRACTORタイプはextractRDFメソッドでWebサービス・コールアウトをカプセル化します(関連する属性値をタイプ・コンストラクタで設定することによって、ネットワークベースのエクストラクタの特定の実装でこの実装を再利用できます)。

Thomson Reuters Calaisは、Webサービス・コールアウトを使用してアクセスできるネットワーク・ベースの情報エクストラクタの一例です。RDFCTX_WS_EXTRACTORタイプのサブタイプであるCALAIS_EXTRACTORタイプは、Calais抽出ロジックをカプセル化し、それを使用してドキュメントにセマンティクに索引付けできます。CALAIS_EXTRACTORタイプをセマンティク索引の作成に使用するには、「CALAIS_EXTRACTORタイプの構成」の説明のとおりに、事前にこのタイプをデータベース・インスタンスに対して構成する必要があります。

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 ドキュメントのセマンティク索引付け

リレーショナル表の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を使用して指定されたドキュメント検索パターンは、ドキュメントから抽出されたトリプルとユーザー定義モデルで定義されたトリプルを対象とすることができます。

複数のエクストラクタ・ポリシーを使用して1つの索引を作成できますが、その場合は、対応するエクストラクタによって抽出されたトリプルが異なる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列を示します。タイプMDSYS.SEMCONTEXTの索引は、SEM_CONTAINS演算子が使用するこの列で定義される必要があります。

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演算子の詳細とその例は、「「SPARQL問合せパターンを使用したドキュメントの検索」」を参照してください。

4.4.1 SEM_CONTAINS_SELECT補助演算子

SEM_CONTAINS_SELECT補助演算子を使用すると、いくつかの検索条件と一致する各ドキュメントの追加情報を戻すことができます。この補助演算子は、単一の数値属性(operbind)を持ち、この属性はバインディングに同じ値を使用することで、SEM_CONTAINS_SELECT補助演算子のインスタンスをSEM_CONTAINS演算子と関連付けます。この補助演算子は、一致ドキュメントからの追加情報を含むCLOB型のオブジェクトを、SPARQL Query Results XML形式で書式設定された状態で戻します。

SEM_CONTAINS_SELECT補助演算子の構文は次のとおりです。

SEM_CONTAINS_SELECT(
operbind  NUMBER
) RETURN CLOB;

SEM_CONTAINS_SELECT補助演算子の詳細とその例は、「ドキュメント内サブグラフの照合でのSPARQL変数に対するバインディング(SEM_CONTAINS_SELECT補助演算子)」を参照してください。

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;

前の問合せでは、エクストラクタ・ポリシー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_FILTER_POLICYポリシー(CTX_DDL.CREATE_POLICYプロシージャを使用して作成)が、スキーマ内に存在する必要があります。このプリファレンス・ドキュメントを使用してセマンティクに索引付けされる表の列には、書式設定されたドキュメントへのパスを格納できます(そこから、指定されたCTXポリシーを使用してプレーン・テキストが抽出されます)。その後、エクストラクタ・ポリシーに関連付けられている情報エクストラクタが、プレーン・テキストをさらに処理して、セマンティクをRDF/XML形式で抽出します。

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

CALAIS_EXTRACTORタイプ(RDFCTX_WS_EXTRACTORタイプのサブタイプ)を使用すると、ネットワーク(パブリックにアクセス可能なものを含む(OpenCalais.com))上の任意の場所のWebサービス・エンド・ポイントにアクセスできます。そうするには、次の例に示すように、SYSDBA権限で接続し、対応するパラメータを設定してCalaisエクストラクタ・タイプのWebサービスのエンド・ポイント、SOAPアクションおよびライセンス・キーを構成する必要があります。

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コンポーネントをインスタンス化し、事前に決定されているポートで抽出リクエストをリスニングします)。使用するmdsys.gatenlp_extractorタイプのすべてのインスタンスに対して、次の例に示すように、GATEリスナーのホストおよびポストがデータベースに記録されます。

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にシリアライズされ、ソケット・クライアントに戻されます。

OTNのコード・サンプルおよび例のページから、GATEリスナーのサンプルJava実装をダウンロードできます(このページの詳細は、「セマンティク・データの例(PL/SQLおよびJava)」を参照してください)。

データベース内のmdsys.gatenlp_extractor実装は、XMLでエンコードされる注釈セットを受信し、XMLスタイル・シートを使用してそれをRDF/XMLに変換します。タイプをインスタンス化する際に、mdsys.gatenlp_extractor実装で使用されるデフォルト・スタイル・シート(「GATEエクストラクタの出力で使用されるデフォルトのスタイル・シート」を参照)を、カスタム・スタイル・シートと置き換えることができます。

次の例では、カスタム・スタイル・シートを使用するエクストラクタ・ポリシーを作成して、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スタイル・シートは同等のRDF/XMLを生成するために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 セマンティク索引の変更

この項では、セマンティク索引での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'を指定して、名前付きグラフをベースにしたローカル推論(「名前付きグラフをベースにしたローカル推論(NGLI)」を参照)を使用します。

ドキュメント中心の推論を通じて作成された伴意をセマンティク索引の内容として含めるには、例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 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つの行が含まれます)。

表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つの行が含まれます)。

表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つの行が含まれます)。

表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エクストラクタ出力のデフォルトのスタイル・シート

この項では、mdsys.gatenlp_extractor実装が注釈セット(XMLでエンコード済)をRDF/XMLに変換するために使用するデフォルトのXMLスタイル・シートをリストします。(このエキストラクタの説明は、「General Architecture for Text Engineering (GATE)の使用」に記載されています。)

<?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データのOracle Label Security (OLS)によって、RDFモデルに格納された個々のトリプルに機密性ラベルを関連付けることができます。問合せごとに、それらのラベルとユーザーのセッション・ラベルを比較することで、特定のトリプルに対するアクセス権限が付与されます。また、特定のリソースを記述するすべてのトリプル、または特定の述語で定義されているすべてのトリプルの最小限の機密性ラベルを、それぞれリソースまたは述語に機密性ラベルを直接割り当てることで実施できます。

OLSの使用方法の詳細は、『Oracle Label Security管理者ガイド』を参照してください。

注意:

Oracle Databaseリリース12c (12.1)では、RDFセマンティク・グラフでの仮想プライベート・データベース(VPD)のサポートは、ファイングレイン・アクセス制御の提供に関しては非推奨となり、今後のメジャー・リリースでは削除されます。(この非推奨サポートについては、「RDFセマンティク・グラフでの仮想プライベート・データベースのサポート」を参照。)

VPDに依存する新しいRDFセマンティク・グラフ・アプリケーションは開発しないようにし、VPDに依存する既存のRDFセマンティク・グラフ・アプリケーションを、Oracle Label Security (OLS)を使用するように移行してください。

詳細は、My Oracle SupportのNote 1468273.1を参照してください

RDFデータのOracle Label Security (OLS)では、セマンティク・データを保護するために2つのオプションが提供されます。

- トリプルレベル・セキュリティ(「トリプルレベル・セキュリティ」を参照) (パフォーマンスと使いやすさの点から強くお薦めします)

- リソースレベル・セキュリティ(「リソースレベル・セキュリティ」を参照) (通常お薦めしません)

オプションを指定するには、SEM_RDFSA.APPLY_OLS_POLICYプロシージャを使用して、適切なrdfsa_optionsパラメータ値を指定します。

オプションを切り替えるには、SEM_RDFSA.REMOVE_OLS_POLICYプロシージャを使用して既存ポリシーを削除し、SEM_RDFSA.APPLY_OLS_POLICYプロシージャと適切なrdfsa_optionsパラメータ値を使用して新しいポリシーを適用します。

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

トリプルレベル・セキュリティ・オプションによって、Oracle Databaseによるラベル・セキュリティのネイティブ・サポートに加え、RDF固有の機能のThinレイヤーが提供されます。このオプションは、特にOLSを使用しながら推論を実行する場合、リソースレベル・セキュリティ(「リソースレベル・セキュリティ」を参照)より高いパフォーマンスを発揮し、容易に使用できます。主な違いは、トリプルレベル・セキュリティでは、個々のトリプル・リソース(主語、プロパティ、目的語)に明示的にも暗黙的にもラベルを割り当てる必要がないところにあります。

トリプルレベル・セキュリティを使用するには、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プロシージャを使用できます。(ここで述べたプロシージャについては、「SEM_OLSパッケージのサブプログラム」を参照してください。)

トリプルレベル・セキュリティでは、異なるラベルを持つ重複トリプルをセマンティク・モデルに挿入できます。(このような重複は、リソースレベル・セキュリティでは許可されません。)たとえば、次のように非常に機密性の高いラベルを持つトリプルがあるとします。

(<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.1.1 推論データとラダーベース推論(LBI)のファイングレイン・セキュリティ

トリプルレベル・セキュリティをOracle Databaseに格納されたRDFデータに対してオンにすると、表明されたファクトに、必須アクセス制御を実施するためのデータ・ラベルがタグ付けされます。また、ユーザーがSEM_APIS.CREATE_ENTAILMENTプロシージャを使用して前方向連鎖ベースの推論関数を起動すると、新しく推論された関係には現在の行ラベル(SA_UTL.NUMERIC_ROW_LABEL)がタグ付けされます。

これらの新しく推論される関係は、ユーザーがアクセスを許可されている情報のみに基づいて導出されます。ただし、これらの関係では同じデータ・ラベルが共有されます。このことは、SEM_APIS.CREATE_ENTAILMENTコールが、読取り操作、論理推論による計算および書込み操作の3つの手順で示されることからわかります。読取り操作では推論計算のベースとなる情報が収集されますが、これはアクセス権限、ユーザーのラベルおよびデータ・ラベルによって制限されます。論理的推論計算のステップは完全に数学的です。伴意グラフへの推論情報の最終的な書込みは、前の手順で計算されるいくつかの新しいファクトを表明している同じユーザーと同様に行われます。

ユーザーが単一のラベルのみを所有する場合は、すべての推論された表明に単一のラベルをタグ付けすることで十分です。ユーザーが複数のラベルを持つ場合には、1つのラベルのタグ付けでは不十分です。マルチテナント状態でセットアップを行った場合によく見られる状況です。

たとえば、ユーザー・ラベルとデータ・ラベルをTopSecretと設定したユーザーが、SEM_APIS.CREATE_ENTAILMENTをコールして、Secretという弱い方のラベルに切り替えてからSPARQL問合せを実行したと仮定します。すべての新しく推論された関係はTopSecretラベルにタグ付けされているため、この問合せを参照することはできません。ただし、ユーザーがTopSecretラベルに切り替えて戻した場合、すべての推論された関係が参照可能になります。推論された関係に関するかぎり、これは「すべてまたはゼロ」の処理です(つまり、すべて参照可能またはすべて参照不可です)。

指定ユーザーが複数のラベルを使用できる場合は、通常、異なる推論された関係に異なるラベルを割り当てます。この目的を実現する方法は2つあります。

- SEM_APIS.CREATE_ENTAILMENTの複数回の起動

- ラダーベース推論(LBI)の使用

この2つの方法のうち、ラダーベース推論(Oracle Database 12cリリース1 (12.1)で有効)の方がより単純で便利です。

SEM_APIS.CREATE_ENTAILMENTの複数回の起動

DEFENSEという名前のセキュリティ・ポリシー、SCOTTという名前のユーザー、およびSCOTTが所有する一連のユーザー・ラベルLabel1、Label2、...、Labelnがあるとします。SCOTTによる次のコールは、ラベルをLabel1として設定し、1回目の推論を実行して、新しく推論されたトリプルにLabel1をタグ付けします。

EXECUTE sa_utl.set_label('defense',char_to_label('defense','Label1'));
EXECUTE sa_utl.set_row_label('defense',char_to_label('defense','Label1'));
EXECUTE sem_apis.create_entailment('inf', sem_models('contracts'), sem_rulebases('owlprime'), SEM_APIS.REACH_CLOSURE, null,'');

ここで、SCOTTはラベルをLabel2に切り替え、2回目の推論を実行し、新しく推論されたトリプルにLabel2をタグ付けします。明らかに、Label1がLabel2よりも優位である場合、Label2はLabel1が参照可能な内容以外を参照することはできないため、新しいトリプルは推論されません。Label1がLabel2よりも優位ではない場合、推論プロセスの読取り手順では、異なるトリプル・セットを参照する可能性があるため、推論コールはいくつかの新しいトリプルを生成できます(それはLabel2がタグ付けされます)。

この例の目的上、1 <= i < j <= nという条件がtrueであること(LabeliがLabeljよりも優位ではないこと)を前提としています。

EXECUTE sa_utl.set_label('defense',char_to_label('defense','Label2'));
EXECUTE sa_utl.set_row_label('defense',char_to_label('defense','Label2'));
EXECUTE sem_apis.create_entailment('inf', sem_models('contracts'), sem_rulebases('owlprime'), SEM_APIS.REACH_CLOSURE, null, 'ENTAIL_ANYWAY=T');

SCOTTは、前のアクションを、Label1、Label2、...、Labelnというラベル順序の残りのラベルで続行します。最後の手順は次のとおりです。

EXECUTE sa_utl.set_label('defense',char_to_label('defense','Labeln'));
EXECUTE sa_utl.set_row_label('defense',char_to_label('defense','Labeln'));
EXECUTE sem_apis.create_entailment('inf', sem_models('contracts'), sem_rulebases('owlprime'), SEM_APIS.REACH_CLOSURE, null, 'ENTAIL_ANYWAY=T');

これらのすべてのアクションを実行すると、推論グラフは様々なラベルがタグ付けされたトリプルで構成される可能性があります。

ラダーベース推論(LBI)の使用

基本的に、1つのAPI内のラダーベース推論(LBI)ラップは、「SEM_APIS.CREATE_ENTAILMENTの複数回の実行」で説明されるすべてのアクションをコールします。視覚的に、これらのアクションは、はしごを登る様子と似ています。あるラベルから次のラベルに進むと、より多くの表明されたファクトが参照可能またはアクセス可能になるため(前のラベルすべてが新しいラベルよりも優位ではない場合)、新しい関係を推論できます。

次の例に、LBIを起動する構文を示します。

EXECUTE sem_apis.create_entailment('inf',
sem_models('contracts'),
sem_rulebases('owlprime'),
SEM_APIS.REACH_CLOSURE,
null,
null,
ols_ladder_inf_lbl_seq=>'numericLabel1 numericLabel2 numericLabel3 numericLabel4'
);

パラメータols_ladder_inf_lbl_seqでは、ラベル順序が指定されます。この順序は、数値ラベルのスペース区切りリストとして提供されます。LBIを使用する場合は、弱い方のラベルが強い方のラベルより前に配置されるように、ラベル順序を配置することをお薦めします。これは、推論されたグラフのサイズを減らすことになります。(ラベルが互いに優位ではない場合、それらはどのような順序でも指定できます。)

5.1.2 拡張例: セマンティク・データへのOLSトリプルレベル・セキュリティの適用

この項では、セマンティク・データにOLSトリプルレベル・セキュリティを適用する方法を説明する拡張例を示します。OLSが構成済で、有効であることが前提です。この例は非常に単純化されており、推奨のプラクティスで使用しているユーザー名およびパスワードをそのまま使用しないでください。

特に指定がないかぎり、この手順はSYSDBAとして接続中に実行します。

1. いくつかの必要な設定手順を実行します。

a. SYSDBAとして、A、BおよびCという名前のデータベース・ユーザーを作成します。

create user a identified by <password-for-a>;
grant connect, unlimited tablespace, resource to a;
create user b identified by <password-for-b>;
grant connect, unlimited tablespace, resource to b;
create user c identified by <password-for-c>;
grant connect, unlimited tablespace, resource to c;

b. SYSDBAとして、セキュリティ管理者を作成し、権限を付与します。

CREATE USER fgac_admin identified by <password-for-fgac_admin>;
GRANT connect, unlimited tablespace,resource to fgac_admin;
GRANT SELECT ON mdsys.rdf_link$ to fgac_admin;
GRANT EXECUTE ON sa_components TO fgac_admin;
GRANT EXECUTE ON sa_user_admin TO fgac_admin;
GRANT EXECUTE ON sa_label_admin TO fgac_admin;
GRANT EXECUTE ON sa_policy_admin TO fgac_admin;
GRANT EXECUTE ON sa_sysdba to fgac_admin;
GRANT EXECUTE ON TO_LBAC_DATA_LABEL to fgac_admin;
GRANT lbac_dba to fgac_admin;

c. セキュリティ管理者として接続し、defenseという名前のポリシーを作成します。

CONNECT fgac_admin/<password-for-fgac_admin>
EXECUTE SA_SYSDBA.CREATE_POLICY('defense','ctxt1');

d. 3つのセキュリティ・レベルを作成します(簡略化のため、コンパートメントおよびグループを省略しています)。

EXECUTE SA_COMPONENTS.CREATE_LEVEL('defense',3000,'TS','TOP SECRET');
EXECUTE SA_COMPONENTS.CREATE_LEVEL('defense',2000,'SE','SECRET');
EXECUTE SA_COMPONENTS.CREATE_LEVEL('defense',1000,'UN','UNCLASSIFIED');

e. 3つのラベルを作成します。

EXECUTE SA_LABEL_ADMIN.CREATE_LABEL('defense',1000,'UN');
EXECUTE SA_LABEL_ADMIN.CREATE_LABEL('defense',1500,'SE');
EXECUTE SA_LABEL_ADMIN.CREATE_LABEL('defense',3100,'TS');

f. ラベルおよび権限を割り当てます。

EXECUTE SA_USER_ADMIN.SET_USER_LABELS('defense','A','UN');
EXECUTE SA_USER_ADMIN.SET_USER_LABELS('defense','B','SE');
EXECUTE SA_USER_ADMIN.SET_USER_LABELS('defense','C','TS');
EXECUTE SA_USER_ADMIN.SET_USER_LABELS('defense','fgac_admin','TS');
EXECUTE SA_USER_ADMIN.SET_USER_PRIVS('defense','FGAC_ADMIN', 'full');

2. セマンティク・モデルを作成します。

a. モデルを作成し、他の何人かのユーザーとそれを共有します。

CONNECT a/<password-for-a>
CREATE TABLE project_tpl (triple sdo_rdf_triple_s) compress for oltp;
EXECUTE sem_apis.create_sem_model('project', 'project_tpl', 'triple');
GRANT select on mdsys.rdfm_project to B;
GRANT select on mdsys.rdfm_project to C;
GRANT select, insert, update, delete on project_tpl to B, C;

b. バルク・ロードAPIを実行できることを確認します。

GRANT insert on project_tpl to mdsys;

3. RDFのOLSポリシーを適用します。

CONNECT fgac_admin/fgac_admin
BEGIN
sem_rdfsa.apply_ols_policy('defense', sem_rdfsa.TRIPLE_LEVEL_ONLY);
END;
/

この時点で、アプリケーション表にCTXT1という名前の別の列があることに注目してください。

CONNECT a/<password-for-a>a
DESCRIBE project_tpl;
Name                                      Null?    Type
----------------------------------------- -------- --------------------------
TRIPLE                                             PUBLIC.SDO_RDF_TRIPLE_S
CTXT1                                              NUMBER(10)

4. データをセマンティク・モデルに追加します。

-- User A uses incremental APIs to add semantic data
connnect a/<password-for a)
INSERT INTO project_tpl(triple) values
(sdo_rdf_triple_s('project','<urn:A>','<urn:hasManager>','<urn:B>'));
INSERT INTO project_tpl(triple) values
(sdo_rdf_triple_s('project','<urn:B>','<urn:hasManager>','<urn:C>'));
INSERT INTO project_tpl(triple) values
(sdo_rdf_triple_s('project','<urn:A>','<urn:expenseReportAmount>','"100"'));
INSERT INTO project_tpl(triple) values
(sdo_rdf_triple_s('project','<urn:expenseReportAmount>','rdfs:subPropertyOf','<urn:projExp>'));
COMMIT;

-- User B uses bulk API to add semantic data
connect b/<password-for-b>
CREATE TABLE  project_stab(RDF$STC_GRAPH varchar2(4000),
RDF$STC_sub varchar2(4000),
RDF$STC_pred varchar2(4000),
RDF$STC_obj varchar2(4000)) compress;
GRANT select on project_stab to mdsys;

-- For simplicity, data types are omitted.
INSERT INTO project_stab values(null, '<urn:B>','<urn:expenseReportAmount>','"200"');
INSERT INTO project_stab values(null, '<urn:proj1>','<urn:deadline>','"2012-12-25"');
EXECUTE sem_apis.bulk_load_from_staging_table('project','b','project_stab');

-- As User B, check the contents in the application table
connect b/<password-for-b>
SELECT * from a.project_tpl order by ctxt1;

SDO_RDF_TRIPLE_S(8.5963E+18, 7, 1.4711E+18, 2.0676E+18, 8.5963E+18)    1000
SDO_RDF_TRIPLE_S(5.1676E+18, 7, 8.5963E+18, 2.0676E+18, 5.1676E+18)    1000
SDO_RDF_TRIPLE_S(2.3688E+18, 7, 1.4711E+18, 4.6588E+18, 2.3688E+18)    1000
SDO_RDF_TRIPLE_S(7.6823E+18, 7, 4.6588E+18, 1.1911E+18, 7.6823E+18)    1000
SDO_RDF_TRIPLE_S(6.6322E+18, 7, 8.5963E+18, 4.6588E+18, 6.6322E+18)    1500
SDO_RDF_TRIPLE_S(8.4800E+18, 7, 6.2294E+18, 5.4118E+18, 8.4800E+18)    1500

6 rows selected.
SELECT count(1) from mdsys.rdfm_project;
6

-- As User A, check the contents in the application table
-- As expected, A can only see 4 triples
SQL> conn a/<password>
SQL> select * from a.project_tpl order by ctxt1;
SDO_RDF_TRIPLE_S(8.5963E+18, 7, 1.4711E+18, 2.0676E+18, 8.5963E+18)    1000

SDO_RDF_TRIPLE_S(5.1676E+18, 7, 8.5963E+18, 2.0676E+18, 5.1676E+18)    1000

SDO_RDF_TRIPLE_S(2.3688E+18, 7, 1.4711E+18, 4.6588E+18, 2.3688E+18)    1000

SDO_RDF_TRIPLE_S(7.6823E+18, 7, 4.6588E+18, 1.1911E+18, 7.6823E+18)    1000

SQL> select count(1) from mdsys.rdfm_project;
4

-- User C uses incremental APIs to add semantic data including 2 quads
connect c/<password-for-c>
INSERT INTO a.project_tpl(triple) values
(sdo_rdf_triple_s('project','<urn:C>','<urn:expenseReportAmount>','"400"'));
INSERT INTO a.project_tpl(triple) values
(sdo_rdf_triple_s('project','<urn:proj1>','<urn:hasBudget>','"10000"'));
INSERT INTO a.project_tpl(triple) values
(sdo_rdf_triple_s('project:<urn:proj2>','<urn:proj2>','<urn:hasBudget>','"20000"'));
INSERT INTO a.project_tpl(triple) values
(sdo_rdf_triple_s('project:<urn:proj2>','<urn:proj2>','<urn:dependsOn>','<urn:proj1>'));
COMMIT;

5. デフォルト・ラベルを使用して、異なるユーザーとしてデータを問い合せます。

-- Now as user A, B, C, execute the following query
select lpad(nvl(g, ' '), 20) || ' ' || s || ' ' || p || ' ' || o from table(sem_match('{ graph ?g { ?s ?p ?o }}',
sem_models('project'),
null,
null,
null,
null,
'GRAPH_MATCH_UNNAMED=T'
))
order by g, s, p, o;

connect  a/<password-for-a>
-- Repeat the preceding query
SQL> /

urn:A urn:expenseReportAmount 100
urn:A urn:hasManager urn:B
urn:B urn:hasManager urn:C
urn:expenseReportAmount http://www.w3.org/2000/01/rdf-schema#subPropertyOf urn:projExp
SQL> connect  b/<password-for-b>
SQL> /

urn:A urn:expenseReportAmount 100
urn:A urn:hasManager urn:B
urn:B urn:expenseReportAmount 200
urn:B urn:hasManager urn:C
urn:expenseReportAmount http://www.w3.org/2000/01/rdf-schema#subPropertyOf urn:projExp
urn:proj1 urn:deadline 2012-12-25
SQL> connect  c/<password-for-c>
SQL> /

urn:proj2 urn:proj2 urn:dependsOn urn:proj1
urn:proj2 urn:proj2 urn:hasBudget 20000
urn:A urn:expenseReportAmount 100
urn:A urn:hasManager urn:B
urn:B urn:expenseReportAmount 200
urn:B urn:hasManager urn:C
urn:C urn:expenseReportAmount 400
urn:expenseReportAmount http://www.w3.org/2000/01/rdf-schema#subPropertyOf urn:projExp
urn:proj1 urn:deadline 2012-12-25
urn:proj1 urn:hasBudget 10000

予測どおりに、異なるユーザー(異なるラベルを持つ)はプロジェクトRDFグラフの異なるトリプル・セットを参照できます。

6. 異なるラベルを使用しているシングル・ユーザーとして、同じデータを問い合せます。
前の手順で使用した同じ問合せで、6つの一致が生成されます。

urn:A urn:expenseReportAmount 100
urn:A urn:hasManager urn:B
urn:B urn:expenseReportAmount 200
urn:B urn:hasManager urn:C
urn:expenseReportAmount http://www.w3.org/2000/01/rdf-schema#subPropertyOf urn:projExp
urn:proj1 urn:deadline 2012-12-25

6 rows selected.

ユーザーCが最も弱いラベル(unclassified)を選択した場合、ユーザーCが参照する内容はさらに少なくなります。

exec sa_utl.set_label('defense',char_to_label('defense','UN'));
exec sa_utl.set_row_label('defense',char_to_label('defense','UN'));

前の手順で使用した同じ問合せで、4つの一致が生成されます。

urn:A urn:expenseReportAmount 100
urn:A urn:hasManager urn:B
urn:B urn:hasManager urn:C
urn:expenseReportAmount http://www.w3.org/2000/01/rdf-schema#subPropertyOf urn:projExp

ユーザーCが、Secretよりも優位であるデータ・ラベルの付いたトリプル/クワッドに対してのみ問合せを実行した場合:

-- First set the label back
exec sa_utl.set_label('defense',char_to_label('defense','TS')); exec sa_utl.set_row_label('defense',char_to_label('defense','TS'));
select lpad(nvl(g, ' '), 20) || ' ' || s || ' ' || p || ' ' || o
from table(sem_match('{ graph ?g { ?s ?p ?o }}',
sem_models('project'),
null,
null,
null,
null,
'MIN_LABEL=SE POLICY_NAME=DEFENSE GRAPH_MATCH_UNNAMED=T'
))
order by g, s, p, o;

この問合せレスポンスでは、ユーザーAによって行われた表明が除外されます。

urn:proj2 urn:proj2 urn:dependsOn urn:proj1
urn:proj2 urn:proj2 urn:hasBudget 20000
urn:B urn:expenseReportAmount 200
urn:C urn:expenseReportAmount 400
urn:proj1 urn:deadline 2012-12-25
urn:proj1 urn:hasBudget 10000

6 rows selected.

同じ問合せをユーザーAとして実行できます。ただし、予測どおり、一致は戻されません。

OLSがRDFに対して有効な場合は、セマンティク・データを削除できます。次の例では、SEM_RDFSA.APPLY_OLS_POLICYが正常に実行されること、および前の例と同じユーザー設定およびラベル設計が使用されることを前提とします。

-- First, create a test model as user A and grant access to users B and C
connect a/<password-for-a>

create table test_tpl (triple sdo_rdf_triple_s) compress for oltp;
grant select on mdsys.rdfm_test to B,C;
grant select, insert, update, delete on test_tpl to B, C;

-- The following will fail with an error message
-- "Error while creating triggers: If OLS
-- is enabled,  you have to apply table policy
-- before creating an OLS-enabled model"
--
EXECUTE sem_apis.create_sem_model('test', 'test_tpl', 'triple');

-- You need to run this API first

connect fgac_admin/<password-for-fgac_admin>

EXECUTE sem_ols.apply_policy_to_app_tab('defense', 'A', 'TEST_TPL');

-- Now model creation (after OLS policy has been applied) can go through
connect a/<password-for-a>
EXECUTE sem_apis.create_sem_model('test', 'test_tpl', 'triple');

-- Add a triple as User A
INSERT INTO test_tpl(triple) values
(sdo_rdf_triple_s('test','<urn:A>','<urn:p>','<urn:B>'));
COMMIT;

-- Add the same triple as User B
connect b/<password-for-b>
INSERT INTO a.test_tpl(triple) values
(sdo_rdf_triple_s('test','<urn:A>','<urn:p>','<urn:B>'));
COMMIT;

-- Now User B can see both triples in the application table as well as the model view
set numwidth 20
SELECT * from a.test_tpl;

SDO_RDF_TRIPLE_S(8596269297967065604, 19, 1471072612573670395, 28121856352072361
78, 8596269297967065604)
1000

SDO_RDF_TRIPLE_S(8596269297967065604, 19, 1471072612573670395, 28121856352072361
78, 8596269297967065604)
1500

SELECT count(1) from mdsys.rdfm_test;
2

-- User A can only see one triple due to A's label assignment, as expected.

SELECT * from a.test_tpl;

SDO_RDF_TRIPLE_S(8596269297967065604, 19, 1471072612573670395, 28121856352072361
78, 8596269297967065604)
1000

SELECT count(1) from mdsys.rdfm_test;
1

-- User A issues a delete to remove A's assertions
SQL> delete from a.test_tpl;
1 row deleted.

COMMIT;
Commit complete.

-- Now user A has no assertions left.

SELECT * from a.test_tpl;
no rows selected

SELECT count(1) from mdsys.rdfm_test;
0

-- Note that the preceding delete does not affect the same assertion made by B.
connect b/<password-for-b>
SELECT * from a.test_tpl;

SDO_RDF_TRIPLE_S(8596269297967065604, 19, 1471072612573670395, 28121856352072361
78, 8596269297967065604)
1500

SELECT count(1) from mdsys.rdfm_test;
1

-- User B can remove this assertion using a DELETE statement.
-- The following DELETE statement uses the oracle_orardf_res2vid function
-- to narrow down the scope to triples with a particular subject.
DELETE FROM a.test_tpl app_tab
where app_tab.triple.rdf_s_id =
sdo_sem_inference.oracle_orardf_res2vid('<urn:A>');

1 row deleted.

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

注意:

通常、リソースレベル・セキュリティではなくトリプルレベル・セキュリティを使用することをお薦めします。トリプルレベル・セキュリティについては、「トリプルレベル・セキュリティ」を参照してください。

リソースレベル・セキュリティ・オプションによって、表の行にセキュリティ・レベルを定義する1つ以上のセキュリティ・ラベルを割り当てることができます。概念上、リレーショナル・データ・モデルの表は、同等のRDFグラフにマップできます。具体的には、リレーショナル表の行を、それぞれが特定の主語に関するファクトを表明するトリプルのセットにマップできます。このシナリオでは、主語は行の主キーを表し、行のキー以外の列と値の各組合せは、対応するトリプルの述語と目的語の値の組合せにマップされます。

リレーショナル・データ・モデルの行は、そのキーによって識別され、OLSは、行レベルのアクセス制御メカニズムとして、キーに関連付けられた値に対するアクセスを効果的に制限します。リレーショナル・データ・モデルとRDFデータ・モデル間のこの概念的なマッピングでは、リレーショナル表の行に対するアクセスを制限することは、特定の主語を含むサブグラフに対するアクセスを制限することと同等です。各トリプルの機密性ラベルをサポートするモデルでは、特定の主語を含むすべてのトリプルに同じラベルを適用することでこれが実施されます。ただし、個々のトリプルが異なるラベルを保持できるようにすることで、すべてのラベルの最小境界を維持しながら、柔軟性を大幅に向上することもできます。

RDFデータに対するOLSサポートではマルチレベル方式が採用されており、トリプル・コンポーネント(主語、述語、目的語)に関連付けられる機密性ラベルが、トリプルの機密性ラベルの最小境界を集合的に形成しています。この方法では、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リポジトリに適用する場合は、データベース・インスタンス内で保護する特定のリソース位置を選択できます。以降の別の項で説明するように、主語、目的語、述語またはその任意の組合せを保護できます。次の例では、RDFリポジトリにdefenseという名前のOLSポリシーを適用して、機密性ラベルと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.1 RDFの主語の保護

RDFリソース(通常はURI)は、表明がリソースに関して行われる場合、トリプルの主語の位置に出現します。この場合、リソースに関連付けられた機密性ラベルには、次の特性があります。

- ラベルは、リソースを主語として使用するトリプルの最小限の機密性ラベルを表します。つまり、トリプルの機密性ラベルは、主語のラベルに優先するか、それを網羅する必要があります。

- 新しく追加されたトリプルのラベルは、ユーザーの初期行ラベルに初期化されるか、ラベル・ファンクションを使用して生成されます(ラベルを指定した場合)。この操作は、トリプルのラベルが、トリプルの主語に関連付けられたラベルより優先される場合にのみ成功します。

- トリプルを読み取ることができるのは、主語のラベルとトリプルのラベルに優先するアクセス・ラベルを持つユーザーのみです。

デフォルトでは、主語の機密性ラベルは、最初にRDFリソースがトリプルの主語の位置で使用されるときにユーザー環境から導出されます。この場合、デフォルトの機密性ラベルは、ユーザーの初期行ラベルに設定されます(ユーザーによって挿入されるすべての行に割り当てられるデフォルト)。

ただし、トリプルで使用される前でも、RDFリソースを主語として分類し、それに機密性ラベルを割り当てることができます。次の例は、projectHLSリソースにSECRET:HLS:USという名前の機密性ラベルを割り当てることによって、このリソースについて新しいトリプルを定義できるユーザー、およびこのリソースを主語として持つ既存のトリプルにアクセスできるユーザーを制限します。

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 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.3 RDFの目的語の保護

RDFトリプルは、その目的語の位置にURIまたはリテラルを持つことができます。トリプルの目的語の位置にあるURIは、リソースを表します。目的語の位置にあるリソースは、それに機密性ラベルを関連付けることで、トリプルの目的語としてリソースを使用する機能を制限するように保護できます。

通常、トリプルの目的語の位置に出現するリソース(URIまたは非リテラル)は、それ自体、追加のRDF文を使用して記述できます。実際、目的語の位置にあるRDFリソースは、他のトリプルの主語の位置に出現することがあります。RDFリソースが明示的な機密性ラベルを使用せずに目的語の位置で保護される場合、主語の位置にある同じリソースに関連付けられたラベルは、目的語のデフォルト・ラベルとして使用されます。

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

RDFデータ・モデルでは、宣言ルールの指定が可能で、明示的にリポジトリに追加されていないRDF文の存在を推論できます。次に、単純な宣言ルールを示します(これらのルールは、プロジェクトは部門によって所有可能で、部門には部長が存在し、その場合プロジェクト・リーダーはデフォルトでプロジェクトを所有する部門の部長になるというロジックに関連付けられています)。

RuleID -> projectLedBy
Antecedent Expression -> (?proj :ownedBy ?dept) (?dept :hasVP ?person)
Consequent Expression -> (?proj :isLedBy ?person)

RDFルールは、明示的に表明されたトリプルと、前に推論されたトリプルを前件として使用し、1つ以上の結果トリプルを推論します。通常、推論プロセスは、オフライン操作として実行され、すべての推論されたトリプルが事前生成されて、後続の問合せ操作で使用できるようになります。

基礎となるRDFグラフがOLSを使用して保護される場合、権限のないユーザーにデータを公開することを避けるため、グラフから推論された追加データも保護する必要があります。また、推論プロセスは、完全性を保証するため、より高い権限(特にデータに対する完全なアクセス権限)で実行する必要があります。

RDFデータに対するOLSサポートでは、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つ以上の前件トリプルを持つことができます。前件ラベルの使用の技術では、すべての前件トリプルのラベルが考慮され、新しいトリプルに最も適したラベルを決定するために、競合解決基準が実装されます。推論されたトリプルは、他の推論されたトリプルに依存することがあるため、すべての推論されたトリプルのラベルの生成中は厳密な順序に従います。
前件ラベルの使用の技術では、カスタム・ラベル・ジェネレータを使用する必要があります。カスタム・ラベル・ジェネレータの作成および使用の詳細は、「アプリケーション・ロジックに基づくラベルの使用」を参照してください。

次の例では、特定のルールベースを使用して契約データの伴意(ルール索引)を作成します。この操作は、RDFリポジトリに適用されるOLSポリシーに関して完全なアクセス権限を持つユーザーのみが実行できます。この場合は、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;

生成されたラベルを通じてアクセスされる推論されたトリプルは、ユーザー・アクセス可能なトリプルおよびルールから直接推論される概念上のトリプルとは異なることがあります。システム定義の実装またはカスタム実装を使用して生成されるラベルの正確性は、保証されません。詳細は、「SEM_APISパッケージのサブプログラム」にあるSEM_APIS.CREATE_ENTAILMENTプロシージャの「使用方法」で、「ファイングレイン・アクセス制御(OLSおよびVPD)に関する考慮事項」を参照してください。

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

MDSYS.RDFSA_LABELGENタイプは索引作成時に適切なラベル・ジェネレータ・ロジックを適用するために使用しますが、このタイプを拡張して、カスタム・ラベル・ジェネレータを実装してアプリケーション・ロジックに基づいたラベルを生成することもできます。ラベル・ジェネレータは、SEM_APIS.CREATE_ENTAILMENTプロシージャのlabel_genパラメータで指定します。システム定義のラベル・ジェネレータを使用するには、「推論されたトリプルのラベルの生成」で説明したようにSEM_RDFSAパッケージ定数を指定します。カスタム・ラベル・ジェネレータを使用するには、カスタム・ラベル・ジェネレータ・タイプを実装して、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);

例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;
/

ラベル・ジェネレータ・コンストラクタは、SEM_RDFSAパッケージに定義されている定数のセットを使用して、ラベル・ジェネレータが依存しているリソースのリストを示します。依存リソースは、推論されたトリプルの主語、述語、目的語、トリプルを生成したルール、およびその前件として識別されます。カスタム・ラベル・ジェネレータは、ラベルを生成するためにこれらのリソースの任意のサブセットに依存することが可能で、SEM_RDFSAパッケージに定義されている定数(USE_SUBJECT_LABEL、USE_PREDICATE_LABEL、USE_OBJECT_LABEL、USE_RULE_LABEL、USE_ANTCED_LABEL)を使用してそのコンストラクタにこれを指定できます。次の例では、タイプ本体を作成し、コンストラクタを指定しています。

例5-1では、タイプ本体を作成し、コンストラクタ関数およびgetNumericLabelメンバー関数を指定しています。(アプリケーション固有のロジックはこの例に含まれていません。)

例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.6 RDFOLS_SECURE_RESOURCEビュー

MDSYS.RDFOLS_SECURE_RESOURCEビューには、Oracle Label Security (OLS)ポリシーで保護されたリソースと、それらのリソースに関連付けられた機密性ラベルに関する情報が含まれます。

このビューに対するSELECT権限を適切なユーザーに付与できます。特定のモデルに関連付けられたリソースを表示するには、そのモデル(または対応するRDFM_model-nameビュー)に対するSELECT権限も持っている必要があります。

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

表5-1 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リリース12c (12.1)では、RDFセマンティク・グラフでのWorkspace Managerのサポートが非推奨になり、今後のメジャー・リリースでは削除されます。

バージョン対応モデルに依存する新しいRDFセマンティク・グラフ・アプリケーションは開発しないようにし、Workspace Managerに依存する既存のRDFセマンティク・グラフ・アプリケーションを、代替手段を使用するように移行してください。

セマンティク・データでのWorkspace Managerの使用に対する具体的な代替手段は、アプリケーションの用途に応じて異なります。ユースケースおよび推奨される代替手段の詳細は、My Oracle SupportのNote 1468273.1を参照してください

Oracle Databaseセマンティク・データ・ストアに格納されているRDFデータは、Oracle Database Workspace Managerを使用してバージョン対応にできます。Workspace Managerを使用すると、データ変更操作によって新しいバージョンのRDFデータを作成する一方で、古いデータのコピーを保持できます。Workspace Managerの使用方法およびリファレンス情報については、『Oracle Database Workspace Manager開発者ガイド』を参照してください。

セマンティク・データ・ストアのバージョニングの単位はモデルで、ユーザー・スキーマに存在するアプリケーション表に順番に関連付けられます。バージョン対応RDFモデルを管理するには、従来のWorkspace Managerインタフェースが使用されます。(ただし、仮想モデルに参加するモデルではバージョン対応を使用できません。仮想モデルの詳細は、「仮想モデル」を参照してください。)

データベースに最初のバージョン対応RDFモデルを作成すると、すべてのRDFモデルのデータが保持される基礎となるトリプル・ストアで索引が再作成されます。したがって、最初のバージョン対応RDFモデルを作成するために必要な時間は、これらのモデルの既存のデータ量に応じて異なります。

この章では、バージョン対応RDFモデルの主な特性について説明し、例をいくつか示します。この章の内容は次のとおりです。

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

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

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

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

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

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

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

RDFデータに対するWorkspace Managerサポートは、デフォルトではデータベースにインストールされません。データベースでRDFセマンティク・グラフ・サポートを有効にした後に(「RDFセマンティク・グラフ・サポートの有効化」を参照)、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セマンティク・グラフ・サポートをダウングレードまたは削除するには、その前にRDFデータに対するWorkspace Managerサポートを削除する必要があります。(RDFセマンティク・グラフ・サポートのダウングレードおよび削除の詳細は、「RDFセマンティク・グラフ・サポートの有効化、ダウングレード、または削除」を参照してください。)

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スクリプトが正常に完了したら、データベースでRDFセマンティク・グラフ・サポートをダウングレードまたは削除できます。

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データに関わる優良事例については、「バージョン対応RDFモデルでのワークスペースのマージおよびリフレッシュ」を参照してください)

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セマンティク・グラフ機能は、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

バージョン対応のRDFモデルは、CDB (マルチテナント・コンテナ・データベース)環境では使用できません。

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/<password>

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/<password>
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 RDF Semantic Graph support for Apache Jena

注意:

この機能は、以前はJena Adapter for Oracle DatabaseまたはJena Adapterと呼ばれていました。

RDF Semantic Graph support for Apache Jena(以降、support for Apache Jenaとも記載)は、既知のJenaグラフ、JenaモデルおよびJena DatasetGraphのAPIを実装することによって、Oracle Spatial and Graph RDF Semantic GraphへのJavaベースのインタフェースを提供します。(Apache Jenaはオープン・ソース・フレームワークです。ライセンスと著作権条件は、http://www.apache.org/licenses/とhttp://www.apache.org/licenses/LICENSE-2.0を参照してください。 )

名前付きグラフ・データ(クワッドとも呼ぶ)の管理には、DatasetGraph APIを使用します。また、RDF Semantic Graph support for Apache JenaをOracle Spatial and Graphのネットワークデータ・モデル・グラフ機能と統合することで、セマンティク・データでのネットワーク解析機能を利用できます。

「RDFセマンティク・グラフの概要」と「OWLの概要」で説明されている主要な概念について十分に理解していることが前提です。Jena Javaフレームワークの性能全体についても十分に理解していることを前提とします。Jenaフレームワークの使用方法の詳細は、http://jena.apache.org/を参照してください。ネットワーク分析関数を使用するには、『Oracle Spatial and Graphトポロジ・データ・モデルおよびネットワーク・データ・モデル・グラフ開発者ガイド』に説明されている、ネットワーク・データ・モデルのグラフ機能についても理解しておく必要があります。

support for Apache Jenaは、Oracle Database RDF/OWLのセマンティク・データ管理機能を拡張します。

この章には次の主要なトピックがあります。

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

- SPARQLサービスの設定

- RDFセマンティク・グラフ環境の設定

- SEM_MATCHおよびRDF Semantic Graph support for Apache Jenaの問合せの比較

- SEM_MATCHまたはSQLベースの問合せ結果からのユーザーフレンドリJavaオブジェクトの取得

- SPARQL問合せ処理の最適化

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

- RDF Semantic Graph support for Apache JenaによりSPARQL問合せでサポートされるファンクション

- SPARQLの更新のサポート

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

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

- 「RDF Semantic Graph support for Apache Jenaを使用したバルク・ロード」

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

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

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

- RDF Semantic Graph support for Apache Jenaを使用する問合せ例

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

- Apache TomcatまたはJBossにおけるJosekiのデプロイ

注意:

RDF Semantic Graph support for Apache Jenaの現在のリリースは、Apache Jena 2.11.1およびJoseki 3.4.4に対してテストされています。オープンソース・プロジェクトの性質上、これよりも新しいバージョンのJenaまたはJosekiでは、このsupport for Apache Jenaを使用しないでください。

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

Support for Apache Jenaを使用するには、システム環境に必要なソフトウェア(Oracle Database 11gリリース2以上に加えて、Spatial、GraphおよびPartitioningのオプション、RDFセマンティク・グラフのサポート、Apache Jena 2.11.1およびJDK 1.6以上など)があることを、最初に確認しておく必要があります。次の手順を実行することによって、ソフトウェア環境を設定できます。

1. Oracle Database Enterprise Editionと、Oracle Spatial and GraphオプションおよびOracle Partitioningオプションをインストールします。

2. Oracle Databaseリリース11.2.0.3以上をまだインストールしていない場合は、Oracle Database Serverの11.2.0.2パッチ・セット(https://updates.oracle.com/Orion/PatchDetails/process_form?patch_num=10098816)をインストールします。

3. 「RDFセマンティク・グラフ・サポートの有効化」の説明のとおり、RDFセマンティク・グラフのサポートを有効にします。

4. RDF Semantic Graph support for Apache JenaをMy Oracle Support (http://support.oracle.com/)からダウンロードします。ナレッジ・ベースでバグ識別子17241927を検索します。
RDF Semantic Graph support for Apache Jenaの完全な評価版は、http://www.oracle.com/technetwork/database-options/spatialandgraph/のOTNからダウンロードできます。「Downloads」タブをクリックし、Licensed Softwareの下の「RDF Semantic Graph Licensed Software」をクリックします。

5. キットを/tmp/jena_adapter(Linuxシステム)などの一時ディレクトリに解凍します。(この一時ディレクトリがまだ作成されていない場合は、解凍操作の前に作成します。)
RDF Semantic Graph Support for Apache Jenaには、最上位に次のようなディレクトリがあります。

|-- META-INF
|-- examples
|-- jar
|-- javadoc
|-- joseki
|-- joseki_web_app
|-- protege_plugin
|-- sparqlgateway
|-- sparqlgateway_web_app
|-- fuseki
|-- web

6. JDK 1.6以上がインストールされていない場合は、インストールします。

7. JAVA_HOME環境変数にJDK 1.6以上がインストールが指定されていない場合は、適切に定義します。次に例を示します。

setenv JAVA_HOME /usr/local/packages/jdk16/

8. SPARQLプロトコルをサポートするためのSPARQLサービスが設定されていない場合は、「SPARQLサービスの設定」の説明のとおりに設定します。

ソフトウェア環境を設定した後、「RDFセマンティク・グラフ環境の設定」の説明にあるとおり、RDFセマンティク・グラフ環境でsupport for Apache Jenaを使用して問合せを実行できることを確認します。

7.1.1 以前のバージョンのsupport for Apache Jenaを使用していた場合

前のバージョンのsupport for Apache Jenaを使用していた場合は、次に示す、このバージョンでの重要な変更点に注意してください。

- com.hp.hpl.jena.sparql.core.DataSourceImplは、com.hp.hpl.jena.sparql.core.DatasetImplに置換されます。
Javaソース・コードにimport com.hp.hpl.jena.sparql.core.DataSourceImplがある場合は、import com.hp.hpl.jena.sparql.core.DatasetImplに更新する必要があります。

Javaソース・コードにDataSourceImpl.wrapがある場合は、DatasetImpl.wrap"に更新する必要があります。

- joseki-config.ttlは、joseki.warのWEB-INF/classesディレクトリ下に移動されています。この設定ファイルは、これまでjoseki.warのトップレベル・ディレクトリ下に置かれていました。次の例に新しい配置を示します。

% /usr/local/packages/jdk16/bin/jar tf joseki.war
application.xml
index.html
joseki-config-ttl_now_under_WEB-INF_classes
META-INF/
META-INF/MANIFEST.MF
ojdbc6.jar
StyleSheets/
StyleSheets/joseki.css
update.html
WEB-INF/
WEB-INF/lib/
WEB-INF/lib/sdordfclient.jar
WEB-INF/lib/jena-arq-2.11.1.jar
WEB-INF/lib/log4j-1.2.16.jar
WEB-INF/lib/jcl-over-slf4j-1.6.4.jar
WEB-INF/lib/httpclient-4.2.3.jar
WEB-INF/lib/commons-codec-1.6.jar
WEB-INF/lib/slf4j-log4j12-1.6.4.jar
WEB-INF/lib/servlet-api-2.5-20081211.jar
WEB-INF/lib/xercesImpl-2.11.0.jar
WEB-INF/lib/slf4j-api-1.6.4.jar
WEB-INF/lib/jena-tdb-1.0.1.jar
WEB-INF/lib/jena-core-2.11.1.jar
WEB-INF/lib/httpcore-4.2.2.jar
WEB-INF/lib/joseki-3.4.4.oracle_build_jena211.jar
WEB-INF/lib/jena-iri-1.0.1.jar
WEB-INF/lib/sdordf.jar
WEB-INF/lib/xml-apis-1.4.01.jar
WEB-INF/web.xml
WEB-INF/classes/
WEB-INF/classes/joseki-config.ttl
xml-to-html.xsl

7.2 SPARQLサービスの設定

この項では、joseki.warファイルをWebLogic Serverにデプロイすることにより、SPARQL Webサービス・エンドポイントを設定する方法について説明します。

注意:

WebLogic ServerのかわりにApache TomcatまたはJBossにJosekiをデプロイする場合は、「Apache TomcatまたはJBossにおけるJosekiのデプロイ」を参照してください。

1. Oracle WebLogic Server 11g以上をダウンロードしてインストールします。

2. Joseki 3.4.4に必要であるため、Java 6以上をインストールしておきます。

3. WebLogic Server管理コンソールを使用し、OracleSemDSという名前のJ2EEデータ・ソースを作成します。データ・ソースの作成中に、SPARQL問合せの実行対象になる関連セマンティク・データを含むデータベース・スキーマのユーザーとパスワードを指定できます。
このデータ・ソースの作成に関する情報は、「WebLogic Serverを使用した必要なデータ・ソースの作成」を参照してください。

4. 次のとおり、WebLogic Serverのautodeployディレクトリに移動し、ファイルをコピーします。(開発ドメインでのアプリケーションの自動デプロイに関する詳細は、http://docs.oracle.com/cd/E24329_01/web.1211/e24443/autodeploy.htmを参照してください。)

cd <domain_name>/autodeploy
cp -rf  /tmp/jena_adapter/joseki_web_app/joseki.war  <domain_name>/autodeploy

前述の例で、<domain_name>はWebLogic Serverドメインの名前です。

WebLogic Serverドメインを2つの異なるモード(開発とプロダクション)で実行することはできますが、自動デプロイメント機能を使用できるのは開発モードのみであることに注意してください。

5. Webブラウザを使用し、URLに書式http://< hostname>:7001/josekiで接続して(Webアプリケーションはポート7001でデプロイされているとします)、デプロイメントを確認します。
「Oracle SPARQL Service Endpoint using Joseki」というタイトルのページが表示され、最初のテキスト・ボックスにSPARQLの問合せ例が入力されています。

6. 「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問合せを入力して、「問合せの発行」をクリックします。

SELECT ?g ?s ?p ?o
WHERE
{ GRAPH ?g { ?s ?p ?o} }

結果は、4つの列と2つの結果バインディング・セットがあるHTML表になります。

http://<hostname>:7001/josekiページにもJSON出力オプションがあります。このオプションを選択する(使用可能にする)と、SPARQL問合せのレスポンスがJSON形式に変換されます。

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

WebLogic Server管理コンソールを使用して必要なJ2EEデータ・ソースを作成するには、次の手順に従います。

1. http://<hostname>:7001/consoleにログインします。

2. 「ドメイン構造」パネルで、「サービス」をクリックします。

3. 「JDBC」をクリックします。

4. 「データ・ソース」をクリックします。

5. 「JDBCデータ・ソースのサマリー」パネルで、「データ・ソース」表の下の「新規」をクリックします。

6. 「新しいJDBCデータ・ソースの作成」パネルで、次の値を入力または選択します。

名前: OracleSemDSOracleSemDS

JNDI名: OracleSemDS

データベース・タイプ: Oracle

データベース・ドライバ: Oracleのドライバ(Thin)・バージョン: 9.0.1,9.2.0,10,11

7. 「次へ」を2回クリックします。

8. 「接続プロパティ」パネルで、「データベース名」、「ホスト名」、「ポート」、「データベース・ユーザー名」(セマンティク・データを含むスキーマ)、「パスワード」のフィールドに適切な値を入力します。

9. 「次へ」をクリックします。

10. このOracleSemDSデータソースをデプロイするターゲット・サーバーまたはサーバーを選択します。

11. 「終了」をクリックします。

すべての変更がアクティブ化されており、再起動は必要ないというメッセージが表示されます。

7.2.2 JosekiベースSPARQLサービスの構成

デフォルトでは、SPARQLサービスのエンドポイントは、プリセット名を持つセマンティク・モデルに対して問合せが実行されることが前提になっています。このセマンティック・モデルは、デフォルトのJNDI名OracleSemDSとしてJ2EEデータソースで指定されているスキーマに所有されています。このモデルはPL/SQLやJavaを使用して明示的に作成する必要はないことに注意してください(モデルがネットワークに存在しない場合は、必要なアプリケーション表や索引とあわせて自動的に作成されます)。

注意:

2011年11月のsupport for Apache Jenaリリースから、アプリケーション表索引(<model_name>_idx)定義が、名前付きグラフ・データ(クワッド)に対応するように変更されました。

以前のバージョンのsupport for Apache Jenaで作成された既存のモデルについては、oracle.spatial.rdf.client.jenaパッケージのstatic OracleUtils.migrateApplicationTableIndex(oracle, graph, dop)メソッドを使用して、アプリケーション表索引の名前と定義を移行できます。(詳細は、Javadocを参照してください。)新しい索引定義は、アプリケーション表に対するDML操作のパフォーマンスにとって非常に重要です。

デフォルトのJNDI名を変更するか、デフォルトのセマンティック・モデルを使用するには、ビルトイン・アプリケーションjoseki_web_app/joseki.warのWEB-INF/classes ディレクトリ下に埋め込まれているjoseki-config.ttl設定ファイルを編集して、SPARQLサービスを構成する方法があります。(前のバージョンのsupport for Apache Jenaを使用していた場合は、joseki-config.ttlは、Webアプリケーションのトップレベル・ディレクトリ下ではなく、WEB-INF/classesディレクトリ下に置かれていることに注意してください。)

提供される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:dataSourceName "OracleSemDS"
];
oracle:defaultModel [ oracle:firstModel "TEST_MODEL" ] .

ファイルのこのセクションでは、次のことができます。

- joseki:poolSize値の変更。この値は、このOracleデータセット(<#oracle> rdf:type oracle:Dataset;)に許可される同時接続数を指定し、データベース内の様々なRDFモデルをポイントします。

- データ・ソース名をカスタマイズします。アプリケーション要件に応じて、OracleSemDSのデフォルト名を変更できます。ただし、その名前は、「WebLogic Serverを使用した必要なデータソースの作成」で指定したデータ・ソース名と一致する必要があります。

- defaultModelの名前(またはoracle:firstModel述語のオブジェクト値)の変更。これは、問合せに対して異なるセマンティク・モデルを使用するためのものです。このdefaultModelに対して複数のモデルを指定することも、1つまたは複数のルールベースを指定することもできます。
たとえば、次のように2つのモデル(ABOXとTBOXという名前)と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:dataSourceName "OracleSemDS"
];
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"
] .

詳細は、「仮想モデルのサポート」を参照してください。

- 次の、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 クライアント識別子

support for Apache Jenaによって作成または使用されたデータベース接続ごとに、クライアント識別子が関連付けられます。クライアント識別子は、特に、Real Application Cluster (Oracle RAC)環境で、パフォーマンス分析とチューニングを実行しているときに、他のデータベース・アクティビティからRDF Semantic Graph support for Apache Jena関連のアクティビティを特定するために有用です。

デフォルトで割り当てられるクライアント識別子は、JenaAdapterです。ただし、次の形式を使用してJava VM clientIdentifierプロパティを設定することによって、異なる値を指定できます。

-Doracle.spatial.rdf.client.jena.clientIdentifier=<identificationString>

データベース側でRDF Semantic Graph support for Apache Jena関連のアクティビティのみのトレースを開始するには、DBMS_MONITOR.CLIENT_ID_TRACE_ENABLEプロシージャを使用します。次に例を示します。

SQL> EXECUTE DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE('JenaAdapter', true, true);

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

デフォルトでは、RDF Semantic Graph support for Apache Jenaは、次の構文に従った基本的な表圧縮を使用して、アプリケーション表と任意のステージング表(後者は「 RDF Semantic Graph support for Apache Jenaを使用したバルク・ロード」で説明されているようにバルク・ロードに使用される)を作成します。

CREATE TABLE .... (... column definitions ...) ... compress;

ただし、データベースにOracle Advanced Compressionオプションの使用がライセンスされている場合は、次のJVMプロパティを設定してOLTP圧縮をオンにできますので、これによって基礎となるアプリケーション表とステージング表に対するすべてのDML操作時にデータが圧縮されます。

-Doracle.spatial.rdf.client.jena.advancedCompression="compress for oltp"

7.2.3 FusekiベースSPARQLサービスの構成

このトピックでは、Oracle Databaseに接続するFusekiベースのSPARQLサービスを構成して設定する方法を簡単に示します。

FusekiベースSPARQLサービスの概念と使用法は、JosekiベースSPARQLサービスの場合と同様です。「JosekiベースSPARQLサービスの構成」の説明を参照してください。同様に、そこで述べられているクライアント識別子およびOLTP圧縮に関する情報も、FusekiベースのSPARQLサービスにあてはまります。また、defaultModelおよびallGraphsの方法も同じです。

Fusekiベースのサービスに対するoracleサービスの例が、config-oracle.ttlファイルに含まれています。詳細は、『Fuseki: HTTPでのRDFデータの提供』(http://jena.apache.org/documentation/serving_data/)を参照してください。

Oracle Databaseに接続するFusekiベースSPARQLサービスを開始するには、以下のコマンドを入力します。

cd fuseki/
% ./fuseki-server  --config config-oracle.ttl

Fusekiの実行中は、形式http://your-hostname:3030/のURLへ移動して、そのステータスを確認することができます。

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

一部のアプリケーションでは長時間にわたるSPARQL問合せを終了できるようにする必要があるため、RDF Semantic Graph support for Apache Jenaと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.5 非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 RDFセマンティク・グラフ環境の設定

support for Apache Jenaを使用して問合せを実行するには、(適切な権限を持つ)任意のユーザーで接続し、セマンティク・ネットワークで任意のモデルを使用します。RDFセマンティク・グラフ環境が要件をすでに満たしている場合は、support for Apache Jenaを使用するJavaコードを直接コンパイルして実行することができます。support for Apache Jenaを使用できるようにRDFセマンティク・グラフ環境を設定していない場合は、次の例のような手順を実行します。

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. (セマンティク・ネットワークとsupport for Apache Jenaを使用するデータベースに接続するための)データベース・ユーザーを作成します。たとえば、次のようにします。

CREATE USER rdfusr IDENTIFIED BY <password-for-udfusr>
DEFAULT TABLESPACE rdf_users;

5. このデータベース・ユーザーに必要な権限を付与します。たとえば、次のようにします。

GRANT connect, resource TO rdfusr;

6. 自身のセマンティク・データとともにsupport for Apache Jenaを使用するには、「セマンティク・データの使用に関するクイック・スタート」の説明のとおり、適切な手順を実行してデータを格納し、モデルを作成して、データベース索引を作成します。その後、Javaコードをコンパイルして実行することで問合せを実行します;問合せの例については、「RDF Semantic Graph Support for Apache Jenaを使用した問合せの例」を参照してください。

Support for Apache Jenaと提供されたサンプル・データの使用については、「RDF Semantic Graph Support for Apache Jenaを使用した問合せの例」を参照してください。

7.4 SEM_MATCHおよびRDF Semantic Graph support for Apache Jenaの問合せの比較

Oracle Databaseに格納されているセマンティク・データを問い合せる方法は2つあります。SEM_MATCHベースのSQL文とsupport for Apache Jenaを介したSPARQL問合せです。それぞれの方法での問合せは、表面的には類似していますが、動作には重要な違いがあります。アプリケーションの動作を一貫性のあるものにするには、SEM_MATCH問合せとSPARQL問合せの違いを理解し、その問合せ結果を処理する際に注意が必要です。

2つの方法を次の簡単な例で示します。

問合せ1 (SEM_MATCHベース)

select s, p, o
from table(sem_match('{?s ?p ?o}', sem_models('Test_Model'), ....))

問合せ2 (support for Apache Jenaを介したSPARQL問合せ)

select ?s ?p ?o
where {?s ?p ?o}

これらの2つの問合せは、同じ種類の機能を実行しますが、いくつか重要な違いがあります。問合せ1 (SEM_MATCHベース)は次のようになります。

- Test_Modelからすべてのトリプルを読み取ります。

- URI、bNode、プレーン・リテラルおよび型付きリテラルを区別せず、長いリテラルを処理しません。

- 特定の文字('\n'など)はエスケープ解除しません。

問合せ2 (support for Apache Jenaを介して実行されるSPARQL問合せ)もTest_Modelからすべてのトリプルを読み取ります(同じ基礎となるTest_Modelを参照しているModelOracleSemに対してコールを実行したと想定します)。ただし、問合せ2は次のようになります。

- (SEM_MATCH表関数による、s、pおよびo列のみではなく)追加の列を読み取り、URI、bNodes、プレーン・リテラル、型付きリテラルおよび長いリテラルを区別します。これによって、Jena Nodeオブジェクトを適切に作成できるようになります。

- Oracle Databaseに格納される際にエスケープされる文字をエスケープ解除します。

2つの方法でのもう1つの違いは、空白ノード処理です。

- SEM_MATCHベースの問合せにおいて、空白ノードは常に定数とみなされます。

- SPARQL問合せにおいて、<と>で囲まれていない 空白ノードは、問合せがSupport for Apache Jenaを介して実行されるときに変数とみなされます。これは、SPARQL標準セマンティクと一致します。ただし、<と>で囲まれた空白ノードは、問合せが実行されるときに定数とみなされ、空白ノード・ラベルには、基礎となるデータのモデル化で必要とされる適切な接頭辞が、support for Apache Jenaによって追加されます。

support for Apache Jena APIを使用して作成されるセマンティク・モデルの名前の最大長は、22文字です。

7.5 SEM_MATCHまたはSQLベースの問合せ結果からのユーザーフレンドリJavaオブジェクトの取得

セマンティク・グラフの問合せは、次のいずれかの方法を使用して行うことができます。

- SPARQL (JavaメソッドまたはWebサービス・エンドポイントを使用)

- SEM_MATCH (SPARQL問合せを埋め込んだ表関数)

- SQL (MDSYS.RDFM_<model>ビューを問い合せて、MDSYS.RDF_VALUE$や他の表と結合)

Java開発者が使用しやすいのは、最初の方法の結果です。2番目と3番目の方法の結果はJava開発者にとっては使用しにくいかもしれません。型付きRDFリテラルとマッピングされた適切な型付きJavaオブジェクトを取得するために、様々な列を解析する必要があるためです。RDF Semantic Graph support for Apache Jenaは、JDBC結果セットから適切な型付きJavaオブジェクトを取得するタスクを簡略化できるように、いくつかのメソッドとヘルパー関数をサポートしています。これらのメソッドとヘルパー関数を次の例に示します。

- 例7-1

- 例7-2

- 例7-3

これらの例は、次のコードのように一連の型付きリテラルが追加されるテスト表TGRAPH_TPLを使用しています(また、それに基づいてTGRAPHをモデル化しています)。

create table tgraph_tpl(triple sdo_rdf_triple_s);
exec sem_apis.create_sem_model('tgraph','tgraph_tpl','triple');
truncate table tgraph_tpl;

-- Add some triples
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph','<urn:s1>','<urn:p1>', '<urn:o1>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph','<urn:s2>','<urn:p2>', '"hello world"'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph','<urn:s3>','<urn:p3>', '"hello world"@en'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph','<urn:s4>','<urn:p4>', '" o1o "^^<http://www.w3.org/2001/XMLSchema#string>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph','<urn:s4>','<urn:p4>', '"xyz"^^<http://mytype>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph','<urn:s5>','<urn:p5>', '"123"^^<http://www.w3.org/2001/XMLSchema#integer>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph','<urn:s5>','<urn:p5>', '"123.456"^^<http://www.w3.org/2001/XMLSchema#double>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph','<urn:s6>','<urn:p6>', '_:bn1'));

-- Add some quads
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph:<urn:g1>','<urn:s1>','<urn:p1>', '<urn:o1>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph:<urn:g2>','<urn:s1>','<urn:p1>', '<urn:o1>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph:<urn:g2>','<urn:s2>','<urn:p2>', '"hello world"'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph:<urn:g2>','<urn:s3>','<urn:p3>', '"hello world"@en'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph:<urn:g2>','<urn:s4>','<urn:p4>', '" o1o "^^<http://www.w3.org/2001/XMLSchema#string>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph:<urn:g2>','<urn:s4>','<urn:p4>', '"xyz"^^<http://mytype>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph:<urn:g2>','<urn:s5>','<urn:p5>', '"123"^^<http://www.w3.org/2001/XMLSchema#integer>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph:<urn:g2>','<urn:s5>','<urn:p5>', '"123.456"^^<http://www.w3.org/2001/XMLSchema#double>'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph:<urn:g2>','<urn:s6>','<urn:p6>', '_:bn1'));
insert into tgraph_tpl values(sdo_rdf_triple_s('tgraph:<urn:g2>','<urn:s7>','<urn:p7>', '"2002-10-10T12:00:00-05:00"^^<http://www.w3.org/2001/XMLSchema#dateTime>'));

例7-1 SQLベースのグラフ問合せ

例7-1は、純粋なSQLベースのグラフ問合せを実行して、Jenaオブジェクトを作成します。

iTimeout = 0; // no time out
iDOP = 1;     // degree of parallelism
iStartColPos = 2;
queryString = "select 'hello'||rownum as extra, o.VALUE_TYPE,o.LITERAL_TYPE,o.LANGUAGE_TYPE,o.LONG_VALUE,o.VALUE_NAME "
+ "  from mdsys.rdfm_tgraph g, mdsys.rdf_value$ o where g.canon_end_node_id = o.value_id";

rs = oracle.executeQuery(queryString, iTimeout, iDOP, bindValues);

while (rs.next()) {
node = OracleSemIterator.retrieveNodeFromRS(rs, iStartColPos, OracleSemQueryPlan.CONST_FIVE_COL, translator);
System.out.println("Result " + node.getClass().getName() + " = " + node + " " + rs.getString(1));
}

例7-1では、次のような出力が生成されます。

Result com.hp.hpl.jena.graph.Node_URI = urn:o1 hello1
Result com.hp.hpl.jena.graph.Node_URI = urn:o1 hello2
Result com.hp.hpl.jena.graph.Node_Literal = "hello world" hello3
Result com.hp.hpl.jena.graph.Node_Literal = "hello world"@en hello4
Result com.hp.hpl.jena.graph.Node_Literal = " o1o " hello5
Result com.hp.hpl.jena.graph.Node_Literal = "xyz" hello6
Result com.hp.hpl.jena.graph.Node_Literal = "123"^^http://www.w3.org/2001/XMLSchema#decimal hello7
Result com.hp.hpl.jena.graph.Node_Literal = "1.23456E2"^^http://www.w3.org/2001/XMLSchema#double hello8
Result com.hp.hpl.jena.graph.Node_Blank = m8g3C75726E3A67323Egmbn1 hello9
Result com.hp.hpl.jena.graph.Node_Literal = "2002-10-10T17:00:00Z"^^http://www.w3.org/2001/XMLSchema#dateTime hello10
Result com.hp.hpl.jena.graph.Node_Literal = "1.23456E2"^^http://www.w3.org/2001/XMLSchema#double hello11
Result com.hp.hpl.jena.graph.Node_URI = urn:o1 hello12
Result com.hp.hpl.jena.graph.Node_Literal = "hello world" hello13
Result com.hp.hpl.jena.graph.Node_Literal = "hello world"@en hello14
Result com.hp.hpl.jena.graph.Node_Literal = " o1o " hello15
Result com.hp.hpl.jena.graph.Node_Literal = "xyz" hello16
Result com.hp.hpl.jena.graph.Node_Literal = "123"^^http://www.w3.org/2001/XMLSchema#decimal hello17
Result com.hp.hpl.jena.graph.Node_Blank = m8mbn1 hello18

例7-2 SEM_MATCHと標準SQL構成要素が混在するハイブリッド問合せ

例7-2は、OracleSemIterator.retrieveNodeFromRS APIを使用してJenaオブジェクトを作成します。連続した5個の列を(値タイプ、リテラル・タイプ、言語タイプ、ロング値、値名の順序どおりに)読み取り、必要なエスケープ解除とオブジェクトのインスタンス化を実行します。この例では、SEM_MATCHを省いて、グラフ・ビューをMDSYS.RDF_VALUE$と直接結合しています。

iStartColPos = 1;
queryString = "select  g$RDFVTYP, g, count(1) as cnt "
+ "  from table(sem_match('{ GRAPH ?g { ?s ?p ?o . } }',sem_models('tgraph'),null,null,null,null,null)) "
+ " group by g$RDFVTYP, g";

rs = oracle.executeQuery(queryString, iTimeout, iDOP, bindValues);
while (rs.next()) {
node = OracleSemIterator.retrieveNodeFromRS(rs, iStartColPos, OracleSemQueryPlan.CONST_TWO_COL, translator);
System.out.println("Result " + node.getClass().getName() + " = " + node + " " + rs.getInt(iStartColPos + 2));
}

例7-2では、次のような出力が生成されます。

Result com.hp.hpl.jena.graph.Node_URI = urn:g2 9
Result com.hp.hpl.jena.graph.Node_URI = urn:g1 1

例7-2の内容:

- Oracleクラスのヘルパー関数executeQueryがSQL文の実行に使用され、OracleSemIterator.retrieveNodeFromRS API (例7-1でも使用されている)がJenaオブジェクトの作成に使用されます。

- 出力では2つの列、値タイプ(g$RDFVTYP)と値名(g)のみが使用されます。このg変数は決してリテラルRDFリソースにはならないことが明らかです。

- 列の順序は重要です。2列からなる変数の場合、最初の列が値タイプ、2番目の列が値名であることが必要です。

例7-3 SEM_MATCH問合せ

例7-3は、SEM_MATCH問合せを実行し、Jenaオブジェクトのリストを返すイテレータ(OracleSemIteratorのインスタンス)を返します。

queryString = "select  g$RDFVTYP, g, s$RDFVTYP, s, p$RDFVTYP, p, o$RDFVTYP,o$RDFLTYP,o$RDFLANG,o$RDFCLOB,o "
+ "  from table(sem_match('{ GRAPH ?g { ?s ?p ?o . } }',sem_models('tgraph'),null,null,null,null,null))";

guide = new ArrayList<String>();
guide.add(OracleSemQueryPlan.CONST_TWO_COL);
guide.add(OracleSemQueryPlan.CONST_TWO_COL);
guide.add(OracleSemQueryPlan.CONST_TWO_COL);
guide.add(OracleSemQueryPlan.CONST_FIVE_COL);

rs = oracle.executeQuery(queryString, iTimeout, iDOP, bindValues);
osi = new OracleSemIterator(rs);
osi.setGuide(guide);
osi.setTranslator(translator);

while (osi.hasNext()) {
result = osi.next();
System.out.println("Result " + result.getClass().getName() + " = " + result);
}

例7-3では、次のような出力が生成されます。

Result com.hp.hpl.jena.graph.query.Domain = [urn:g1, urn:s1, urn:p1, urn:o1]
Result com.hp.hpl.jena.graph.query.Domain = [urn:g2, urn:s1, urn:p1, urn:o1]
Result com.hp.hpl.jena.graph.query.Domain = [urn:g2, urn:s2, urn:p2, "hello world"]
Result com.hp.hpl.jena.graph.query.Domain = [urn:g2, urn:s3, urn:p3, "hello world"@en]
Result com.hp.hpl.jena.graph.query.Domain = [urn:g2, urn:s4, urn:p4, " o1o "]
Result com.hp.hpl.jena.graph.query.Domain = [urn:g2, urn:s4, urn:p4, "xyz"]
Result com.hp.hpl.jena.graph.query.Domain = [urn:g2, urn:s5, urn:p5, "123"^^http://www.w3.org/2001/XMLSchema#decimal]
Result com.hp.hpl.jena.graph.query.Domain = [urn:g2, urn:s5, urn:p5, "1.23456E2"^^http://www.w3.org/2001/XMLSchema#double]
Result com.hp.hpl.jena.graph.query.Domain = [urn:g2, urn:s6, urn:p6, m8g3C75726E3A67323Egmbn1]
Result com.hp.hpl.jena.graph.query.Domain = [urn:g2, urn:s7, urn:p7, "2002-10-10T17:00:00Z"^^http://www.w3.org/2001/XMLSchema#dateTime]

例7-3の内容:

- OracleSemIteratorがJDBC結果セットを取得します。OracleSemIteratorには、SPARQL変数のバインド値を表すすべての列を解析するためのガイダンスが必要です。ガイドは単純な文字列値のリストです。2列の変数(主語と述語の位置)と5列の変数(目的語の位置)を区別する2つの定数が定義されています。トランスレータも必要です。

- 出力では4つの変数が使用されます。最初の3つの変数はRDFリテラル・リソースではないため、CONST_TWO_COLがガイドとして使用されます。最後の変数はRDFリテラル・リソースになることができます。したがって、CONST_FIVE_COLがガイドとして使用されます。

- 列の順序が重要です。例のとおりにする必要があります。

7.6 SPARQL問合せ処理の最適化

この項では、SPARQL問合せ処理を強化できる、support for Apache Jenaのいくつかのパフォーマンス関連機能について説明します。これらの機能は、デフォルトでは自動的に実行されます。

この項では、CONSTRUCT機能やプロパティ・パスなど、SPARQLについての知識があることを前提としています。

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

DISTINCT、OPTIONAL、FILTER、UNION、ORDER BYおよびLIMITを含むSPARQL問合せは、単一のOracle SEM_MATCHテーブル・ファンクションに変換されます。SEM_MATCHでサポートされないSPARQL機能(CONSTRUCTなど)を使用しているために、問合せを直接SEM_MATCHに変換できない場合、support for Apache Jenaは、ハイブリッドな方法を採用し、単一の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.}  }

この場合、support for Apache Jenaは、内側のUNION問合せを単一のSEM_MATCHテーブル・ファンクションに変換し、その結果セットをさらに評価するため、Jena ARQ問合せエンジンに渡します。

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

Jenaに定義されているとおり、プロパティ・パスは2つのグラフ・ノード間でRDFグラフを介して使用可能なルートです。プロパティ・パスはSPARQLの拡張機能であり、RDFグラフのパターン・マッチングでプロパティに正規表現を使用できるため、基本的なグラフ・パターン問合せよりも表現力が豊かです。プロパティ・パスの詳細は、Jena ARQ問合せエンジンのドキュメントを参照してください。

support for Apache Jenaは、Jena ARQ問合せエンジンとの統合によって、すべてのJenaプロパティ・パス・タイプをサポートしますが、いくつかの一般的なパス・タイプは、パフォーマンスを向上するため、ネイティブSQL階層問合せ(SEM_MATCHベースではない)に直接変換されます。次のタイプのプロパティ・パスは、トリプル・データを処理する際、support for Apache JenaによってSQLに直接変換されます。

- 述語選択肢: (p1 | p2 | … | pn) piはプロパティURIです。

- 述語順序: (p1 / p2 / … / pn) piはプロパティURIです。

- 逆パス: ( ^ p ) pは述語URIです。

- 複雑なパス: p+、p*、p{0, n} pは選択肢、順序、逆パスまたはプロパティURIです。

この文法で対応できないパス表現は、support for Apache Jenaによって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.7 他の機能をサポートするためのSPARQL構文への追加

RDF Semantic Graph support for Apache Jenaでは、ヒントと追加の問合せオプションを渡すことができます。問合せオプションを含むOracle固有の名前空間を使用してSPARQL名前空間接頭辞の構文をオーバーロードすることで、これらの機能を実装できます。PREFIX ORACLE_SEM_xx_NS形式の名前空間では、xxの部分に機能の種別(ヒントならHT、APなら追加の述語など)が表されています。

7.7.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ヒントの使用に関する詳細は、「SEM_MATCH表関数を使用したセマンティク・データの問合せ」を、特にoptions属性でのHINT0キーワードに関する資料を参照してください。

7.7.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 .};

次の例は、support for Apache Jenaでバインド変数を使用するための構文を含む問合せ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:整数値>の形式です。アプリケーションは、山カッコと文字列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データベースに接続するためにsupport for Apache Jenaが使用されるときです。

7.7.3 追加のWHERE句述語

SEM_MATCH filter属性に、WHEREキーワードのないWHERE句の形式の文字列として、追加の選択基準を指定することができます。次の形式の1行を含めることで、追加の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.7.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は、結果が重複する場合がありますが、複数のセマンティク・モデルを問い合せるための、より高速な方法です。

- BEST_EFFORT_QUERY=tが、TIMEOUT=nオプションとともに使用されると、SPARQL問合せに対して、n秒以内に検出されるすべての一致が返されます。

- DEGREE=nは、問合せに対して並列度(n)を文レベルで指定します。マルチコアまたはマルチCPUのプロセッサで、異なるDOP値(4または8など)を試すと、パフォーマンスが向上する場合があります。
DEGREEと比較すると、DOPはセッション・レベルで並列度を指定します。DEGREEはDOPよりも処理オーバーヘッドが少ないため、support for Apache Jenaでの使用にはDEGREEが推奨されます。

- DOP=nは、問合せに対して並列度(n)をセッション・レベルで指定します。マルチコアまたはマルチCPUのプロセッサで、異なるDOP値(4または8など)を試すと、パフォーマンスが向上する場合があります。

- INF_ONLYを指定すると、推論されたモデルのみが問い合せられます。

- JENA_EXECUTORは、SEM_MATCH (またはネイティブSQL)に対してSPARQL問合せのコンパイルを無効にし、かわりにJenaネイティブ問合せエグゼキュータが使用されます。

- JOIN=nは、SPARQL SERVICEコールからフェデレーテッド問合せへの結果を、どのように問合せの他の部分と結合できるかを指定します。フェデレーテッド問合せとJOINオプションに関する詳細は、「JOINオプションとフェデレーテッド問合せ」を参照してください。

- NO_FALL_BACKは、SQL例外が発生したときに、基礎となる問合せ実行エンジンがJena実行メカニズムにフォール・バックしないようにします。

- ODS=nは、動的なサンプリングのレベルを、文レベルで指定します。(動的なサンプリングの説明については、『Oracle Database SQLチューニング・ガイド』の動的なサンプリングによる統計の見積りに関する説明を参照してください。)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を無効にします。

- S2S (SPARQL to pure SQL)は、基礎となるSEM_MATCHベースの問合せ、またはSPARQL問合せに基づいて生成された問合せを、SEM_MATCH表関数を使用しないで、さらにSQL問合せに変換します。結果として生成されたSQL問合せはOracleコストベース・オプティマイザによって実行され、その結果はクライアントに渡される前にsupport for Apache Jenaによって処理されます。S2Sオプションの利点と使用方法などの詳細は、「S2Sオプションの利点と使用方法の情報」を参照してください。
S2Sは、すべてのSPARQL問合せについてデフォルトで使用可能です。S2Sを無効にするには、次のJVMシステム・プロパティを設定します。

-Doracle.spatial.rdf.client.jena.defaultS2S=false

- SKIP_CLOB=Tは、問合せに対してCLOB値が戻されないようにします。

- STRICT_DEFAULT=Fは、デフォルトのグラフがトリプルを名前付きグラフに含められるようにします。デフォルトでは、STRICT_DEFAULT=Tは、データセット情報が指定されない場合に、デフォルト・グラフを名前なしトリプルに制限します。

- TIMEOUT=n(問合せタイムアウト)は、問合せが、終了されるまで実行する秒数(n)を指定します。SPARQL問合せから生成される基礎となるSQLは、多数の一致を戻し、副問合せおよび割当てと同様の機能を使用することができ、これらのすべてには、多くの時間がかかることがあります。TIMEOUTとBEST_EFFORT_QUERY=tオプションは、問合せに過度な処理時間がかからないようにするために使用できます。

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

SPARQLフェデレーテッド問合せは、W3Cドキュメントの説明のとおり、分散データ上の問合せであり、そのために、1つのソースを問い合せて、取得した情報を使用して次のソースの問合せを制約します。詳細は、『SPARQL 1.1フェデレーテッド問合せ』 (http://www.w3.org/2009/sparql/docs/fed/service)を参照してください。

JOINオプション(「追加の問合せオプション」を参照)とSERVICEキーワードは、Support for Apache Jenaを使用するフェデレーテッド問合せで使用できます。たとえば、次の問合せを考えてみます。

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.7.4.2 S2Sオプションの利点と使用方法の情報

S2Sオプション(「追加の問合せオプション」参照)には、潜在的に次の利点があります。

- 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.7.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(あるいは両方とも)構造体を使用した問合せ、または複数の投影変数による問合せに最も効果的です。中間層キャッシュは、「追加の問合せオプション」で指定したその他のオプションと組み合せることができます。

モデルのすべてのリソースをキャッシュに事前挿入するには、GraphOracleSem.populateCacheメソッドまたはDatasetGraphOracleSem.populateCacheメソッドを使用します。どちらのメソッドも、内部の中間層キャッシュを構築するために使用されるスレッドの数を指定するパラメータをとります。どちらかのメソッドをパラレルに実行すると、複数のCPU(コア)を搭載したマシンで、パフォーマンスを構築しているキャッシュを大幅に増やすことができます。

7.8 RDF Semantic Graph support for Apache JenaによりSPARQL問合せでサポートされるファンクション

support for Apache Jenaを介したSPARQL問合せは、次の種類のファンクションを使用できます。

- Jena ARQ問合せエンジンのファンクション・ライブラリにあるファンクション

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

- ユーザー定義関数

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

support for Apache Jenaを介した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.8.2 射影変数に関するOracle Databaseのネイティブ・ファンクション

support for Apache Jenaを介したSPARQL問合せは、射影変数に関するOracle Databaseのネイティブ・ファンクションを使用できます。これらの問合せとファンクションは、データベース内部で実行されます。この項で説明したファンクションは、ARQファンクション(「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.8.3 ユーザー定義関数

support for Apache Jenaを介した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.9 SPARQLの更新のサポート

RDF Semantic Graph support for Apache Jenaは、SPARQLの更新(SPARULとも呼ばれる)(http://www.w3.org/TR/sparql11-update/)をサポートしています。主要なプログラミングAPIには、JenaクラスUpdateAction(パッケージcom.hp.hpl.jena.update内)、RDF Semantic Graph support for Apache JenaクラスGraphOracleSemおよびDatasetGraphOracleSemが含まれます。例7-4は、SPARQLの更新操作によって、名前付きグラフ<http://example/graph>のすべてのトリプルが、データベースに格納されている関連したモデルから削除されることを示しています。

例7-4 単純な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-4の例に示すとおり、CREATE GRAPHの手順を安全にスキップできます。

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

例7-5は、複数の挿入操作と削除操作を含むSPARQLの更新操作(ARQ 2.8.8から)を示しています。

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-5での更新操作を実行した後、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.10 RDFデータの解析ファンクション

oracle.spatial.rdf.client.jenaパッケージのSemNetworkAnalystクラスを使用して、RDFデータで解析関数を実行することができます。このサポートは、ネットワークデータ・モデル・グラフのロジックを基礎となるRDFデータ構造体に統合します。そのため、RDFデータでの解析関数を使用するには、『Oracle Spatial and Graphトポロジ・データ・モデルおよびネットワーク・データ・モデル・グラフ開発者ガイド』に説明されている、ネットワーク・データ・モデルのグラフ機能についても理解しておく必要があります。

必要なNDM Javaライブラリ(sdonm.jarとsdoutl.jarを含む)は、ディレクトリ$ORACLE_HOME/md/jlibの下にあります。xmlparserv2.jar($ORACLE_HOME/xdk/libの下)を、classpath定義に含める必要があることに注意してください。

例7-6 RDFデータ上の解析ファンクションの実行

例7-6では、SemNetworkAnalystクラス(NDM NetworkAnalyst APIを内部的に使用)を使用します。

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-6の内容:

- GraphOracleSemオブジェクトが構築され、少数のトリプルがGraphOracleSemオブジェクトに追加されます。これらのトリプルは、複数の個人と、好き、嫌い、知人および他人などの関係を記述します。

- コスト・マッピングは、数値コストの値を異なるリンク/述語(RDFグラフの)に割り当てるために作成されます。この場合、0.5、1.5および5.5は、それぞれに述語likes、dislikesおよびdiffersに割り当てられます。このコスト・マッピングはオプションです。マッピングがないとき、すべての述語は同じコスト1に割り当てられることになります。コスト・マッピングが指定される際、このマッピングは完全である必要はなく、コスト・マッピングに含まれない述語には、デフォルト値の1が割り当てられます。

例7-6の出力は、次のとおりです。この出力には、指定された開始ノードと終了ノードの最短経路が示されます。sna.shortestPathAStar(ano, nodeX)の戻り値は、これらの2つのノード間には経路がないため、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関数で直接使用することができないため、必要な表(指定されたRDFグラフに導出されるノードとリンクを含む)は、SemNetworkAnalystで作成されます。これらの表は、RDFグラフが変更されても自動更新されないため、SemNetworkAnalyst.getInstanceにcleanupパラメータにtrueを設定し、古いノードを削除して表をリンクさせ、更新された表を再構築します。

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

例7-7は、セマンティク・データでのNDM nearestNeighborsファンクションを実装します。これによってSemNetworkAnalystインスタンスからNetworkAnalystオブジェクトを取得し、ノードIDを取得してPointOnNetオブジェクトを作成し、LogicalSubPathオブジェクトを処理します。

%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.DatasetImpl;

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-7の出力は、次のとおりです。

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.10.1 グラフにおけるパスの文脈情報の生成

パスそのものに加え、グラフ内のパスに関する文脈情報を参照することは、有用な場合があります。SemNetworkAnalystクラスのbuildSurroundingSubGraphメソッドは、DOTファイル(グラフ記述言語ファイル、拡張子.gv)を、指定されたWriterオブジェクトに出力できます。パスのノードごとに、最大10の直接の隣接が、パス周辺のサブグラフを生成するために使用されます。次の例は、文脈情報(特に例7-6で使用する解析ファンクションからの出力)を持つDOTファイルの作成方法を示したものです。

nodeArray = sna.shortestPathDijkstra(nodeA, nodeD);
printNodeArray(nodeArray, psOut);

FileWriter dotWriter = new FileWriter("Shortest_Path_A_to_D.gv");
sna.buildSurroundingSubGraph(nodeArray, dotWriter);

先の例から生成される出力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.11 サーバー側APIのサポート

この項では、RDF Semantic Graph support for Apache Jenaによって使用可能になるRDFセマンティク・グラフ機能の一部について説明します。使用可能な機能をサポートするAPIコールの包括的なドキュメントについては、RDF Semantic Graph support for Apache Jenaのリファレンス情報(Javadoc)を参照してください。support for Apache Jenaによって使用可能なサーバー側機能の詳細は、このマニュアルの関連する章を参照してください。

7.11.1 仮想モデルのサポート

仮想モデル(「仮想モデル」を参照)は、GraphOracleSemコンストラクタで指定され、透過的に処理されます。仮想モデルがモデルとルールベースの組合せのために存在している場合には、問合せの応答に使用されます。そのような仮想モデルが存在しない場合には、データベースに作成されます。

注意:

support for Apache Jenaを介した仮想モデルのサポートは、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.11.2 接続プーリングのサポート

Oracle Database接続プーリングは、support for Apache Jenaの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.11.3 セマンティク・モデルのPL/SQLインタフェース

support for Apache Jenaを介して、複数のセマンティクPL/SQLサブプログラムを使用することができます。表7-2に、サブプログラムと、対応するJavaクラスおよびメソッドを示します。

表7-2 PL/SQLサブプログラムと対応するRDF Semantic Graph support for Apache Jenaの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ユーティリティ・サブプログラムの詳細は、「SEM_APISパッケージのサブプログラム」のリファレンス情報を参照してください。対応するJavaクラスとメソッドの詳細は、RDF Semantic Graph support for Apache JenaのAPIリファレンス・ドキュメント(Javadoc)を参照してください。

7.11.4 推論オプション

Attachmentクラス(パッケージoracle.spatial.rdf.client.jena)の次のメソッドを使用し、伴意コールにオプションを追加できます。

public void setUseLocalInference(boolean useLocalInference)
public boolean getUseLocalInference()

public void setDefGraphForLocalInference(String defaultGraphName)
public String getDefGraphForLocalInference()

public String getInferenceOption()
public void setInferenceOption(String inferenceOption)

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

これらのメソッドの詳細は、Javadocを参照してください。

例7-8では、伴意の作成に、パラレル推論(並列度4を使用)とRAW形式を有効化しています。また、伴意の作成に、performInferenceメソッドを使用(SEM_APIS.CREATE_ENTAILMENT PL/SQLプロシージャの使用と同じ)します。

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.DatasetImpl;

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, DatasetImpl.wrap(dsgos));
ResultSet results = qexec.execSelect();

ResultSetFormatter.out(psOut, results);

dsgos.close();
oracle.dispose();
}
}

例7-8の出力は、次のとおりです。

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推論の使用方法」を参照してください。

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

support for Apache JenaでのPelletInfGraphクラスのサポートは、非推奨になりました。かわりに、Oracle Database向けのリーゾナPelletDb OWL 2を介して、より最適化されたOracle/Pellet統合を使用する必要があります。

7.12 RDF Semantic Graph support for Apache Jenaを使用したバルク・ロード

膨大な数のRDF/OWLデータ・ファイルをOracle Databaseに簡単にロードするには、OracleBulkUpdateHandler JavaクラスのprepareBulkメソッドとcompleteBulkメソッドを使用します。

OracleBulkUpdateHandlerクラスのaddInBulkメソッドは、グラフまたはモデルのトリプルをOracle Databaseにバルクロード方式でロードできます。グラフまたはモデルがJenaインメモリー・グラフまたはモデルである場合、操作は物理メモリーのサイズによって制限されます。prepareBulkメソッドは、Jenaのインメモリー・グラフまたはモデルをバイパスし、RDFデータ・ファイルへの直接入力ストリームを取得してデータを解析し、基礎となるステージング表にトリプルをロードします。ステージング表および長いリテラルを格納するための添付表が存在しない場合は、自動的に作成されます。

prepareBulkメソッドは、複数のデータ・ファイルを同じ基礎となるステージング表へロードするために複数回コールできます。ハードウェア・システムがロードバランシングされており、複数のCPUコアによる十分なI/Oキャパシティが確保されている場合には、同時にコールすることもできます。

すべてのデータ・ファイルがprepareBulkメソッドによって処理されると、completeBulkを起動して、すべてのデータをセマンティク・ネットワークにロードできます。

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

例7-9に、ディレクトリdir_1のすべてデータ・ファイルを、基礎となるステージング表へロードする方法を示します。長いリテラルがサポートされ、別々の表に格納されます。記憶域容量を節約するため、GZIPを使用してデータ・ファイルを圧縮することができ、そのデータ・ファイルがGZIPを使用して圧縮されているかどうかを、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-9のコードは、新しいOracleオブジェクトの作成から、そのOracleオブジェクトを破棄して終了するまでをパラレルで実行できます。データベースのハードウェア・システム上に、クワッド-コアCPUと十分なI/O容量がある場合、すべてのデータ・ファイルを4つの別々のディレクトリ(dir_1dir_2、dir_3およびdir_4)に分割して保存することができます。4つのJavaプロセス・スレッドを起動し、それらのディレクトリで別々に同時に動作させることができます。(詳細は、「パラレル(マルチスレッド)モードでのprepareBulkの使用」を参照してください。)

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

すべてのデータ・ファイルが処理された後、1回だけcompleteBulkメソッドを起動し、例7-10に示すとおり、ステージング表のデータをセマンティク・ネットワークにロードできます。長いリテラルを持つトリプルもロードされます。

graph.getBulkUpdateHandler().completeBulk(
null,  // flags for invoking SEM_APIS.bulk_load_from_staging_table
null   // staging table name
);

また、prepareBulkメソッドは、Jenaモデルも入力データソースとして取得でき、この場合は、そのJenaモデルのトリプルを基礎となるステージング表にロードします。詳細は、Javadocを参照してください。

例7-11 prepareBulkでのRDFaの使用

Jenaモデルとデータ・ファイルからトリプルをロードする以外に、prepareBulkメソッドは、例7-11に示すとおり、RDFaをサポートします。(RDFaについては、http://www.w3.org/TR/xhtml-rdfa-primer/を参照してください。)

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=...

例7-12 DatasetGraphへのクワッドのロード

この項の前述の例では、トリプル・データを単一のグラフにロードします。複数の名前付きグラフにわたる場合がある(NQUADS形式のデータなど)クワッド・データのロードには、DatasetGraphOracleSemクラスの使用が必要です。例7-12に示すとおり、DatasetGraphOracleSemクラスはBulkUpdateHandler APIを使用しませんが、同様のprepareBulkインタフェースとcompleteBulkインタフェースを提供します。

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.12.1 パラレル(マルチスレッド)・モードでのprepareBulkの使用

例7-9には、ファイル・システム・ディレクトリ下の一連のファイルを、Oracle Database表(ステージング表)へ、順番にロードする方法が示されていました。例7-13では、一連のファイルを同時にOracle表(ステージング表)にロードします。並列度は、入力パラメータiMaxThreadsによって制御されます。

4つ以上のCPUコアによる均等なハードウェア設定で、iMaxThreadsに8(または16)を設定すると、多数のデータ・ファイルが処理される場合に、prepareBulk操作の速度を大幅に向上できます。

例7-13 iMaxThreadsによるprepareBulkの使用

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.12.2 データ・ロード中の無効な構文の処理

prepareBulkを使用すると、無効なトリプルとクワッドをスキップできます。この機能は、ソースのRDFデータに構文エラーが含まれることが考えられる場合に有用です。例7-14で、StatusListenerインタフェースのカスタマイズされた実装(パッケージoracle.spatial.rdf.client.jenaで定義される)が、prepareBulkへのパラメータとして渡されます。この例で、illegalStmtEncounteredメソッドは、prepareBulkが無効なトリプルをスキップして進むことができるように、その無効なトリプルのオブジェクト・フィールドを出力し、0を戻します。

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

....

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.13 自動的な変数の名前変更

以前、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.14 JavaScript Object Notation (JSON)形式のサポート

JavaScript Object Notation (JSON)形式は、SPARQL問合せのレスポンスのためにサポートされます。JSONデータ形式は単純、コンパクトで、JavaScriptプログラムに適しています。

たとえば、次のJavaコード・スニペット(ResultSetFormatter.outputAsJSONメソッドをコールする)があるとします。

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,
DatasetImpl.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.15 その他の推奨事項とガイドライン

この項では、SPARQL問合せに関連する様々な推奨事項およびその他の情報について説明します。

7.15.1 EXISTSおよびNOT EXISTSのかわりにBOUNDおよび!BOUNDを使用

パフォーマンスをさらに向上するには、EXISTSやNOT EXISTSのかわりに、BOUNDや!BOUNDを使用します。

7.15.2 SPARQL 1.1のSELECT式

関数が現在Oracle Databaseでサポートされていなくても、パフォーマンスに大きなオーバーヘッドを発生させることなく、SPARQL 1.1のSELECT表現を使用できます。例には次のものがあります。

-- Query 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 .
}

-- Query 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.15.3 bnode(空白ノード)を含む構文

bnodeを含む構文を問合せパターンの中で自由に使用できます。たとえば、次のbnode関連の構文はパーサー・レベルでサポートされるため、各構文はそのトリプル問合せパターンベースの完全なバージョンと同等です。

:x :q [ :p "v" ] .

(1 ?x 3 4) :p "w" .

(1 [:p :q] ( 2 ) ) .

7.15.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.15.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-15 OntModelとOracle Databaseに格納されたオントロジの使用

例7-15では、OntModel APIとOracleモデルに格納されている既存のオントロジを使用する方法を表示します

// 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グラフを介して実行される必要があります。

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

OracleGraphWrapperForOntModelによって使用されるデフォルトのインメモリー・セマンティク・ストアが、オントロジとシステムにとって十分ではない場合、インメモリー・ストアとして使用するカスタム・グラフを指定するためのインタフェースが、クラスによって提供されます。例7-16に、カスタム・インメモリー・グラフを使用してOntModelからの問合せに応答するOracleGraphWrapperForOntModelを作成する方法を示します。

// 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.16 RDF Semantic Graph support for Apache Jenaを使用する問合せ例

この項では、support for Apache Jenaを使用した問合せの例を示します。それぞれの例は個々に完結しており、通常はモデルの作成、トリプルの作成、推論を含む可能性のある問合せの実行、結果の表示およびモデルの削除を行います。

この項では、次の手順を実行する問合せについて説明します。

- URLによるオントロジの参照、およびローカル・ファイルからオントロジをバルク・ロードする方法の両方によって、universityオントロジの例で表明されたトリプルと表明に加えて推論されたトリプルをカウントします。

- familyオントロジを使用して複数のSPARQL問合せを実行します(LIMIT、OFFSET、TIMEOUT、DOP (並列度)、ASK、DESCRIBE、CONSTRUCT、GRAPH、ALLOW_DUP (複数のモデルによる重複トリプル)、SPARUL (データの挿入)などの機能が含まれます)。

- ARQ組込み関数を使用します。

- SELECTキャスト問合せを使用します。

- OracleConnectionを使用してOracle Databaseをインスタンス化します。

- Oracle Database接続プーリングを使用します。

問合せを実行するには、次の手順を実行する必要があります。

1. コードをJavaソース・ファイルに含めます。この項で使用される例は、support for Apache Jenaダウンロードのexamplesディレクトリのファイルで提供されています。

2. Javaソース・ファイルをコンパイルします。次に例を示します。

> javac -classpath ../jar/'*' Test.java

注意:

javacコマンドとjavaコマンドは、それぞれ1行のコマンドである必要があります。

3. コンパイルされたファイルを実行します。次に例を示します。

> java -classpath ./:../jar/'*'  Test jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1

7.16.1 Test.java: 家族関係を問い合せる

例7-17 家族関係を問い合せる

例7-17は、JohnがMaryの父であることを指定し、次に、各fatherOf関係で主語と目的語を選択して表示します。

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

次のコマンドは、javaコマンドの想定される出力に加え、例7-17をコンパイルして実行します。

javac -classpath ../jar/'*' Test.java
java -classpath ./:../jar/'*'  Test jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1

---------------------------------------------------------
| f                         | k                         |
=========================================================
| <http://example.com/John> | <http://example.com/Mary> |
---------------------------------------------------------

7.16.2 Test6.java: OWLオントロジをロードし、OWLPrime推論を実行する

例7-18は、OWLオントロジをロードして、OWLPrime推論を実行します。OWLオントロジがRDF/XML形式であり、Oracleにロードされた後にN-triple形式でシリアライズされることに注意してください。また、表明および推論されたトリプルの数を問い合せます。

この例のオントロジはhttp://swat.cse.lehigh.edu/onto/univ-bench.owlから入手することができます。そこには、ロール、リソースおよび大学環境での関係が記述されています。

例7-18 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();
}
}

次のコマンドは、javaコマンドの想定される出力に加え、例7-18をコンパイルして実行します。

javac -classpath ../jar/'*' Test6.java
java -classpath ./:../jar/'*'  Test6 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
Asserted  triples count: 293
Asserted + Infered triples count: 340

この出力には、以前のバージョンのLUBMオントロジが反映されていることに注意してください。最新バージョンのオントロジには、より多くのトリプルがあります。

7.16.3 Test7.java: OWLオントロジをバルク・ロードし、OWLPrime推論を実行する

例7-19では、「Test6.java: OWLオントロジのロードとOWLPrime推論の実行」と同じOWLオントロジがロードされますが、バルク・ローダーの使用によりローカル・ファイルに保存されます。オントロジは増分およびバッチ・ローダーを使用してロードすることもでき、例にはこれらの2つの方法も示されています。

例7-19 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();
}
}

次のコマンドは、javaコマンドの想定される出力に加え、例7-19をコンパイルして実行します。

javac -classpath ../jar/'*' Test7.java
java -classpath ./:../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.16.4 Test8.java: SPARQL OPTIONALの問合せ

例7-20には、SPARQL OPTIONAL問合せが示されています。次の条件を持つトリプルを挿入します。

- Johnは、Maryの親です。

- Johnは、Jackの親です。

- Maryは、Jillの親です。

次に親子関係を見つけ、必要に応じて孫(gkid)の関係も含めます。

例7-20 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();
}
}

次のコマンドは、javaコマンドの想定される出力に加え、例7-20をコンパイルして実行します。

javac -classpath ../jar/'*' Test8.java
java -classpath ./:../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.16.5 Test9.java: SPARQL問合せでのLIMITおよびOFFSETの使用

例7-21には、LIMITおよびOFFSETを使用するSPARQL問合せが示されています。次の条件を持つトリプルを挿入します。

- Johnは、Maryの親です。

- Johnは、Jackの親です。

- Maryは、Jillの親です。

次に1つの親子関係(LIMIT 1)を検出し、出現した最初の2つの親子関係をスキップ(OFFSET 2)し、必要に応じて、検出された孫(gkid)の関係を含めます。

例7-21 SPARQL問合せでのLIMITおよびOFFSETの使用

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

次のコマンドは、javaコマンドの想定される出力に加え、例7-21をコンパイルして実行します。

javac -classpath ../jar/'*' Test9.java
java -classpath ./:../jar/'*'  Test9 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
------------------------------
| s        | o        | gkid |
==============================
| <u:John> | <u:Jack> |      |
------------------------------

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

例7-22では、「Test9.java: LIMITおよびOFFSETを使用するSPARQL問合せ」のSPARQL問合せに、タイムアウト設定(TIMEOUT=1、秒単位)およびパラレル実行設定(DOP=4)などの機能を追加した例を示します。

例7-22 SPARQL問合せでのTIMEOUTおよびDOPの使用

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

次のコマンドは、javaコマンドの想定される出力に加え、例7-22をコンパイルして実行します。

javac -classpath ../jar/'*' Test10.java
java -classpath ./:../jar/'*'  Test10 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
------------------------------
| s        | o        | gkid |
==============================
| <u:John> | <u:Jack> |      |
------------------------------

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

例7-23には、名前付きグラフを含む問合せが示されています。これには、名前付きグラフのURIとその作成者の情報を持つデフォルト・グラフが含まれます。問合せで、グラフ名、グラフの作成者およびfoaf:mbox述語を使用して各名前付きグラフのメールボックスの値を確認できます。

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

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

次のコマンドは、javaコマンドの想定される出力に加え、例7-23をコンパイルして実行します。

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 ./:../jar/'*'  Test11 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
------------------------------------------------------------------------
| who            | graph                      | mbox                   |
========================================================================
| "alice Hacker" | <http://example.org/alice> | <mailto:alice@example> |
| "Bob Hacker"   | <http://example.org/bob>   | <mailto:bob@example>   |
------------------------------------------------------------------------

7.16.8 Test12.java: SPARQL ASK問合せ

例7-24には、SPARQL ASK問合せが示されています。JohnがMaryの親であるという条件のトリプルを挿入します。次にJohnがMaryの親かどうかを確認します。

例7-24 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();
}
}

次のコマンドは、javaコマンドの想定される出力に加え、例7-24をコンパイルして実行します。

javac -classpath ../jar/'*' Test12.java
java -classpath ./:../jar/'*'  Test12 jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
ask result = TRUE

7.16.9 Test13.java: SPARQL DESCRIBE問合せ

例7-25には、SPARQL DESCRIBE問合せが示されています。次の条件を持つトリプルを挿入します。

- Johnは、Maryの親です。

- Johnは、Jackの親です。

- Amyは、Jackの親です。

次に、Jackの親を含むすべての関係を検出します。

例7-25 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();
}
}

次のコマンドは、javaコマンドの想定される出力に加え、例7-25をコンパイルして実行します。

javac -classpath ../jar/'*' Test13.java
java -classpath ./:../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} |  [u:Amy, u:parentOf, u:Jack] [u:John, u:parentOf,
u:Jack] [u:John, u:parentOf, u:Mary]>

7.16.10 Test14.java: SPARQL CONSTRUCT問合せ

例7-26には、SPARQL CONSTRUCT問合せが示されています。次の条件を持つトリプルを挿入します。

- Johnは、Maryの親です。

- Johnは、Jackの親です。

- Amyは、Jackの親です。

- それぞれの親は、自分の子ども全員を愛しています。

次に、誰が誰を愛しているかについての情報でRDFグラフを構築します。

例7-26 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();
}
}

次のコマンドは、javaコマンドの想定される出力に加え、例7-26をコンパイルして実行します。

javac -classpath ../jar/'*' Test14.java
java -classpath ./:../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} |  [u:Amy, u:loves, u:Jack] [u:John, u:loves,
u:Jack] [u:John, u:loves, u:Mary]>

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

例7-27では、複数のモデルを問い合せて重複の許可を使用します。次の条件を持つトリプルを挿入します。

- Johnは、Jackの親です(モデル1)。

- Maryは、Jackの親です(モデル2)。

- それぞれの親は、自分の子ども全員を愛しています。

次に、誰が誰を愛しているかについて検出します。両方のモデルを検索し、モデルでの重複トリプルを(この例に重複はありませんが)許可します。

例7-27 複数のモデルを問い合せて重複の許可を指定する

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

次のコマンドは、javaコマンドの想定される出力に加え、例7-27をコンパイルして実行します。

javac -classpath ../jar/'*' Test15.java
java -classpath ./:../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} |  [u:Mary, u:loves, u:Jack] [u:John, u:loves, u:Jack]>

7.16.12 Test16.java: SPARQLの更新

例7-28では、2つのトリプルをモデルに挿入します。

例7-28 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();
}
}

次のコマンドは、javaコマンドの想定される出力に加え、例7-28をコンパイルして実行します。

javac -classpath ../jar/'*' Test16.java
java -classpath ./:../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.16.13 Test17.java: ARQ組込みファンクションを使用するSPARQL問合せ

例7-29では、2冊の本に関するデータを挿入し、本のタイトル(すべて大文字で)と、各タイトル文字列の長さを表示します。

例7-29 SPARQL問合せでのARQ組込みファンクションの使用

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

次のコマンドは、javaコマンドの想定される出力に加え、例7-29をコンパイルして実行します。

javac -classpath ../jar/'*' Test17.java
java -classpath ./:../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.16.14 Test18.java: SELECTキャスト問合せ

例7-30では、2つの華氏温度(18.1と32.0)を摂氏温度に変換します。

例7-30 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();
}
}

次のコマンドは、javaコマンドの想定される出力に加え、例7-30をコンパイルして実行します。

javac -classpath ../jar/'*' Test18.java
java -classpath ./:../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.16.15 Test19.java: OracleConnectionを使用したOracle Databaseのインスタンス化

例7-31では、指定されたOracleConnectionオブジェクトを使用して、異なる方法でOracleオブジェクトをインスタンス化しています。(J2EE Webアプリケーションでは、ユーザーは通常、J2EEデータソースからOracleConnectionオブジェクトを取得できます。)

例7-31 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();
}
}

次のコマンドは、javaコマンドの想定される出力に加え、例7-31をコンパイルして実行します。

javac -classpath ../jar/'*' Test19.java
java -classpath ./:../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.16.16 Test20.java: Oracle Database接続プーリング

例7-32では、Oracle Database接続プーリングを使用します。

例7-32 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();
}
}

次のコマンドは、javaコマンドの想定される出力に加え、例7-32をコンパイルして実行します。

javac -classpath ../jar/'*' Test20.java
java -classpath ./:../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.17 SPARQL Gatewayとセマンティク・データ

SPARQL Gatewayは、support for Apache Jenaに含まれるJ2EE Webアプリケーションです。Oracle Business Intelligence Enterprise Edition (OBIEE) 11gなどの、リレーショナル・データおよびXMLデータで稼働するアプリケーションで、セマンティク・データ(RDF/OWL/SKOS)を容易に利用可能にすることを目的としています。

この項には、次の主要なトピックがあります。

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

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

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

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

- SPARQL GatewayのJava APIの使用

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

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

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

SPARQL Gatewayでは、セマンティク・データを非セマンティク・アプリケーションに公開する際の次のような課題に対処します。

- RDF構文、SPARQL問合せ構文およびSPARQLプロトコルについて理解しておく必要があること。

- SPARQL問合せのレスポンス構文を理解しておく必要があること。

- 変換で、SPARQL問合せのレスポンスを、アプリケーションが使用できる形に変更する必要があること。

このような課題に対処するため、SPARQL Gatewayは、SPARQL問合せとXSLT操作を管理し、標準準拠の任意のSPARQLエンドポイントに対してSPARQL問合せを実行して、必要なXSL変換を実行してから、アプリケーションへレスポンスを渡します。こうすると、アプリケーションは既存のデータ・ソースからの場合と同じようにセマンティク・データを使用できるようになります。

異なるトリプル・ストアまたはクワッド・ストアには、異なる機能があります。たとえば、Oracle DatabaseによってサポートされるSPARQLエンドポイントは、指定された標準準拠のSPARQL問合せを解析して応答するというコア機能に加え、RDF Semantic Graph support for Apache JenaおよびJosekiを使用して、パラレル実行、問合せタイムアウト、動的なサンプリング、結果キャッシュおよびその他の機能を実行できます。一方、これらの機能は、指定された別のセマンティク・データ・ストアからは使用できない場合があります。

RDF Semantic Graph SPARQL Gatewayでは、たとえば長時間実行中の問合せにタイムアウトを設定する機能や、複雑な問合せから指定された時間内に結果の一部を取得する機能のような、強く求められる特定の機能を利用することができます。アプリケーションに応答時間の制約があるように、問合せの終了を無期限に待機することは、エンド・ユーザーにとって困難です。SPARQL Gatewayは、SPARQLエンドポイントの上位に、タイムアウトとベスト・エフォート型問合せ関数の両方を提供します。このような効率性によって、SPARQL問合せの実行中のセマンティク・データの使用に関して、不確実性がある程度は効果的に排除されます。(「タイムアウト値の指定」と「ベスト・エフォート型の問合せ実行の指定」を参照してください。)

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

SPARQL Gatewayをインストールして構成するには、次の主要手順を実行します(手順についてはそれぞれの項で説明します)。

1. RDF Semantic Graph support for Apache Jena .zipファイルをダウンロードする(まだダウンロードしていない場合)

2. WebLogic ServerでのSPARQL Gatewayのデプロイ

3. 必要に応じてプロキシ設定を変更する

4. 必要に応じてOracleSGDSデータソースを構成する

5. 必要に応じてSparqlGatewayAdminGroupグループを追加し、構成する

7.17.2.1 RDF Semantic Graph support for Apache Jena .zipファイルをダウンロードする(まだダウンロードしていない場合)

RDF Semantic Graph support for Apache Jenaファイルをまだダウンロードしていない場合は、「ソフトウェア環境の設定」の説明に従ってRDFセマンティク・グラフ・ページからファイルをダウンロードし、一時ディレクトリに解凍します。

なお、SPARQL GatewayのJavaクラスの実装は、sdordfclient.jarに含まれています(「SPARQL GatewayのJava APIの使用」を参照)。

7.17.2.2 WebLogic ServerでのSPARQL Gatewayのデプロイ

Oracle WebLogic Serverで、次のようにSPARQL Gatewayをデプロイします。

1. 次のとおり、WebLogic Serverのautodeployディレクトリに移動し、ビルトインsparqlgateway.warファイルをコピーします。(開発ドメインでのアプリケーションに対する自動デプロイの詳細は、http://docs.oracle.com/cd/E11035_01/wls100/deployment/autodeploy.htmlを参照してください。)

cp -rf  /tmp/jena_adapter/sparqlgateway_web_app/sparqlgateway.war  <domain_name>/autodeploy/sparqgateway.war

この例では、<domain_name>はWebLogic Serverドメインの名前です。

次の方法で、ビルトイン・アプリケーションをカスタマイズできます。

- 必要に応じて、sparqlgateway_web_app/sparqlgateway.warに埋め込まれているWEB-INF/web.xmlファイルを変更します。sparql_gateway_repository_filedirパラメータとsparql_gateway_repository_urlパラメータに対して、適切な値を指定してください。

- 必要に応じて、XSLTファイルまたはSPARQL問合せファイルを、sparqlgateway_web_app/sparqlgateway.warのトップレベル・ディレクトリに追加します。
ディレクトリには、Oracle提供のファイルdefault.xslt、noop.xsltおよびqb1.sparqlがあります。default.xsltファイルは、SPARQL問合せレスポンス(XML)を、主にOracleで利用可能な形式に変換するためのものです。

(これらのファイルについては「SPARQL問合せとXSL変換の格納」を、SPARQL GatewayでのOBIEEの使用については「SPARQL GatewayのOBIEEへのXMLデータソースとしての使用」を参照してください。)

2. Webブラウザを使用して、次の書式のURLに接続し、デプロイメントを確認します(Webアプリケーションはポート7001でデプロイされているとします)。

http://<hostname>:7001/sparqlgateway

7.17.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.17.2.4 OracleSGDSデータ・ソースの構成(必要な場合)

SPARQL GatewayのSPARQL問合せとXSL変換を格納し、アクセスするために、Oracle Databaseを使用する場合は、OracleSGDSという名前のデータソースを構成する必要があります。

このデータ・ソースを作成するには、「WebLogic Serverを使用した必要なデータソースの作成」の手順に従います。ただしデータソース名には、OracleSemDSではなくOracleSGDSを指定します。

OracleSGDSデータソースが構成されていて使用可能な場合、SPARQL Gatewayサーブレットは、すべての必要な表と索引を初期化時に自動作成します。

7.17.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.17.3 SPARQL Gatewayでのセマンティク・データの使用

SPARQL Gatewayと対話するアプリケーションの主要なインタフェースには、次の形式のURLを使用します。

http://host:port/sparqlgateway/sg?<SPARQL_ENDPOINT>&<SPARQL_QUERY>&<XSLT>

前述の形式の説明:

- <SPARQL_ENDPOINT>では、eeパラメータを指定します。SPARQLエンドポイントのURLエンコード形式を含みます。
たとえば、ee=http%3A%2F%2Fsparql.org%2FbooksはSPARQLエンドポイントhttp://sparql.org/booksのURLエンコード文字列です。これは、SPARQL問合せがエンドポイントhttp://sparql.org/booksに対して実行されることを意味します。

- <SPARQL_QUERY>では、SPARQL問合せ、またはSPARQL問合せの場所を指定します。
アプリケーションで非常に長いURLを使用できる場合は、SPARQL問合せ全体をエンコードし、URLにeq=<encoded_SPARQL_query>を設定することができます。あまり長いURLをアプリケーションで使用できない場合は、「SPARQL問合せとXSL変換の格納」で説明されている方法の1つを使用して、SPARQL問合せを格納し、これらをSPARQL Gatewayで使用可能にすることができます。

- <XSLT>では、XSL変換またはXSL変換の場所を指定します。
アプリケーションで非常に長いURLを使用できる場合は、XSL変換全体をエンコードし、URLにex=<encoded_XSLT>を設定することができます。あまり長いURLをアプリケーションで使用できない場合は、「SPARQL問合せとXSL変換の格納」で説明されている方法の1つを使用して、XSL変換を格納し、これらをSPARQL Gatewayで使用可能にすることができます。

関連トピック:

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

- タイムアウト値の指定

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

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

7.17.3.1 SPARQL問合せとXSL変換の格納

あまり長いURLをアプリケーションで使用できない場合は、SPARQL問合せとXSL変換の場所を、「SPARQL Gatewayでのセマンティク・データの使用」の説明にあるURL形式の<SPARQL_QUERY>と<XSLT>の部分に指定できます。次のいずれかの方法を使用します。

- 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変換をカスタマイズする必要がある場合は、「デフォルトの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データソースからデータベース接続を取得すると、データベース表ORACLE_ORARDF_SG_QUERYから指定された整数IDを使用してSPARQL問合せが読み取られます。

Oracle DatabaseからSPARQL問合せをフェッチするための構文はdq=<integer-id>、Oracle DatabaseからXSL変換をフェッチするための構文はdx=<integer-id>です。

サーブレットの初期化時に、次の表がまだ存在しない場合は、自動的に作成されます(手動で作成する必要はありません)。

- 主キーがQID (整数型)のORACLE_ORARDF_SG_QUERY

- 主キーがXID (整数型)のORACLE_ORARDF_SG_XSLT

7.17.3.2 タイムアウト値の指定

実行時間が長くなる可能性のある問合せを「セマンティク・データを使用したSPARQL Gatewayの使用」で説明されている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.17.3.3 ベスト・エフォート型問合せ実行の指定

注意:

ベスト・エフォート型問合せ実行は、タイムアウト値も指定する場合にのみ指定できます(「タイムアウト値の指定」を参照)。

実行時間が長くなる可能性のある問合せを「セマンティク・データを使用したSPARQL Gatewayの使用」で説明されている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.17.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.17.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.17.5 SPARQL GatewayのJava APIの使用

Webインタフェースに加え、SPARQL Gateway管理サービスには、SPARQL問合せと関連するXSL変換を管理するための便利なJavaアプリケーション・プログラミング・インタフェース(API)があります。Java APIは、RDF Semantic Graph support for Apache Jenaライブラリsdordfclient.jarに含まれます。

Java APIリファレンス情報は、SPARQL Gatewayの.zipファイルに含まれるjavadoc_sparqlgateway.zipファイルで入手できます(未入手の場合、RDF Semantic Graph Support for Apache Jena .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-33 SPARQL問合せとXSL変換の格納

例7-33では、SPARQL Gatewayを使用したデータベースに、問合せとXSL変換を追加します。問合せと変換が追加された後、他のプログラムでは、リクエストURLで適切な問合せID (qid)とXSL変換ID (xid)を指定することで、ゲートウェイを介して問合せと変換を使用することができます。

なお、例7-33では、問合せと変換の両方が挿入されていますが、問合せと変換には必ずしも関連はなく、SPARQL Gatewayにアクセスするときに同時に使用される必要もありません。SPARQL Gatewayにリクエストを送信するときは、データベースの任意の問合せをデータベースの任意の変換とともに使用することができます。

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-34 問合せの変更

例7-34では、データベースから既存の問合せを取得し、それを変更した後、更新された問合せを再度データベースに格納します。これらの手順では、問合せの編集と変更の保存をシミュレートします。(問合せが存在しない場合は、例外がスローされます。)

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-35 XSL変換の取得および出力

例7-35では、既存の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.17.6 SPARQL GatewayのグラフィカルなWebインタフェースの使用

SPARQL Gatewayでは、問合せのテスト、セマンティク・データのナビゲート、SPQARQL問合せとXSLTファイルの管理に役立つブラウザベースのインタフェースがいくつか用意されています。

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

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

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

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

7.17.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と同様です。この図のXML出力には、デフォルトの変換(default.xslt)が適用されています。

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

7.17.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のツールチップ(図のhttp://purl.org.dc/elements/1.1/titleにdc:titleのツールチップが表示されています)が表示されます。

図7-5に示されている出力のURIhttp://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.17.6.3 XSLTの管理ページ(xslt.jsp)

http://<host>:<port>/sparqlgateway/admin/xslt.jspは、単純なXSLT管理インタフェースです。XSLT ID(整数)を入力して「XSLTの取得」をクリックすると、説明とXSLT本体を取得できます。XSLT本体のテキストを変更した後に「XSLTの保存」をクリックすることで、その変更を保存できます。使用可能なXSLT定義のナビゲートに役立つプレビューアがあります。

図7-7は、XSLTの管理ページを示しています。

図7-7 XSLTの管理ページ

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

http://<host>:<port>/sparqlgateway/admin/xslt.jspは、単純なSPARQL管理インタフェースです。SPARQL ID(整数)を入力して「SPARQLの取得」をクリックすると、説明とSPARQL本体を取得できます。SPARQL本体のテキストを変更した後に「SPARQLの保存」をクリックすることで、その変更を保存できます。使用可能なSPARQL問合せのナビゲートに役立つプレビューアがあります。

図7-8は、SPARQLの管理ページを示しています。

図7-8 SPARQLの管理ページ

7.17.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(「セマンティク・データを使用したSPARQL Gatewayの使用」を参照)と対話するアプリケーションのURL。タイムアウト・オプションおよびベスト・エフォート型オプションを含めることもできます。

「ユーザー名」フィールドと「パスワード」フィールドは無視します。

3. 「次へ」をクリックします。図7-10に示すとおり、メタデータのインポート・ウィザードの2番目のページが表示されます。

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

インポートする必要なメタデータ型を選択します。選択したタイプに「表」が含まれていることを確認します。

4. 「次へ」をクリックします。図7-11に示すとおり、メタデータのインポート・ウィザードの3番目のページが表示されます。

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

「データソース・ビュー」で、表アイコンを持つノードを展開し、(SPARQL SELECT構文に定義した投影変数からマップされた)列名を選択して右矢印(>)ボタンをクリックし、選択した列を「リポジトリ・ビュー」に移動します。

5. 「終了」をクリックします。

6. (SPARQL GatewayまたはRDFデータに固有ではない)通常のBIビジネス・モデルの作業およびマッピングと表現定義の作業について、残りの手順を実行します。

7.18 Apache TomcatまたはJBossにおけるJosekiのデプロイ

「SPARQLサービスの設定」の説明に従ってJosekiをOracle WebLogic Serverにデプロイしない場合は、次の項目の説明のようにApache TomcatまたはJBossにデプロイできます。

- Apache Tomcat 6.0.29または7.0.42におけるJosekiのデプロイ

- JBoss 7.1.1におけるJosekiのデプロイ

7.18.1 Apache Tomcat 6.0.29または7.0.42におけるJosekiのデプロイ

JosekiをApache Tomcat 6.0.29または7.0.42にデプロイするには、次の手順を実行します。

1. Apache Tomcat 6.0.29または7.0.42をダウンロードしてインストールします。
これらの手順では、Apache Tomcatインストール・ディレクトリのルートを、$CATALINA_HOMEと呼びます。

2. 次の例を使用して環境変数を設定します。

setenv JAVA_HOME< your_path_here>/jdk16/
setenv PATH <your_path_here>/jdk16/bin/:$PATH
setenv CATALINA_HOME <your_path_here>/apache-tomcat-6.0.29 OR
setenv CATALINA_HOME <your_path_here>/apache-tomcat-7.0.42

3. ojdbc6.jarを${CATALINA_HOME}/libにコピーします。

4. tomcat-users.xmlを変更して、次のものを含めます。

<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="<tomcat-password>" roles="tomcat,manager"/>
<user username="both" password="<tomcat-password>" roles="tomcat,role1"/>
<user username="role1" password="<tomcat-password>" roles="role1"/>
</tomcat-users>

ただし、Apache Tomcatバージョン7.0.42を使用している場合は、前述のコードのroles="tomcat,manager"をroles="tomcat,manager-gui"に置き換えます。

5. Tomcatを開始します。

$CATALINA_HOME/bin/startup.sh

このファイルに実行権限がない場合は、次のコマンドを入力してから再度Tomcatを起動します。

chmod u+x $CATALINA_HOME/bin/startup.sh

6. ブラウザで、http://hostname:8080/manager/htmlに移動します。
認証が必要な場合は、ユーザーにtomcatと入力し、Tomcatのパスワードを入力します。

7. TomcatにJosekiをデプロイします。

a. 「Tomcat Manager」ページ(http://hostname:8080/manager/html)で、Deploy directory or WAR file located on serverを選択します。

b. Context Pathに/josekiと入力します。

c. WAR or Directory URLに、joseki.warへのパス(/tmp/jena_adapter/joseki_web_app/joseki.warなど)を入力します。

d. 「デプロイ」をクリックします。

josekiという名前のディレクトリが、apache-tomcat-6.0.29/webapps下かapache-tomcat-7.0.42/webapps下に作成されます。このディレクトリはJOSEKI_HOMEとして参照されます。

8. 次に移動して、Josekiが正常にインストールされたことを確認します。

http://<hostname>:8080/joseki

9. OracleSemDSというJ2EEデータ・ソースを作成します。
データ・ソースの作成中に、SPARQL問合せの実行対象になる関連セマンティク・データを含むデータベース・スキーマのユーザーとパスワードを指定できます。Tomcatにデータ・ソースを作成するには、次の変更を行います。

- グローバル$CATALINA_HOME/conf/server.xmlファイルに、次のGlobalNamingResourcesのリソースを追加します(必要に応じてカスタマイズします)。

<Resource name="OracleSemDS" auth="Container" type="oracle.jdbc.pool.OracleDataSource" driverClassName="oracle.jdbc.OracleDriver" factory="oracle.jdbc.pool.OracleDataSourceFactory" url="jdbc:oracle:thin:@hostname:port:sid" user="username" password="password" maxActive="30" maxIdle="10" maxWait="-1"/>

- グローバル$CATALINA_HOME/conf/context.xmlファイルに、次のリンクを追加します。

<ResourceLink global="OracleSemDS" name="OracleSemDS" type="oracle.jdbc.pool.OracleDataSource"/>

データ・ソース設定の詳細は、Tomcatの文書を参照してください。

10. Tomcatをシャットダウンし、再起動します。

$CATALINA_HOME/bin/shutdown.sh
$CATALINA_HOME/bin/startup.sh

11. 次に移動してデプロイメントを確認します(Webアプリケーションはポート番号8080でデプロイされているとします):

http://<hostname>:8080/joseki/querymgt?abortqid=0

XMLレスポンスに、RDF Semantic Graph support for Apache Jena問合せ管理サーブレットによるJosekiのデプロイメントが成功したことが示されます。

7.18.2 JBoss 7.1.1におけるJosekiのデプロイ

JosekiをJBoss 7.1.1にデプロイするには、次の手順を実行します。(この手順も、必要な変更を加えた上でRed Hat JBoss Enterprise Application Platform 6.1.0に対してテストされたものです。)

1. JBoss Application Server 7.1.1をダウンロードしてインストールします。
この手順では、jboss-as-7.1.1.Final/がJBossインストールのトップレベル・ディレクトリであるとします。

2. JDBCドライバをインストールします。

create directory jboss-as-7.1.1.Final/modules/oracle/jdbc/main/

3. このディレクトリにojdbc6.jarをコピーします。

4. このディレクトリに、次の内容でmodule.xmlを作成します。

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="oracle.jdbc">
<resources>
<resource-root path="ojdbc6.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>

5. 次の行を追加してjboss-as-7.1.1.Final/standalone/configuration/standalone.xmlを変更します。

<driver name="OracleJDBCDriver" module="oracle.jdbc"/>

変更したstandalone.xmlファイルには次を含める必要があります。

...
<drivers>
<driver name="OracleJDBCDriver" module="oracle.jdbc"/>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
</drivers>
...

6. 必要なデータ・ソースを作成します。

a. JBoss AS管理コンソールにログインします。

http://<hostname>:9990/console/App.html#server-overview

b. Datasourceをクリックします。

c. Profileをクリックします。

d. Addをクリックし、次を入力します。
名前: OracleSemDSOracleSemDS

JNDI名: java:jboss/datasources/OracleSemDS

e. OracleJDBCDriverを選択します。

f. 「次へ」をクリックします。
次の情報が表示されます:

Connection URL: jdbc:oracle:thin:@hostname:port:sid     NOTE: customize
Username:    scott                                       NOTE: customize
Password:    tiger                                       NOTE: customize
Security Domain: (Leave empty)

g. 必要に応じてこの情報をカスタマイズし、Security Domainは空白のままで、Doneをクリックします。

7. 新しいデータ・ソースを強調表示して、EnableをクリックしてからConfirmをクリックします。

8. JBoss管理コンソールを使用してjoseki.warファイルをデプロイします。

a. 次のページに移動します。

http://<hostname>:9990/console/App.html#deployments

b. 「デプロイメント」をクリックします。

c. 「Manage Deployments」をクリックします。

d. Addをクリックし、joseki.warファイルを指定します。

8 RDF Semantic Graph support for OpenRDF Sesame

注意:

この機能は、以前はSesame Adapter for Oracle DatabaseまたはSesame Adapterと呼ばれていました。

RDF Semantic Graph support for OpenRDF Sesame (以降、support for Sesameとも記載)は、一般的なSesame Java APIをOracle Spatial and Graph RDF Semantic Graphサポートに統合します。Sesameは「RDFデータの処理とハンドリングのための強力なJavaフレームワークで、これには、これらのデータの作成、解析、保存、推論、問合せが含まれます。」(http://rdf4j.orgを参照)。

「RDFセマンティク・グラフの概要」と「OWLの概要」で説明されている主要な概念について十分に理解していることが前提です。また、Sasame Javeフレームワークの全般的な機能と使用法を十分に理解していることも前提となります。詳細は、http://rdf4j.orgの文書リンクをクリックしてください。

RDF Semantic Graph support for OpenRDF Sesameは、Oracle Database RDF/OWLのセマンティク・データ管理機能を拡張します。

この章には次の主要なトピックがあります。

- RDF Semantic Graph support for OpenRDF Sesameの概要

- RDF Semantic Graph support for OpenRDF Sesameの設定と構成

- SEM_MATCHおよびRDF Semantic Graph support for OpenRDF Sesameの問合せの比較

- SPARQL問合せ処理の最適化

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

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

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

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

- RDF Semantic Graph support for OpenRDF SesameによるSesame Consoleの使用

- RDF Semantic Graph support for OpenRDF Sesameを使用する問合せ例

8.1 RDF Semantic Graph Support for OpenRDF Sesameの概要

RDF Semantic Graph support for Apache Jena (「RDF Semantic Graph Support for Apache Jena」を参照)と同じように、support for Sesameは、オープン・ソース・フレームワークと関連ツールを通じてOracleセマンティク・データに対するJavaベースのインタフェースを提供します。ただし、RDF Semantic Graph support for OpenRDF Sesameでは、データにコンテキストのサポートが追加されています。

- Jena文では、トリプル(主語、述語、目的語)を処理します。

- Sesame文では、トリプルとコンテキストを処理します(Sesame文は、トリプルとコンテキストで構成されるクワッドです)。たとえば、病院の患者データの場合、コンテキストには患者のURIが含まれます。

RDF Semantic Graph support for OpenRDF Sesameには、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へのグラフィカル・ユーザー・インタフェースです)。

support for Sesameによって提供される機能を次に示します。

- (コンテキスト付きおよびコンテキストなしの)文のロード(バルクおよび増分)、エクスポートおよび削除

- (コンテキスト付きおよびコンテキストなしの)データの問合せ

- 推論。推論データは(includeInferred=true場合)問合せ実行中に考慮され、推論トリプルのコンテキストはNULLです。

- 名前空間の管理

RDF Semantic Graph support for OpenRDF Sesameは、Sesame Storage and Inference Layer (SAIL) APIの様々なインタフェースを実装しています。たとえばクラスOracleSailConnectionは、Sesame SailConnectionインタフェースのOracle実装で、クラスOracleSailStoreはSesame SailインタフェースのOracle実装です。

support for Sesameの一般的な使用フローを、例8-1に抜粋して示します。

例8-1 RDF Semantic Graph support for OpenRDF Sesameの使用フロー例

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 RDF Semantic Graph support for OpenRDF Sesameの設定と構成

support for Sesameを設定および構成するには、次の手順を実行します。

1. ソフトウェア環境の設定

2. SPARQLサービスの設定

3. RDFセマンティク・グラフ環境の設定

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

support for Sesameを使用するには、システム環境に必要なソフトウェア(Oracle Database 11gリリース2以上に加えて、Spatial、GraphおよびPartitioningのオプション、RDFセマンティク・グラフのサポート、Sesameバージョン2.3.1、RDF Semantic Graph support for OpenRDF SesameおよびJDK 6以上)があることを、最初に確認しておく必要があります。次の手順を実行することによって、ソフトウェア環境を設定できます。

1. Oracle Database Enterprise Editionと、Oracle Spatial and GraphオプションおよびOracle Partitioningオプションをインストールします。

2. 「RDFセマンティク・グラフ・サポートの有効化」の説明に従い、RDFセマンティク・グラフ・サポートを有効にします。

3. ユーザー・ガイドの「Sesameライブラリを使用するための設定」の章で説明しているように、Sesame 2.3.1 onejarライブラリをダウンロードし、クラスパスに含めます。

4. ユーザー・ガイドの「サーバー・ソフトウェアのインストール」の章の説明に従って、Sesame 2.3.1 Serverをインストールします。

5. RDFセマンティク・グラフ・ページ(http://www.oracle.com/technetwork/database/options/semantic-tech/で「Downloads」をクリック)からRDF Semantic Graph support for OpenRDF Sesameをダウンロードして、(Linuxシステムの)/tmp/sesame_adapterなどの一時ディレクトリに解凍します。(この一時ディレクトリがまだ作成されていない場合は、解凍操作の前に作成します。)

RDF Semantic Graph support for OpenRDF Sesameのディレクトリとファイルの構造は、次のとおりです。

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サービスが設定されていない場合は、「SPARQLサービスの設定」の説明のとおりに準備します。

ソフトウェア環境を設定した後、「 RDFセマンティク・グラフ環境の設定」の説明にあるとおり、RDFセマンティク・グラフ環境でsupport for Sesameを使用して問合せを実行できることを確認します。

8.2.2 SPARQLサービスの設定

support for Sesameを使用して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)をダウンロードしてインストールします。

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. 「ソフトウェア環境の設定」の説明にあるとおり、RDF Semantic Graph support for OpenRDF Sesameがダウンロードされ解凍されていることを確認します。

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のホーム・ディレクトリを指しているとします。)

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問合せの実行対象になる関連セマンティク・データを含むデータベース・スキーマのユーザーとパスワードを指定できます。
このデータ・ソースの作成に関する情報は、「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レスポンスに、support for Sesame問合せ管理サーブレットによる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データ・ソースの作成」パネルで、次の値を入力または選択します。

名前: OracleSemDSOracleSemDS

JNDI名: OracleSemDS

データベース・タイプ: Oracle

データベース・ドライバ: Oracleのドライバ(Thin)・バージョン: 9.0.1,9.2.0,10,11

7. 「次へ」を2回クリックします。

8. 「接続プロパティ」パネルで、「データベース名」、「ホスト名」、「ポート」、「データベース・ユーザー名」(セマンティク・データを含むスキーマ)、「パスワード」のフィールドに適切な値を入力します。

9. 「次へ」をクリックします。

10. このOracleSemDSデータソースをデプロイするターゲット・サーバーまたはサーバーを選択します。

11. 「終了」をクリックします。

すべての変更がアクティブ化されており、再起動は必要ないというメッセージが表示されます。

8.2.2.2 SPARQLサービスの構成

OracleSailStore APIおよびその他の関連APIを使用してセマンティク・モデルを作成し、データを(増分またはバルク)ロードして論理推論を実行することができます。

セマンティク・モデルがOracle Databaseに格納された後、Sesame Console (「RDF Semantic Graph support for OpenRDF SesameによるSesame Consoleの使用」参照)を使用してSesame Serverに接続し、Oracleのセマンティク・モデル・ベースのリポジトリを作成することができます。たとえば、リポジトリIDmyOracleReposのリポジトリを作成し、これにはLUBMという名前のセマンティク・モデルとOWLPRIMEルールベースを使用するとします。

この新しく作成されたリポジトリは、Sesame Server上の新しいサービス・エンドポイントを提供します。

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

一部のアプリケーションでは長時間にわたるSPARQL問合せを終了できるようにする必要があるため、RDF Semantic Graph support for OpenRDF Sesameと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 RDFセマンティク・グラフ環境の設定

support for Sesameを使用して問合せを実行するには、(適切な権限を持つ)任意のユーザーで接続し、セマンティク・ネットワークで任意のモデルを使用します。RDFセマンティク・グラフ環境が要件をすでに満たしている場合は、support for Sesameを使用するJavaコードを直接コンパイルして実行することができます。support for Sesameを使用できるようにRDFセマンティク・グラフ環境を設定していない場合は、次の例のような手順を実行します。

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. (セマンティク・ネットワークとsupport for Sesameを使用するデータベースに接続するための)データベース・ユーザーを作成します。たとえば、次のようにします。

CREATE USER rdfusr IDENTIFIED BY <password-for-udfusr>
DEFAULT TABLESPACE rdf_users;

5. このデータベース・ユーザーに必要な権限を付与します。たとえば、次のようにします。

GRANT connect, resource TO rdfusr;

6. 自身のセマンティク・データとともにsupport for Sesameを使用するには、「セマンティク・データの使用に関するクイック・スタート」の説明のとおり、適切な手順を実行してデータを格納し、モデルとデータベース索引を作成します。その後に、Javaコードをコンパイルして実行することで問合せを実行します。問合せの例については、「RDF Semantic Graph support for OpenRDF Sesameを使用する問合せ例」を参照してください。

support for Sesameと提供されたサンプル・データの使用については、「RDF Semantic Graph support for OpenRDF Sesameを使用する問合せ例」を参照してください。

8.3 SEM_MATCHおよびRDF Semantic Graph support for OpenRDF Sesameの問合せの比較

Oracle Databaseに格納されているセマンティク・データを問い合せる方法は2つあります。SEM_MATCHベースのSQL文とRDF Semantic Graph support for OpenRDF Sesameを介したSPARQL問合せです。それぞれの方法での問合せは、表面的には類似していますが、動作には重要な違いがあります。アプリケーションの動作を一貫性のあるものにするには、SEM_MATCH問合せとSPARQL問合せの違いを理解し、その問合せ結果を処理する際に注意が必要です。

2つの方法を次の簡単な例で示します。

問合せ1 (SEM_MATCHベース)

select s, p, o
from table(sem_match('{?s ?p ?o}', sem_models('Test_Model'), ....))

問合せ2 (RDF Semantic Graph support for OpenRDF Sesameを介したSPARQL問合せ)

select ?s ?p ?o
where {?s ?p ?o}

これらの2つの問合せは、同じ種類の機能を実行しますが、いくつか重要な違いがあります。問合せ1 (SEM_MATCHベース)は次のようになります。

- Test_Modelからすべてのトリプルを読み取ります。

- URI、bNode、プレーン・リテラルおよび型付きリテラルを区別せず、長いリテラルを処理しません。

- 特定の文字('\n'など)はエスケープ解除しません。

問合せ2 (RDF Semantic Graph support for OpenRDF Sesameを介して実行されるSPARQL問合せ)もTest_Modelからすべてのトリプルを読み取ります(同じ基礎となるTest_Modelを参照しているModelOracleSemに対してコールを実行したと想定します)。ただし、問合せ2は次のようになります。

- (SEM_MATCH表関数による、s、pおよびo列のみではなく)追加の列を読み取り、URI、bNodes、プレーン・リテラル、型付きリテラルおよび長いリテラルを区別します。これによって、Sesame Nodeオブジェクトを適切に作成できるようになります。

- Oracle Databaseに格納される際にエスケープされる文字をエスケープ解除します。

2つの方法でのもう1つの違いは、空白ノード処理です。

- SEM_MATCHベースの問合せにおいて、空白ノードは常に定数とみなされます。

- SPARQL問合せにおいて、<と>で囲まれていない空白ノードは、問合せがsupport for Sesameを介して実行されるときに変数とみなされます。これは、SPARQL標準セマンティクと一致します。ただし、<と>で囲まれた空白ノードは、問合せが実行されるときに定数とみなされ、空白ノード・ラベルには、基礎となるデータのモデル化で必要とされる適切な接頭辞が、support for Sesameによって追加されます。

RDF Semantic Graph support for OpenRDF Sesame APIを使用して作成されるセマンティク・モデルの名前の最大長は、22文字です。

8.4 SPARQL問合せ処理の最適化

この項では、SPARQL問合せ処理を強化できる、RDF Semantic Graph support for OpenRDF Sesameのいくつかのパフォーマンス関連機能について説明します。これらの機能は、デフォルトでは自動的に実行されます。

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

DISTINCT、OPTIONAL、GRAPH、FILTER、UNION、ORDER BYおよびLIMITを含むSPARQL問合せは、SEM_MATCHテーブル・ファンクションに基づく単一のSQL問合せに変換されます。SPARQLのASK、DESCRIBEおよびCONSTRUCT問合せの場合、support for Sesameでは、追加の問合せ変換ロジックと中間層処理が使用されます。

SEM_MATCHに基づくSQL問合せの実行が失敗した場合、support for SesameではSesameの評価戦略を使用してその問合せを実行します。

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

RDF Semantic Graph support for OpenRDF Sesameを使用した問合せのパフォーマンスを改善するための推奨事項は次のとおりです。

- アプリケーション表での追加の結合の数を減らすため、SPARQL問合せのGRAPH句には、関連するトリプル・パターンのみを記述します。(説明は、「文の格納とRDF Semantic Graph Support for OpenRDF Sesameの問合せ文への影響」を参照)

- 名前付きグラフ問合せのGRAPH句内のトリプル・パターンに、NULLバインディングによる変数は使用しません。NULLバインディングは関連するアプリケーション表との結合でいずれの行も一致しないため、このバインディングは削除されます。

- 前述の理由により、GRAPH句内にOPTIONAL句、またはOPTIONAL句内にGRAPH句は記述しません。

- アプリケーション表のCONTEXT列(「文の格納とRDF Semantic Graph Support for OpenRDF Sesame問合せへの影響」を参照)には、空白ノードを使用しません(これは、2つの異なるセマンティク・モデルの名前付きグラフの空白ノードが同じラベルを持つ場合、それらが同じリソースとみなされてしまうためです)。これは、トリプル内の空白ノードには該当しません(異なるモデルのものは別々に格納されます)。

8.5.1 文の格納とRDF Semantic Graph Support for OpenRDF Sesame問合せへの影響

MDSYS.SEMM_model-nameビュー(「モデルのメタデータ」の表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構文への追加

RDF Semantic Graph support for OpenRDF Sesameでは、ヒントと追加の問合せオプションを渡すことができます。問合せオプションを含む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ヒントの使用に関する詳細は、「SEM_MATCH表関数を使用したセマンティク・データの問合せ」を、特にoptions属性でのHINT0キーワードに関する資料を参照してください。

8.6.2 追加のWHERE句述語

SEM_MATCH filter属性に、WHEREキーワードのないWHERE句の形式の文字列として、追加の選択基準を指定することができます。次の形式の1行を含めることで、追加の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のサポート

この項では、RDF Semantic Graph support for OpenRDF Sesameによって使用可能になるRDFセマンティク・グラフ機能の一部について説明します。使用可能な機能をサポートするAPIコールの包括的なドキュメントについては、RDF Semantic Graph support for OpenRDF Sesameのリファレンス情報(Javadoc)を参照してください。support for Sesameによって使用可能なサーバー側機能の詳細は、このマニュアルの関連する章を参照してください。

8.7.1 仮想モデルのサポート

仮想モデル(「仮想モデル」を参照)は、OracleSailStoreコンストラクタで指定され、透過的に処理されます。仮想モデルがモデルとルールベースの組合せのために存在している場合には、問合せの応答に使用されます。そのような仮想モデルが存在しない場合には、データベースに作成されます。

注意:

RDF Semantic Graph support for OpenRDF Sesameを介した仮想モデルのサポートは、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接続プーリングは、RDF Semantic Graph support for OpenRDF SesameのOraclePoolクラスを介して提供されます。通常、OraclePoolはOraclePool (DataSource ods)を使用してDataSourceで初期化されています。この場合、OraclePoolはデータソースの接続プーリング機能を使用しながらDataSourceの拡張ラッパーとして動作します。OracleSailStoreオブジェクトを作成するときには、storeコンストラクタ内にOraclePoolオブジェクトを作成するだけで十分です。続けて、support for Sesameによりデータベース接続が自動的に制御されるようになります。

明示的にOracle接続オブジェクト(基本的にデータベース接続ラッパーである)を取得する必要がある場合は、OraclePool.getOracleメソッドを起動します。接続を終了した後は、OraclePool.returnOracleメソッドを起動して、接続プールにオブジェクトを戻します。

OraclePoolは、OracleConnectionオブジェクトで初期化することもできます。この場合、このOraclePoolを参照するときに単一のデータベース接続のみが使用されます。複数のSesame SailConnectionオブジェクトが同じデータベース接続を使用することになるため、異なるSailConnectionオブジェクトにわたるダーティな読取りが起こり得ることを認識しておく必要があります。

OraclePoolの使用方法の詳細は、RDF Semantic Graph support for OpenRDF Sesameの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インタフェース

support for Sesameを介して、複数のセマンティクPL/SQLサブプログラムを使用することができます。表8-1に、サブプログラムと、対応するJavaクラスおよびメソッドを示します。

表8-1 PL/SQLサブプログラムと対応するsupport for Sesameの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ユーティリティ・サブプログラムの詳細は、「SEM_APISパッケージのサブプログラム」のリファレンス情報を参照してください。対応するJavaクラスとメソッドの詳細は、RDF Semantic Graph support for OpenRDF SesameのAPIリファレンス・ドキュメント(Javadoc)を参照してください。

8.7.4 推論オプション

setInferenceOption(String options)プロシージャとOracleSailConnectionオブジェクトを使用して、伴意コールにオプションを追加することができます。次の例では、伴意を作成するときに増分推論を有効化し、並列度の値を4に指定します。

conn.setInferenceOption("INC=T,DOP=4");

推論の詳細は、「OWL推論の使用方法」を参照してください。

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

この項では、RDF Semantic Graph support for OpenRDF SesameがSesame SailConnectionおよびSail APIに提供する拡張機能について説明します。

8.8.1 文の一意性

Sesame 2.3.0における文の一意性は、コンテキスト・レベルで実施されます。同じトリプルを単一のコンテキストで2回使用することはできません。support for Sesameでは、そのような一意性がコンテキスト、述語、主語および目的語での一意の索引を介して適用されます。ただし、support for Sesameの文の一意性はデフォルトでは有効になっていません。OracleSailStoreオブジェクトを構築するとき、文の一意性のデフォルト値はDONTCAREで、一意の索引がまだ存在していない場合に作成されない設定になっています。

OracleSailStoreコンストラクタ、enableUniquenessConstraintメソッドおよびdisableUniquenessConstraintメソッドのいずれかを使用した文の一意性に対する要件は、明示的に有効化することも無効化することもできます。

8.8.2 RDF Semantic Graph Support for Apache Jenaでの索引と相互運用性

OracleSailStoreオブジェクトに対してDML操作(特に削除)と名前付きグラフ問合せを実行する際は、アプリケーション表の索引がパフォーマンスを得るために重要です。新しくOracleSailStoreオブジェクトを作成するときに、デフォルトのCPSO索引が作成されます(C、P、S、Oは、コンテキスト、述語、主語および目的語の列を示します)。

RDF Semantic Graph support for OpenRDF SesameとRDF Semantic Graph support for Apache Jenaを使用して作成されるOracleセマンティク・モデルの間には、格納にいくつかの相違があります。たとえば、デフォルトのアプリケーション表索引がsupport for Apache Jenaでは異なります。RDF Semantic Graph support for Apache JenaモデルのデータにRDF Semantic Graph support for OpenRDF Sesameからアクセスするには(または逆の操作を行うには)、OracleUtils.migrateFromJenaメソッドとOracleUtils.migrateToJenaメソッドを使用します。これらのメソッドは、基礎となる記憶域構造に変更を行っている間、セマンティク・データを保持します。特に、RDF Semantic Graph support for OpenRDF SesameからRDF Semantic Graph support for Apache Jenaに移行すると、またはその逆に移行すると、すべてのトリプルはコンテキスト情報と一緒に保存されます。

例8-2に、RDF Semantic Graph support for OpenRDF SesameとRDF Semantic Graph support for Apache Jenaを使用して作成されたモデル間の移行を示します。

例8-2 RDF Semantic Graph support for Apache JenaモデルとRDF Semantic Graph support for OpenRDF Sesameモデルの間での移行

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オブジェクトの伴意を構築します。

「伴意」の詳しい作成方法は、「伴意(ルール索引)」を参照してください。

8.8.4 分析操作の実行

大量のセマンティク・データをデータベースにロードした後、推論を実行する前に、アプリケーション表、セマンティク・モデルおよび推論されたグラフ(存在する場合)を分析することを強くお薦めします。分析操作を実行することで統計情報が収集され、問合せの応答時にOracleオプティマイザが効率的な実行計画を選択しやすくなります。

関連する統計を収集するには、OracleSailConnectionクラスおよびOracleSailStoreクラスで、次のメソッドを使用します。

- OracleSailConnection.analyze

- OracleSailConnection.analyzeApplicationTable

- OracleSailConnection.analyzeInferredGraph

パラメータを含むこれらのメソッドの詳細は、RDF Semantic Graph support for OpenRDF Sesameのリファレンス情報(Javadoc)を参照してください。

8.9 RDF Semantic Graph support for OpenRDF SesameによるSesame Consoleの使用

OpenRDF.orgの説明のとおり、Sesame Consoleは、Sesameと対話するためのコマンドライン・アプリケーションです。現時点で、SYSTEMリポジトリにリポジトリを作成し、管理するための最適な方法は、Sesame Consoleを使用することです。Sesame Consoleに関する基本的な使用方法とリファレンス情報については、http://docs.rdf4j.org/のドキュメントを参照してください。

この項では、RDF Semantic Graph support for OpenRDF SesameでSesame Consoleを使用する方法について説明します。

Sesame Consoleコマンドライン・ツールを使用して、新たにSAILリポジトリ(OracleSailStoreオブジェクト)を作成するには、次のコマンドを使用します。

create oracle.

パラメータの入力を求められたら、次の項目を指定します。

リポジトリID

リポジトリに対応するID文字列。例: myOracleRepos

リポジトリタイトル

リポジトリに対応するタイトル・文字列。例: My Oracle Repository

モデル名

このリポジトリに対応するOracleセマンティク・モデルの名前。すべてのDML操作は、このモデルに対して実行されます。

追加のモデル

このリポジトリに含める追加のセマンティク・モデルのカンマ区切りリスト。推論と問合せの操作にのみ使用される追加のモデル。

ルールベース

このリポジトリの伴意閉包を構築するときに考慮されるルールベースのカンマ区切りリスト。デフォルトではルールベースはなく、推論は実行されません。

仮想モデルの使用(TRUE|FALSE) [TRUE]

問合せに応答する際に、仮想モデルを使用するかどうかを指定します。デフォルトはTRUEで、仮想モデルが使用されます。

仮想モデル名

Use Virtual ModelがTRUEの場合、リポジトリを所有するデータベース・ユーザーに、指定された仮想モデルでの読取り権限がある場合は、問合せの応答に使用される仮想モデルの名前を指定します。

推論メンテナンスモード(NO_UPDATE|UPDATE_WHEN_COMMIT) [NO_UPDATE]

コミット操作ごとに伴意閉包を更新する(UPDATE_WHEN_COMMIT)か、OracleSailConnection.performInferenceメソッドが起動されたときにのみにする(NO_UPDATE)かを指定します。デフォルトは、NO_UPDATEです。

問合せの重複を許可+(TRUE|FALSE) [TRUE]

追加のモデルがあるリポジトリを問い合せるときに、問合せのレスポンスに異なるモデルにわたる重複を含めることができるかどうかを指定します。デフォルトはTRUEで、重複を含めることを許可し、問合せのパフォーマンスを高速化します。

無効な推論ステータスでの問合せを許可(INVALID|VALID|INCOMPLETE) [INVALID]

伴意が更新されない問合せを許可する(推論ステータスは無効)かどうかを指定します。デフォルト値はINVALIDで、問合せの際の伴意ステータスはINVALIDになる場合があります。

伴意ステータスが有効な場合にのみ問合せを許可するには、VALIDを指定します。伴意のステータスが有効または不完全な場合の問合せを許可するには、INCOMPLETEを指定します。

アプリケーション表索引[CPSO]

このリポジトリのアプリケーション表に作成されるカスタム索引を指定します。C (コンテキスト)、P (プロパティ)、S (述語)、O (目的語)のうち、4つまでの文字列を使用して含められる列(およびその順序)を指定できます。(これらの文字のみが使用可能で、二重に使用することはできません。)デフォルトはCPSOで、先行列としてコンテキストを持つ4つの列すべてで索引を作成します。

索引オプション: 並列度[1]

アプリケーション表索引に対するDOP(並列度)の値を指定します。マルチコアまたはマルチCPUのプロセッサで、異なるDOP値(4または8など)を試すと、パフォーマンスが向上する場合があります。デフォルトは1(並列度なし)です。

索引オプション: 圧縮する接頭辞長[2]

アプリケーション表の索引でキー圧縮を使用するかどうかを指定します。デフォルトは2で、最初の2列での圧縮を指定します。値が0 (ゼロ)の場合、圧縮は使用されません。

一意性を強制(FALSE|TRUE) []

リポジトリ内の複数のコンテキストにわたって文の一意性を強制するかどうかを指定します。文の一意性は、アプリケーション表の一意の索引によって強制されることに注意してください。デフォルトは[] (値は指定されない)で、モデルが存在する場合は、一意性の設定がそのモデルから継承され、モデルが存在しない場合は、一意でない索引が作成されます。

FALSEを指定していて一意の索引が存在する場合、その索引は削除され、一意でない索引として再作成されます。

データソース名[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 RDF Semantic Graph support for OpenRDF Sesameを使用する問合せ例

この項では、RDF Semantic Graph support for OpenRDF Sesameを使用した問合せの例を示します。それぞれの例は個々に完結しており、通常は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ソース・ファイルに含めます。この項で使用される例は、RDF Semantic Graph support for OpenRDF Sesameダウンロードの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に、アプリケーション表の索引を無効にし、RDFファイルからXML形式でバルク・ロード操作を実行した後に索引を再度有効にする、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

この例を実行するために、「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と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

この例を実行するために、「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]

9 ユーザー定義の推論と問合せ

注意:

この章で説明する機能は、上級ユーザーを対象としています。「RDFセマンティク・グラフの概要」と「OWLの概要」で説明される主要な概念と技術について、十分に理解していることが前提です。

この章では、Oracle Database 12cリリース1 (12.1)で使用可能であり、ユーザー定義機能を追加できるRDFセマンティク・グラフの拡張アーキテクチャについて説明します。

- 「ユーザー定義の推論」の説明にあるとおり、推論の拡張アーキテクチャによって、すでに提供されている推論のサポートに加えて、ユーザー定義の推論が使用可能になります。

- 「ユーザー定義ファンクションと集計」の説明にあるとおり、問合せの拡張アーキテクチャを使用すると、ユーザー定義ファンクションと集計を追加してSPARQL問合せで使用できるようになります。これには、SEM_MATCHテーブル・ファンクションと、support for Apache Jenaおよびsupport for OpenRDF Sesameも使用されます。

9.1 ユーザー定義の推論

RDFセマンティク・グラフの推論の拡張アーキテクチャによって、すでに提供されている推論のサポートに加えて、ユーザー定義の推論が使用可能になります。

この項には、次の主要なトピックがあります。

- ユーザー定義の推論によって解決される問題と得られる利点

- ユーザー定義の推論のAPIサポート

- ユーザー定義の推論拡張ファンクションの例

9.1.1 ユーザー定義の推論によって解決される問題と得られる利点

Oracle Database 12cリリース(12.1)よりも前のOracle Database推論エンジンでは、OWL 2 RL、RDFS、SKOS、SNOMED (コアEL)およびユーザー定義ルールに対するネイティブ・サポートが提供され、広範なアプリケーションと要件に対応していました。一方で、新しいRDFリソースを作成してルール推論プロセスに追加することができないという制限がありました。

Oracle Database 12c リリース(12.1)よりも前の機能と制限の例として、次の簡単な推論ルールを考えてみます。

?C   rdfs:subClassOf  ?D .
?x    rdf:type  ?C  .  ==>  ?x   rdf:type  ?D

前述のルールでは、インスタンスxのサブクラスCは、インスタンスCのスーパークラスDになる、としています。ルールに対応する部分は、2つの変数 ?xと?Dを示しています。ただし、これらの変数はルールの前件部分に存在している必要があり、さらにこれらのRDFリソースはナレッジ・ベース内に存在している必要があります。いいかえると、たとえばJohnがGraduateStudentとして存在しており、その公理によってGraduateStudentクラスはStudentクラスのサブクラスであると指定されている場合にのみ、JohnがStudentであると導出されます。

もう1つの制限の例は、Oracle Database 12cリリース(12.1)よりも前の推論関数では、推論プロセスの新しいRDFリソースとしてフルネームを生成するために姓と名を組み合せることがサポートされていなかったことです。この要件は、具体的には、次のようなルールとして取得されます。

?x   :firstName  ?fn
?x   :lastName   ?ln  ==>  ?x  :fullName  concatenate(?fn ?ln)

Oracle Database 12cリリース1 (12.1)では、RDFセマンティク・グラフ推論拡張アーキテクチャによって、推論プロセスでユーザーが独自の推論拡張関数を実装し、これをネイティブの推論プロセスに統合できるようになりました。このアーキテクチャにより、次のことが実現されています。

- 新しいRDFリソースの生成を必要とするルールをサポートします。
たとえば、文字列または他の文字列操作の連結、数学的な計算およびWebサービス・コールアウトがあります。

- 特定の既存のルールをカスタマイズされた最適化を使用して実装することができます。
ネイティブOWL推論エンジンには、多数のルールのための最適化があり、これらのルールは様々な大規模なオントロジには効率的に動作しますが、試されてないいくつかの新しいオントロジについては、特定の推論コンポーネントをカスタマイズした最適化の方が効果的に動作する場合があります。この場合は、SEM_APIS.CREATE_ENTAILMENTコールの特定の推論コンポーネントを無効にし、 新しい最適化を実装する、カスタマイズした推論拡張機能関数を指定することができます(inf_ext_user_func_nameパラメータを使用)。

- 洗練された推論機能を使用して推論エンジンを拡張することができます。
たとえば、地理空間推論、時間間隔推論、テキスト解析機能のネイティブのデータベース推論プロセスへの統合があります。

9.1.2 ユーザー定義の推論のAPIサポート

ユーザー定義の推論のための主要なアプリケーション・プログラミング・インタフェース(API)は、SEM_APIS.CREATE_ENTAILMENTプロシージャの特に最後のパラメータです。

inf_ext_user_func_name  IN VARCHAR2 DEFAULT NULL

inf_ext_user_func_nameパラメータを指定すると、使用したい特定のロジックを実装する、1つ以上のユーザー定義の推論関数が指定されます。各ユーザー定義の推論関数は、「ユーザー定義推論関数の要件」に説明されている要件とガイドラインに従っている必要があります。

9.1.2.1 ユーザー定義の推論ファンクションの要件

SEM_APIS.CREATE_ENTAILMENTプロシージャへのコールで、inf_ext_user_func_nameパラメータに指定される各ユーザー定義の推論関数は、次のとおりである必要があります。

- 名前は文字列SEM_INF_で始まります。

- 起動者の権限ではなく定義者の権限で作成されます。(定義者権限と起動者権限については、『Oracle Databaseセキュリティ・ガイド』を参照してください。)

ユーザー定義の推論関数の形式は、次のSEM_INF_EXAMPLEという架空の関数の例に示すような形式です。

create or replace function sem_inf_example(
src_tab_view         in  varchar2,
resource_id_map_view in  varchar2,
output_tab           in  varchar2,
action               in  varchar2,
num_calls            in  number,
tplInferredLastRound in  number,
options              in  varchar2 default null,
optimization_flag    out number,
diag_message         out varchar2
)
return boolean
as
pragma autonomous_transaction;
begin
if (action = SDO_SEM_INFERENCE.INF_EXT_ACTION_START) then
<... preparation work ...>
end if;
if (action = SDO_SEM_INFERENCE.INF_EXT_ACTION_RUN) then
<... actual inference logic ...>
commit;
end if;
if (action = SDO_SEM_INFERENCE.INF_EXT_ACTION_END) then
<... clean up ...>
end if;
return true;  -- succeed
end;
/
grant execute on sem_inf_example to MDSYS;

ユーザー定義関数の形式で、optimization_flag出力パラメータは、数値に対応する1つ以上のOracle定義の名前を指定できます。次の1つ以上を指定できます。

- SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_NONEは、推論エンジンが拡張関数の最適化を有効にしないことを示します。(optimization_flagパラメータが設定されていないとき、これが推論エンジンのデフォルトの動作です。)

- SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_ALL_IDSは、拡張関数によって推論されたすべてのトリプル/クワッドがリソースIDのみを使用することを示します。つまり、output_tab表にはリソースID(列gid、sid、pidおよびoid)のみが含まれ、語彙の値(列g、s、pおよびoはすべてのNULLです)は含まれません。この最適化フラグを有効化すると、推論エンジンは、リソースID参照をスキップすることができます。

- SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_NEWDATA_ONLYは、拡張関数によって推論されるすべてのトリプル/クワッドが新規であり、src_tab_view内に存在しないことを示します。この最適化フラグを有効化すると、推論エンジンでoutput_tab表とsrc_tab_viewとの間の重複チェックをスキップすることができます。src_tab_viewには、拡張関数から推論されたトリプル/クワッドと、前回の推論ラウンドからのトリプル/クワッドが含まれることに注意してください。

- SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_UNIQDATA_ONLYは、拡張関数によって推論されるすべてのトリプル/クワッドが一意であり、output_tab表内に存在しないことを示します。この最適化フラグを有効化すると、推論エンジンでoutput_tab表内の重複チェックをスキップすることができます(たとえば拡張関数で2回推論された同じトリプルをチェックする必要がありません)。拡張関数の各推論ラウンドの最初のoutput_tab表は空であり、データの一意性を保つ必要があるのは現在の推論ラウンドでのみであることに注意してください。

- SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_IGNORE_NULLは、主語、述語または目的語のリソースがNULLのとき、推論されたトリプルまたはクワッドが推論エンジンで無視されることを示します。推論エンジンは、output_tab表で両方の列がNULLのとき、リソースをNULLとみなします (たとえば、s列とsid列が両方ともNULLの場合、主語はNULL)。この最適化フラグを有効化すると、推論エンジンでoutput_tab表の無効なトリプル/クワッドをスキップすることができます。推論エンジンは、NULLのグラフ列(gとgid)をデフォルトのグラフとして解釈することに注意してください。

optimization_flag出力パラメータに複数の値を指定するには、プラス記号(+)を使用して値を連結します。次に例を示します。

optimization_flag := SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_ALL_IDS +
SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_NEWDATA_ONLY +
SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_UNIQDATA_ONLY;

optimization_flag出力パラメータの使用の詳細は、「例3: パフォーマンスの最適化」を参照してください。

9.1.3 ユーザー定義の推論拡張ファンクションの例

次の例に、ユーザー定義の推論拡張ファンクションを使用して伴意を作成する方法を示します。

- 例1: 静的トリプルの追加、例2: 動的トリプルの追加および例3: パフォーマンスの最適化 は、ユーザー定義の推論の拡張に関する基本を扱っています。
例1: 静的トリプルの追加および例2: 動的トリプルの追加は、推論されたトリプルの新規追加にフォーカスしています。

例3: パフォーマンスの最適化は、パフォーマンスの最適化にフォーカスしています。

- 例4: 時間推論(いくつかの関連する例)と例5: 空間推論は、Oracleのネイティブの型と演算子を利用することによって、特殊なデータ型を効率的に処理する方法を示します。
例4: 時間推論(いくつかの関連する例)は、xsd:dateTimeデータ型にフォーカスしています。

例5: 空間推論は、地理空間データ型にフォーカスしています。

- 例6: Webサービスのコールは、Oracle GeocoderサービスへのWebサービス・コールを行います。

最初の3つの例では、モデルEMPLOYEESが存在し、(Turtle形式で表示された)次のセマンティク・データが含まれていることを前提としています。

:John   :firstName  "John"  ;
:lastName   "Smith" .

:Mary   :firstName  "Mary"  ;
:lastName   "Smith" ;
:name       "Mary Smith" .

:Alice  :firstName  "Alice" .

:Bob    :firstName  "Bob" ;
:lastName   "Billow" .

ユーザー定義の推論拡張ファンクションの作成に関する要件とガイドラインについては、「ユーザー定義推論のAPIサポート」を参照してください。

9.1.3.1 例1: 静的トリプルの追加

ユーザー定義の推論の拡張ファンクションで新しいデータを推論する最も基本的な方法は、静的データの追加です。静的データは、モデルに既存のデータに依存しません。このことは、ユーザー定義の推論の拡張ファンクションにとって一般的な例でありませんが、伴意へのトリプルの追加に関する基本を示しています。既存のオントロジを拡張するための準備フェーズ(つまりaction='START')では、静的データの挿入の方が、より一般的に実行されます。

次のユーザー定義の推論拡張関数(sem_inf_static)は、伴意に3つの静的トリプルを追加します。

-- this user-defined rule adds static triples
create or replace function sem_inf_static(
src_tab_view         in  varchar2,
resource_id_map_view in  varchar2,
output_tab           in  varchar2,
action               in  varchar2,
num_calls            in  number,
tplInferredLastRound in  number,
options              in  varchar2 default null,
optimization_flag    out number,
diag_message         out varchar2
)
return boolean
as
query varchar2(4000);
pragma autonomous_transaction;
begin
if (action = 'RUN') then
-- generic query we use to insert triples
query :=
'insert /*+ parallel append */ into ' || output_tab ||
' ( s,  p,  o) VALUES ' ||
' (:1, :2, :3) ';

-- execute the query with different values
execute immediate query using
'<http://example.org/S1>', '<http://example.org/P2>', '"O1"';

execute immediate query using
'<http://example.org/S2>', '<http://example.org/P2>', '"2"^^xsd:int';

-- duplicate quad
execute immediate query using
'<http://example.org/S2>', '<http://example.org/P2>', '"2"^^xsd:int';

execute immediate query using
'<http://example.org/S3>', '<http://example.org/P3>', '"3.0"^^xsd:double';

-- commit our changes
commit;
end if;

-- return true to indicate success
return true;
end sem_inf_static;
/
show errors;

sem_inf_static関数は、SQL挿入問合せを実行(挿入のターゲット表としてoutput_tabを使用)することで、新しいデータを挿入します。output_tab表には、現在のコール(num_callsパラメータを参照)中にsem_inf_static関数によって追加されるトリプルのみが含まれることになります。推論エンジンは、ユーザー定義の推論拡張関数を常に3回以上(アクション・パラメータ('START'、'RUN'および'END')で取り得る値ごとに1回)コールします。sem_inf_staticは準備またはクリーンアップを実行する必要がないため、関数ではRUNフェーズでデータが追加されるのみです。拡張関数では、現在の推論ラウンド中に推論されるデータに応じて、RUNフェーズの間に複数回コールできます。

sem_inf_static関数では、既存のトリプルに対する(重複トリプルを防ぐための)チェックは行いませんが、結果の伴意に重複トリプルを生成することはありません。重複は推論エンジンによってoutput_tab表(拡張関数によって挿入されるデータ)からフィルタ処理された後、最終的な伴意(モデルまたは他の推論データ)からもフィルタ処理されます。適切な最適化フラグを設定する(optimization_flagパラメータを使用する)ことで、この便利な機能は使用されず、パフォーマンスが向上します。(最適化フラグの詳細は、「例3: パフォーマンスの最適化」を参照してください。)

output_tabの表定義にはグラフ名の列が表示されていますが、グローバル推論( SEM_APIS.CREATE_ENTAILMENTのデフォルトの動作)と名前付きグラフ・グローバル推論(NGGI)を実行すると、推論エンジンは、拡張関数によって追加されるトリプルですべてのグラフ名を無視して、オーバーライドします。ユーザー定義の拡張ファンクションで、特定の名前付きグラフにトリプルを追加するには、NGLI (名前付きグラフ・ローカル推論)を使用します。NGLIでは、すべてのトリプルが名前付きグラフに属している必要があります(output_tabのgid列とg列の両方がNULLではないことが必要です)。

MDSYSユーザーには、sem_inf_static関数を推論に使用するため、この実行権限が必要です。次の例は、sem_inf_static関数に適切な権限を付与し、(OWLPRIME推論ロジックとともに)関数を使用して伴意を作成する方法を示しています。

-- grant appropriate privileges
grant execute on sem_inf_static to mdsys;

-- create the entailment
begin
sem_apis.create_entailment(
'EMPLOYEES_INF'
, sem_models('EMPLOYEES')
, sem_rulebases('OWLPRIME')
, passes => SEM_APIS.REACH_CLOSURE
, inf_ext_user_func_name => 'sem_inf_static'
);
end;
/

次の例は、新しい伴意データを示しています。

-- formatting
column s format a23;
column p format a23;
column o format a23;
set linesize 100;

-- show results
select s, p, o from table(SEM_MATCH(
'select ?s ?p ?o where { ?s ?p ?o } order by ?s ?p ?o'
, sem_models('EMPLOYEES')
, sem_rulebases('OWLPRIME')
, null, null, null
, 'INF_ONLY=T'));

前述の問合せは、sem_inf_staticによって追加される3つの一意の静的トリプルを重複なしで戻します。

S                      P                      O
---------------------- ---------------------- -----------------------
http://example.org/S1  http://example.org/P2  O1
http://example.org/S2  http://example.org/P2  2
http://example.org/S3  http://example.org/P3  3E0

9.1.3.2 例2: 動的トリプルの追加

静的データの追加は有用ですが、通常は準備(action='START')フェーズの間に実行されます。動的データを追加するには、モデル内の既存のデータを参照し、その既存のデータに基づいて新しいデータを生成します。これは、ユーザー定義の推論拡張ファンクションの最も一般的なケースです。

次のユーザー定義の推論拡張関数(sem_inf_dynamic)は、従業員のフルネームを表す新しいトリプルを作成するために、姓と名を連結します。

-- this user-defined rule adds static triples
create or replace function sem_inf_dynamic(
src_tab_view         in  varchar2,
resource_id_map_view in  varchar2,
output_tab           in  varchar2,
action               in  varchar2,
num_calls            in  number,
tplInferredLastRound in  number,
options              in  varchar2 default null,
optimization_flag    out number,
diag_message         out varchar2
)
return boolean
as
firstNamePropertyId number;
lastNamePropertyId  number;
fullNamePropertyId  number;

sqlStmt    varchar2(4000);
insertStmt varchar2(4000);
pragma autonomous_transaction;
begin
if (action = 'RUN') then
-- retrieve ID of resource that already exists in the data (will
-- throw exception if resource does not exist). These will improve
-- performance of our SQL queries.
firstNamePropertyId := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/firstName');
lastNamePropertyId  := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/lastName');
fullNamePropertyId  := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/name');

-- SQL query to find all employees and their first and last names
sqlStmt :=
'select ids1.sid employeeId,
values1.value_name firstName,
values2.value_name lastName
from   ' || resource_id_map_view || ' values1,
' || resource_id_map_view || ' values2,
' || src_tab_view || '         ids1,
' || src_tab_view || '         ids2
where  ids1.sid = ids2.sid
AND  ids1.pid = ' || to_char(firstNamePropertyId,'TM9') || '
AND  ids2.pid = ' || to_char(lastNamePropertyId,'TM9')  || '
AND  ids1.oid = values1.value_id
AND  ids2.oid = values2.value_id
/* below ensures we have NEWDATA (a no duplicate optimization flag) */
AND  not exists
(select 1
from   ' || src_tab_view || '
where  sid = ids1.sid AND
pid = ' || to_char(fullNamePropertyId,'TM9') || ')';

-- create the insert statement that concatenates the first and
-- last names from our sqlStmt into a new triple.
insertStmt :=
'insert /*+ parallel append */
into ' || output_tab || ' (sid, pid, o)
select employeeId, ' || to_char(fullNamePropertyId,'TM9') || ', ''"'' || firstName || '' '' || lastName ||  ''"''
from   (' || sqlStmt || ')';

-- execute the insert statement
execute immediate insertStmt;

-- commit our changes
commit;

-- set our optimization flags indicating we already checked for
-- duplicates in the model (src_tab_view)
optimization_flag := SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_NEWDATA_ONLY;
end if;

-- return true to indicate success
return true;
end sem_inf_dynamic;
/
show errors;

sem_inf_dynamic関数は、2つの主要な手順を使用して新しいデータを挿入します。最初にファンクションは、既存のデータからすべての姓と名を収集するSQL問合せを構築します。このSQL問合せをsqlStmt変数に格納します。次にファンクションは、収集する姓と名を使用して新しいトリプルを挿入し、従業員ごとにフルネームを生成します。このSQL問合せをinsertStmt変数に格納します。副問合せでINSERTを実行しているため、insertStmt問合せにはsqlStmt問合せが含まれることに注意してください。

sqlStmt問合せは、リソース・ビュー(resource_id_map_view)と既存のデータ・ビュー(src_tab_view)の2つの主なビュー全体で結合を実行します。既存のデータ・ビューにはすべての既存のトリプルが含まれますが、それらのトリプルの値は、字句の値ではなく数値IDを使用して格納されます。sqlStmt問合せは従業員の姓と名の字句の値を抽出する必要があるため、リソース・ビューで2回結合を実行します(1回は姓でもう1回は名)。

sqlStmt問合せには、パフォーマンスの向上に役立てるためのPARALLEL SQLヒントが含まれます。均等なハードウェア構成でのパラレル実行は、パフォーマンスを大幅に向上させることができます。(詳細は、「例3: パフォーマンスの最適化」を参照してください。)

insertStmt問合せでは、既存のデータ・ビュー(src_tab_view)にすでに存在するトリプルが追加されることのないように、重複チェックも実行します。関数は、このチェックをINF_EXT_OPT_FLAG_NEWDATA_ONLY最適化フラグを有効にすることで実行したことを示しています。拡張ファンクション内部でチェックを実行すると、推論の全体的なパフォーマンスが向上します。既存のデータ・ビューには、sem_inf_dynamic関数によって現在追加されている新しいトリプルが含まれないため、output_tab表内にはまだ重複が存在している場合があることに注意してください。sem_inf_dynamic関数でoutput_tab表の重複を詳細にチェックする場合、INF_EXT_OPT_FLAG_UNIQUEDATA_ONLY最適化フラグを有効にすることもできます。

両方のSQL問合せは、結合と挿入を実行するためにRDFリソースの数値IDを使用します。字句の値ではなくIDを使用すると、問合せのパフォーマンスが向上します。sem_inf_dynamic関数では、使用する予定の字句の値のIDを調べることによるパフォーマンスの利点を活用します。この場合ファンクションは、名、姓およびフルネーム・プロパティを表す3つのURIを調べます。sem_inf_dynamic関数が、すべての新しいトリプルを完全にIDとして挿入した場合、INF_EXT_OPT_FLAG_ALL_IDS最適化フラグを有効にできます。ただし、この場合、新しいトリプルにはそれぞれ単一の新しい字句値(従業員のフルネーム)が含まれます。

sem_inf_dynamic関数で伴意を作成するには、次のように、MDSYSユーザーに実行権限を付与し、SEM_APIS.CREATE_ENTAILMENTプロシージャに関数名を渡します。

-- grant appropriate privileges
grant execute on sem_inf_dynamic to mdsys;

-- create the entailment
begin
sem_apis.create_entailment(
'EMPLOYEES_INF'
, sem_models('EMPLOYEES')
, sem_rulebases('OWLPRIME')
, passes => SEM_APIS.REACH_CLOSURE
, inf_ext_user_func_name => 'sem_inf_dynamic'
);
end;
/

伴意には、sem_inf_dynamicによって追加される次の2つの新しいトリプルを含める必要があります。

S                        P                        O
------------------------ ------------------------ -----------------------
http://example.org/Bob   http://example.org/name  Bob Billow
http://example.org/John  http://example.org/name  John Smith

前述の例で、sem_inf_dynamic関数がMary Smithのフルネームを推論しなかったことに注意してください。Mary Smithは、既存のデータですでにフルネームが指定されていたためです。

9.1.3.3 例3: パフォーマンスの最適化

いくつかの技術によって、推論拡張ファンクションのパフォーマンスを向上させることができます。そのような技術の1つは、問合せにおいて、リソースの字句の値ではなく数値IDを使用することです。リソースIDのみを使用することにより、拡張関数はリソース・ビュー(resource_id_map_view)を使用する結合を回避し、問合せパフォーマンスを大幅に向上させることができます。推論拡張関数で、新しいトリプルをoutput_tab表に追加する際にリソースIDを使用する(つまり、output_tab表のgid列、sid列、pid列およびoid列のみを使用する)ことによっても、さらにパフォーマンスを向上できます。

次のユーザー定義の推論拡張関数(sem_inf_related)は、同じ姓を持つ従業員について、新規プロパティ:possibleRelativeを推論します。そのような従業員を見つけるためのSQL問合せは、リソースIDのみを使用 (字句の値、リソース・ビューとの結合を使用しない)します。また、この例の推論拡張関数は、リソースIDのみを使用して新しいトリプルを挿入し、関数でINF_EXT_OPT_FLAG_ALL_IDS最適化フラグを有効にすることができます。

-- this user-defined rule adds static triples
create or replace function sem_inf_related(
src_tab_view         in  varchar2,
resource_id_map_view in  varchar2,
output_tab           in  varchar2,
action               in  varchar2,
num_calls            in  number,
tplInferredLastRound in  number,
options              in  varchar2 default null,
optimization_flag    out number,
diag_message         out varchar2
)
return boolean
as
lastNamePropertyId  number;
relatedPropertyId   number;

sqlStmt    varchar2(4000);
insertStmt varchar2(4000);
pragma autonomous_transaction;
begin
if (action = 'RUN') then
-- retrieve ID of resource that already exists in the data (will
-- throw exception if resource does not exist).
lastNamePropertyId := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/lastName');

-- retreive ID of resource or generate a new ID if resource does
-- not already exist
relatedPropertyId := sdo_sem_inference.oracle_orardf_add_res('http://example.org/possibleRelative');

-- SQL query to find all employees that share a last name
sqlStmt :=
'select ids1.sid employeeId,
ids2.sid relativeId
from   ' || src_tab_view || '         ids1,
' || src_tab_view || '         ids2
where  ids1.pid = ' || to_char(lastNamePropertyId,'TM9') || '
AND  ids2.pid = ' || to_char(lastNamePropertyId,'TM9') || '
AND  ids1.oid  = ids2.oid
/* avoid employees related to themselves */
AND  ids1.sid != ids2.sid
/* below ensures we have NEWDATA (a no duplicate optimization flag) */
AND  not exists
(select 1
from   ' || src_tab_view || '
where  sid = ids1.sid
AND  pid = ' || to_char(relatedPropertyId,'TM9') || '
AND  oid = ids2.sid)
/* below ensures we have UNIQDATA (a no duplicate optimization flag) */
AND  not exists
(select 1
from   ' || output_tab || '
where  sid = ids1.sid
AND  pid = ' || to_char(relatedPropertyId,'TM9') || '
AND  oid = ids2.sid)';

-- create the insert statement that only uses resource IDs
insertStmt :=
'insert /*+ parallel append */
into ' || output_tab || ' (sid, pid, oid)
select employeeId, ' || to_char(relatedPropertyId,'TM9') || ', relativeId
from   (' || sqlStmt || ')';

-- execute the insert statement
execute immediate insertStmt;

-- commit our changes
commit;

-- set flag indicating our new triples
--   1) are specified using only IDs
--   2) produce no duplicates with the model (src_tab_view)
--   3) produce no duplicates in the output (output_tab)
optimization_flag := SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_ALL_IDS +
SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_NEWDATA_ONLY +
SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_UNIQDATA_ONLY;
end if;

-- return true to indicate success
return true;
end sem_inf_related;
/
show errors;

sem_inf_related関数には、前述の例と少数の重要な違いがあります。1つ目に、sem_inf_related関数は、リソースIDのみを使用して問合せを行い、リソースIDのみを使用して新しいトリプルを挿入します。output_tab表に追加されたすべてのトリプルはリソースIDのみを使用するため、関数はINF_EXT_OPT_FLAG_ALL_IDS最適化フラグを有効にできます。パフォーマンスを最適化するため、ファンクションは字句の値全体にリソースIDを使用する必要があります。ただし、これができない場合があります。例2: 動的トリプルの追加のように、新しい字句の値を生成するために字句の値を連結する場合です。例2: 動的トリプルの追加のような場合、SQL問合せでoracle_orardf_res2vidへのコールを埋め込むよりも、リソース・ビュー(resource_id_map_view)を使用して結合することを、通常はお薦めします。これは、別の表を使用した結合とは対照的に、取り得る値ごとにファンクションをコールするオーバーヘッドによります。

sem_inf_related関数のもう1つの大きな違いは、oracle_orardf_add_res関数(oracle_orardf_res2vidと比較して)の使用です。res2vid関数とは異なり、リソースが存在しない場合は、add_res関数がリソース・ビュー(resource_id_map_view)にリソースを追加します。リソース・ビューにリソースを追加することが重要でない場合、推論拡張機能関数はadd_res関数を使用する必要があります。ファンクションを複数回コールしても、重複エントリはリソース・ビューに生成されません。

最後の重要な違いは、SQL問合せに追加されたNOT EXISTS 句です。最初のNOT EXISTS句は、すでにモデルに存在するトリプルまたは他のルール(src_tab_view)によって、推論されるトリプルが重複するかもしれないトリプルの追加を回避しています。このような重複をチェックすることで、sem_inf_relatedでINF_EXT_OPT_FLAG_NEWDATA_ONLY最適化フラグを有効にすることができます。2番目のNOT EXISTS句は、現在の推論ラウンド中(num_callsパラメータを参照)の間にsem_inf_related関数によってoutput_tab表に追加されたトリプルが重複するかもしれないトリプルを追加することを避けます。このような重複をチェックすることで、sem_inf_relatedでINF_EXT_OPT_FLAG_UNIQDATA_ONLY最適化フラグを有効にすることができます。

sem_inf_dynamicの例と同様に、sem_inf_relatedの例は、その挿入文でPARALLEL SQL問合せヒントを使用します。均等なハードウェア構成でのパラレル実行は、パフォーマンスを大幅に向上させることができます。データ集中型のアプリケーションの場合、通常、適切な入出力サブシステムは、システム全体のパフォーマンスに対する重要な構成要素です。

sem_inf_dynamic関数で伴意を作成するには、次のように、MDSYSユーザーに実行権限を付与し、SEM_APIS.CREATE_ENTAILMENTプロシージャに関数名を渡します。

-- grant appropriate privileges
grant execute on sem_inf_related to mdsys;

-- create the entailment
begin
sem_apis.create_entailment(
'EMPLOYEES_INF'
, sem_models('EMPLOYEES')
, sem_rulebases('OWLPRIME')
, passes => SEM_APIS.REACH_CLOSURE
, inf_ext_user_func_name => 'sem_inf_related'
);
end;
/

伴意には、sem_inf_relatedによって追加される次の2つの新しいトリプルを含める必要があります。

S                        P                                    O
------------------------ ------------------------------------ ------------------------
http://example.org/John  http://example.org/possibleRelative  http://example.org/Mary
http://example.org/Mary  http://example.org/possibleRelative  http://example.org/John

9.1.3.4 例4: 時間推論(いくつかの関連する例)

ユーザー定義の拡張関数は、特定のデータ型(xsd:dateTimeなど)をトリプルでより利用しやすくすることができます。たとえばユーザー定義の拡張関数では、2つのxsd:dateTime値の違いに基づいてトリプル間の関係を推論することが可能です。この項の3つの例は、2つの異なる時間推論ルールと、これらを1つの伴意に結合する方法を調査します。例では、モデルEVENTとEVENT_ONTが存在し、次のセマンティク・データが含まれることを前提とします。

EVENT_ONT

@prefix owl:  <http://www.w3.org/2002/07/owl#> .
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> .
@prefix :     <http://example.org/event/> .

# we model two types of events
:Meeting      rdfs:subClassOf :Event .
:Presentation rdfs:subClassOf :Event .

# events have topics
:topic        rdfs:domain     :Event .

# events have start and end times
:startTime    rdfs:domain     :Event ;
rdfs:range      xsd:dateTime .
:endTime      rdfs:domain     :Event ;
rdfs:range      xsd:dateTime .

# duration (in minutes) of an event
:lengthInMins rdfs:domain      :Event ;
rdfs:range       xsd:integer .

# overlaps property identifies conflicting events
:overlaps     rdfs:domain      :Event ;
rdf:type         owl:SymmetricProperty .
:noOverlap    rdfs:domain      :Event ;
rdf:type         owl:SymmetricProperty .

EVENT_TBOX

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix :    <http://example.org/event/> .

:m1 rdf:type   :Meeting ;
:topic     "Beta1 launch" ;
:startTime "2012-04-01T09:30:00-05:00"^^xsd:dateTime ;
:endTime   "2012-04-01T11:00:00-05:00"^^xsd:dateTime .

:m2 rdf:type   :Meeting ;
:topic     "Standards compliance" ;
:startTime "2012-04-01T12:30:00-05:00"^^xsd:dateTime ;
:endTime   "2012-04-01T13:30:00-05:00"^^xsd:dateTime .

:p1 rdf:type   :Presentation ;
:topic     "OWL Reasoners" ;
:startTime "2012-04-01T11:00:00-05:00"^^xsd:dateTime ;
:endTime   "2012-04-01T13:00:00-05:00"^^xsd:dateTime .

次の例があります。

- 例4a: 期間ルール

- 例4b: オーバーラップ・ルール

- 例4c: 期間ルールとオーバーラップ・ルール

9.1.3.4.1 例4a: 期間ルール

次のユーザー定義の推論拡張関数(sem_inf_durations)は、イベントの開始時刻と終了時刻を指定して、イベント期間を分単位で推論します。たとえば、午前9時30分に開始し、午前11時00分に終了するイベントの期間は90分です。次の拡張関数は、イベントごとに開始時刻と終了時刻を抽出し、xsd:dateTime値をOracleタイムスタンプに変換し、タイムスタンプの差を計算します。この拡張ファンクションは、タイムゾーンを処理できます。

create or replace function sem_inf_durations(
src_tab_view         in  varchar2,
resource_id_map_view in  varchar2,
output_tab           in  varchar2,
action               in  varchar2,
num_calls            in  number,
tplInferredLastRound in  number,
options              in  varchar2 default null,
optimization_flag    out number,
diag_message         out varchar2
)
return boolean
as
eventClassId        number;
rdfTypePropertyId   number;
startTimePropertyId number;
endTimePropertyId   number;
durationPropertyId  number;

xsdTimeFormat       varchar2(100);
sqlStmt             varchar2(4000);
insertStmt          varchar2(4000);

pragma autonomous_transaction;
begin
if (action = 'RUN') then
-- retrieve ID of resource that already exists in the data (will
-- throw exception if resource does not exist).
eventClassId        := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/event/Event');
startTimePropertyId := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/event/startTime');
endTimePropertyId   := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/event/endTime');
durationPropertyId  := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/event/lengthInMins');
rdfTypePropertyId   := sdo_sem_inference.oracle_orardf_res2vid('http://www.w3.org/1999/02/22-rdf-syntax-ns#type');

-- set the TIMESTAMP format we will use to parse XSD times
xsdTimeFormat := 'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM';

-- query we use to extract the event ID and start/end times.
sqlStmt :=
'select ids1.sid eventId,
TO_TIMESTAMP_TZ(values1.value_name,''YYYY-MM-DD"T"HH24:MI:SSTZH:TZM'') startTime,
TO_TIMESTAMP_TZ(values2.value_name,''YYYY-MM-DD"T"HH24:MI:SSTZH:TZM'') endTime
from   ' || resource_id_map_view || ' values1,
' || resource_id_map_view || ' values2,
' || src_tab_view || '         ids1,
' || src_tab_view || '         ids2,
' || src_tab_view || '         ids3
where  ids1.sid = ids3.sid
AND  ids3.pid = ' || to_char(rdfTypePropertyId,'TM9') || '
AND  ids3.oid = ' || to_char(eventClassId,'TM9')      || '
AND  ids1.sid = ids2.sid
AND  ids1.pid = ' || to_char(startTimePropertyId,'TM9') || '
AND  ids2.pid = ' || to_char(endTimePropertyId,'TM9')   || '
AND  ids1.oid = values1.value_id
AND  ids2.oid = values2.value_id
/* ensures we have NEWDATA */
AND  not exists
(select 1
from   ' || src_tab_view || '
where  sid = ids3.sid
AND  pid = ' || to_char(durationPropertyId,'TM9') || ')
/* ensures we have UNIQDATA */
AND  not exists
(select 1
from   ' || output_tab || '
where  sid = ids3.sid
AND  pid = ' || to_char(durationPropertyId,'TM9') || ')';

-- compute the difference (in minutes) between the two Oracle
-- timestamps from our sqlStmt query.  Store the minutes as
-- xsd:integer.
insertStmt :=
'insert /*+ parallel append */ into ' || output_tab || ' (sid, pid, o)
select eventId,
' || to_char(durationPropertyId,'TM9') || ',
''"'' || minutes || ''"^^xsd:integer''
from   (
select eventId,
(extract(day    from (endTime - startTime))*24*60 +
extract(hour   from (endTime - startTime))*60 +
extract(minute from (endTime - startTime))) minutes
from   (' || sqlStmt || '))';

-- execute the query
execute immediate insertStmt;

-- commit our changes
commit;
end if;

-- we already checked for duplicates in src_tab_view (NEWDATA) and
-- in output_tab (UNIQDATA)
optimization_flag := SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_NEWDATA_ONLY +
SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_UNIQDATA_ONLY;

-- return true to indicate success
return true;

-- handle any exceptions
exception
when others then
diag_message := 'error occurred: ' || SQLERRM;
return false;
end sem_inf_durations;
/
show errors;

sem_inf_durations関数は、イベント期間を計算するために、組込みのOracle時間関数を使用します。最初にTO_TIMESTAMP_TZ関数を使用してxsd:dateTimeリテラル値をOracle TIMESTAMPオブジェクトに変換します。2つのOracle TIMESTAMPオブジェクトの差分を取ることで、時間間隔を表すINTERVALオブジェクトを生成します。sem_inf_durations関数は、EXTRACT演算子を使用して、期間間隔から日、時間および分を抽出することによって、各イベントの期間を分単位で計算します。

sem_inf_durations関数は、既存のモデル(src_tab_view)のデータとoutput_tab表のデータの両方に対して重複をチェックするため、INF_EXT_OPT_FLAG_NEWDATA_ONLYとINF_EXT_OPT_FLAG_UNIQDATA_ONLYの最適化フラグを有効にできます。(最適化フラグの詳細は、「例3: パフォーマンスの最適化」を参照してください。)

前述の例とは異なり、sem_inf_durationsには例外ハンドラが含まれていることに注意してください。例外ハンドラは、ユーザー定義の推論拡張ファンクションでの問題をデバッグする場合に役立ちます。有用なデバッグ・メッセージを生成するには、拡張関数の例外を捕捉し、エラーを反映するdiag_messageパラメータを設定して、拡張関数の実行中にエラーが発生したことを示すFALSEを戻します。sem_inf_durations関数は、すべての例外を捕捉して、diag_messageの値を例外メッセージに設定します。

sem_inf_durations関数で伴意を作成するには、次のように、MDSYSユーザーに実行権限を付与し、SEM_APIS.CREATE_ENTAILMENTプロシージャに関数名を渡します。

-- grant appropriate privileges
grant execute on sem_inf_durations to mdsys;

-- create the entailment
begin
sem_apis.create_entailment(
'EVENT_INF'
, sem_models('EVENT', 'EVENT_ONT')
, sem_rulebases('OWLPRIME')
, passes => SEM_APIS.REACH_CLOSURE
, inf_ext_user_func_name => 'sem_inf_durations'
);
end;
/

伴意には、OWLPRIMEによって推論されるトリプルに加えて、sem_inf_durationsによって追加される次の3つの新しいトリプルを含める必要があります。

S                            P                                      O
---------------------------- -------------------------------------- ---------
http://example.org/event/m1  http://example.org/event/lengthInMins  90
http://example.org/event/m2  http://example.org/event/lengthInMins  60
http://example.org/event/p1  http://example.org/event/lengthInMins  120

9.1.3.4.2 例4b: オーバーラップ・ルール

次のユーザー定義の推論拡張関数(sem_inf_overlap)は、2つのイベントが重なるかどうかを推測します。一方のイベントの進行中に、一方のイベントが開始する場合、2つのイベントは重なります。関数はイベントのペアごとに開始時刻と終了時刻を抽出し、xsd:dateTimeの値をOracleタイムスタンプに変換して、1つのイベントが他方の進行中に開始するかどうかを計算します。

create or replace function sem_inf_overlap(
src_tab_view         in  varchar2,
resource_id_map_view in  varchar2,
output_tab           in  varchar2,
action               in  varchar2,
num_calls            in  number,
tplInferredLastRound in  number,
options              in  varchar2 default null,
optimization_flag    out number,
diag_message         out varchar2
)
return boolean
as
eventClassId        number;
rdfTypePropertyId   number;
startTimePropertyId number;
endTimePropertyId   number;
overlapsPropertyId  number;
noOverlapPropertyId number;

xsdTimeFormat       varchar2(100);
sqlStmt             varchar2(4000);
insertStmt          varchar2(4000);

pragma autonomous_transaction;
begin
if (action = 'RUN') then
-- retrieve ID of resource that already exists in the data (will
-- throw exception if resource does not exist).
eventClassId        := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/event/Event');
startTimePropertyId := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/event/startTime');
endTimePropertyId   := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/event/endTime');
overlapsPropertyId  := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/event/overlaps');
noOverlapPropertyId := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/event/noOverlap');
rdfTypePropertyId   := sdo_sem_inference.oracle_orardf_res2vid('http://www.w3.org/1999/02/22-rdf-syntax-ns#type');

-- set the TIMESTAMP format we will use to parse XSD times
xsdTimeFormat := 'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM';

-- query we use to extract the event ID and start/end times.
sqlStmt :=
'select idsA1.sid eventAId,
idsB1.sid eventBId,
TO_TIMESTAMP_TZ(valuesA1.value_name,''YYYY-MM-DD"T"HH24:MI:SSTZH:TZM'') startTimeA,
TO_TIMESTAMP_TZ(valuesA2.value_name,''YYYY-MM-DD"T"HH24:MI:SSTZH:TZM'') endTimeA,
TO_TIMESTAMP_TZ(valuesB1.value_name,''YYYY-MM-DD"T"HH24:MI:SSTZH:TZM'') startTimeB,
TO_TIMESTAMP_TZ(valuesB2.value_name,''YYYY-MM-DD"T"HH24:MI:SSTZH:TZM'') endTimeB
from   ' || resource_id_map_view || ' valuesA1,
' || resource_id_map_view || ' valuesA2,
' || resource_id_map_view || ' valuesB1,
' || resource_id_map_view || ' valuesB2,
' || src_tab_view || '         idsA1,
' || src_tab_view || '         idsA2,
' || src_tab_view || '         idsA3,
' || src_tab_view || '         idsB1,
' || src_tab_view || '         idsB2,
' || src_tab_view || '         idsB3
where  idsA1.sid = idsA3.sid
AND  idsA3.pid = ' || to_char(rdfTypePropertyId,'TM9') || '
AND  idsA3.oid = ' || to_char(eventClassId,'TM9')      || '
AND  idsB1.sid = idsB3.sid
AND  idsB3.pid = ' || to_char(rdfTypePropertyId,'TM9') || '
AND  idsB3.oid = ' || to_char(eventClassId,'TM9')      || '
/* only do half the checks, our TBOX ontology will handle symmetries */
AND  idsA1.sid < idsB1.sid
/* grab values of startTime and endTime for event A */
AND  idsA1.sid = idsA2.sid
AND  idsA1.pid = ' || to_char(startTimePropertyId,'TM9') || '
AND  idsA2.pid = ' || to_char(endTimePropertyId,'TM9')   || '
AND  idsA1.oid = valuesA1.value_id
AND  idsA2.oid = valuesA2.value_id
/* grab values of startTime and endTime for event B */
AND  idsB1.sid = idsB2.sid
AND  idsB1.pid = ' || to_char(startTimePropertyId,'TM9') || '
AND  idsB2.pid = ' || to_char(endTimePropertyId,'TM9')   || '
AND  idsB1.oid = valuesB1.value_id
AND  idsB2.oid = valuesB2.value_id
/* ensures we have NEWDATA */
AND  not exists
(select 1
from   ' || src_tab_view || '
where  sid = idsA1.sid
AND  oid = idsB1.sid
AND  pid in (' || to_char(overlapsPropertyId,'TM9')  || ',' ||
to_char(noOverlapPropertyId,'TM9') || '))
/* ensures we have UNIQDATA */
AND  not exists
(select 1
from   ' || output_tab   || '
where  sid = idsA1.sid
AND  oid = idsB1.sid
AND  pid in (' || to_char(overlapsPropertyId,'TM9')  || ',' ||
to_char(noOverlapPropertyId,'TM9') || '))';

-- compare the two event times
insertStmt :=
'insert /*+ parallel append */ into ' || output_tab || ' (sid, pid, oid)
select eventAId, overlapStatusId, eventBId
from   (
select eventAId,
(case
when (startTimeA < endTimeB and
startTimeA > startTimeB) then
' || to_char(overlapsPropertyId,'TM9') || '
when (startTimeB < endTimeA and
startTimeB > startTimeA) then
' || to_char(overlapsPropertyId,'TM9') || '
else
' || to_char(noOverlapPropertyId,'TM9') || '
end) overlapStatusId,
eventBId
from   (' || sqlStmt || '))';

-- execute the query
execute immediate insertStmt;

-- commit our changes
commit;
end if;

-- we only use ID values in the output_tab and we check for
-- duplicates with our NOT EXISTS clause.
optimization_flag := SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_ALL_IDS +
SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_NEWDATA_ONLY +
SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_UNIQDATA_ONLY;

-- return true to indicate success
return true;

-- handle any exceptions
exception
when others then
diag_message := 'error occurred: ' || SQLERRM;
return false;
end sem_inf_overlap;
/
show errors;

sem_inf_overlap関数は、「例4b: オーバーラップ・ルール」のsem_inf_durations関数と類似しています。2つの主な違いは、sem_inf_overlapの問合せには、新しい字句の値を生成する必要がないために、より多くの結合が含まれており、INF_EXT_OPT_FLAG_ALL_IDS最適化フラグが有効であることです。(最適化フラグの詳細は、「例3: パフォーマンスの最適化」を参照してください。)

sem_inf_overlap関数で伴意を作成するには、次のように、MDSYSユーザーに実行権限を付与し、SEM_APIS.CREATE_ENTAILMENTプロシージャに関数名を渡します。

-- grant appropriate privileges
grant execute on sem_inf_overlap to mdsys;

-- create the entailment
begin
sem_apis.create_entailment(
'EVENT_INF'
, sem_models('EVENT', 'EVENT_ONT')
, sem_rulebases('OWLPRIME')
, passes => SEM_APIS.REACH_CLOSURE
, inf_ext_user_func_name => 'sem_inf_overlap'
);
end;
/

伴意には、OWLPRIMEによって推論されるトリプルに加えて、sem_inf_overlapによって追加される次の6つの新しいトリプルを含める必要があります。

S                            P                                   O
---------------------------- ----------------------------------- ----------------------------
http://example.org/event/m1  http://example.org/event/noOverlap  http://example.org/event/m2
http://example.org/event/m1  http://example.org/event/noOverlap  http://example.org/event/p1
http://example.org/event/m2  http://example.org/event/noOverlap  http://example.org/event/m1
http://example.org/event/m2  http://example.org/event/overlaps   http://example.org/event/p1
http://example.org/event/p1  http://example.org/event/noOverlap  http://example.org/event/m1
http://example.org/event/p1  http://example.org/event/overlaps   http://example.org/event/m2

9.1.3.4.3 例4c: 期間ルールとオーバーラップ・ルール

この項の例は、例4a: 期間ルール (sem_inf_durations)および例4b: オーバーラップ・ルール (sem_inf_overlap)の拡張機能関数を一緒に使用して、単一の伴意を生成します。拡張ファンクションは、この例では変更されないままです。

複数の拡張関数を使用して伴意を作成するには、SEM_APIS.CREATE_ENTAILMENT のinf_ext_user_func_nameパラメータに渡される各拡張関数をカンマを使用して区切ります。次の例では、拡張ファンクションでの適切な権限がMDSYSユーザーに付与されていることを前提とします。

-- use multiple user-defined inference functions
begin
sem_apis.create_entailment(
'EVENT_INF'
, sem_models('EVENT', 'EVENT_ONT')
, sem_rulebases('OWLPRIME')
, passes => SEM_APIS.REACH_CLOSURE
, inf_ext_user_func_name => 'sem_inf_durations,sem_inf_overlap'
);
end;
/

伴意には、OWLPRIMEによって推論されるトリプルに加えて、sem_inf_durationsおよびsem_inf_overlapによって追加される次の9つの新しいトリプルを含める必要があります。

S                            P                                      O
---------------------------- -------------------------------------- ----------------------------
http://example.org/event/m1  http://example.org/event/lengthInMins  90
http://example.org/event/m1  http://example.org/event/noOverlap     http://example.org/event/m2
http://example.org/event/m1  http://example.org/event/noOverlap     http://example.org/event/p1
http://example.org/event/m2  http://example.org/event/lengthInMins  60
http://example.org/event/m2  http://example.org/event/noOverlap     http://example.org/event/m1
http://example.org/event/m2  http://example.org/event/overlaps      http://example.org/event/p1
http://example.org/event/p1  http://example.org/event/lengthInMins  120
http://example.org/event/p1  http://example.org/event/noOverlap     http://example.org/event/m1
http://example.org/event/p1  http://example.org/event/overlaps      http://example.org/event/m2

拡張関数のsem_inf_durationsおよびsem_inf_overlapで、同じ最適化フラグを使用する必要はありません。矛盾している最適化フラグで拡張関数を使用する(たとえば、INF_EXT_OPT_FLAG_ALL_IDSを使用する関数と、すべての新しいトリプルを字句の値として挿入する別の関数)ことは可能です。

9.1.3.5 例5: 空間推論

ユーザー定義の推論拡張ファンクションでは、WKT (Well-Known Text)のような地理空間データ型を使用して空間推論を実行することもできます。たとえばユーザー定義の拡張ファンクションを使用して、州と市のような形状エンティティ間の包含関係を推論することができます。

この項の例では、あるジオメトリ(米国のある州)に、あるポイント(米国のある市)が含まれるかどうかを推論する方法を示します。この例では、RDFネットワークに空間索引(1.6.6.2項を参照)があることを前提としています。また、モデルSTATESが存在し、これには次のセマンティク・データが含まれているとします。

@prefix orageo: <http://xmlns.oracle.com/rdf/geo/> .
@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
@prefix :       <http://example.org/geo/> .

:Colorado rdf:type  :State ;
:boundary "Polygon((-109.0448 37.0004, -102.0424 36.9949, -102.0534 41.0006, -109.0489 40.9996, -109.0448 37.0004))"^^orageo:WKTLiteral .
:Utah     rdf:type  :State ;
:boundary "Polygon((-114.0491 36.9982, -109.0462 37.0026, -109.0503 40.9986, -111.0471 41.0006, -111.0498 41.9993, -114.0395 41.9901, -114.0491 36.9982))"^^orageo:WKTLiteral .
:Wyoming  rdf:type  :State ;
:boundary "Polygon((-104.0556 41.0037, -104.0584 44.9949, -111.0539 44.9998, -111.0457 40.9986, -104.0556 41.0037))"^^orageo:WKTLiteral

:StateCapital rdfs:subClassOf :City ;

:Denver   rdf:type  :StateCapital ;
:location "Point(-104.984722 39.739167)"^^orageo:WKTLiteral .
:SaltLake rdf:type  :StateCaptial ;
:location "Point(-111.883333 40.75)"^^orageo:WKTLiteral .
:Cheyenne rdf:type  :StateCapital ;
:location "Point(-104.801944 41.145556)"^^orageo:WKTLiteral .

次のユーザー定義の推論拡張関数(sem_inf_capitals)は、WKTジオメトリを使用して各州内の首都を検索します。ファンクションが首都を検出すると、その市が含まれている州の首都であると推測します。

create or replace function sem_inf_capitals(
src_tab_view         in  varchar2,
resource_id_map_view in  varchar2,
output_tab           in  varchar2,
action               in  varchar2,
num_calls            in  number,
tplInferredLastRound in  number,
options              in  varchar2 default null,
optimization_flag    out number,
diag_message         out varchar2
)
return boolean
as
stateClassId        number;
capitalClassId      number;

boundaryPropertyId  number;
locationPropertyId  number;
rdfTypePropertyId   number;
capitalPropertyId   number;

defaultSRID         number := 8307;

xsdTimeFormat       varchar2(100);
sqlStmt             varchar2(4000);
insertStmt          varchar2(4000);

pragma autonomous_transaction;
begin
if (action = 'RUN') then
-- retrieve ID of resource that already exists in the data (will
-- throw exception if resource does not exist).
stateClassId       := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/geo/State');
capitalClassId     := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/geo/StateCapital');
boundaryPropertyId := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/geo/boundary');
locationPropertyId := sdo_sem_inference.oracle_orardf_res2vid('http://example.org/geo/location');
rdfTypePropertyId  := sdo_sem_inference.oracle_orardf_res2vid('http://www.w3.org/1999/02/22-rdf-syntax-ns#type');

-- retreive ID of resource or generate a new ID if resource does
-- not already exist
capitalPropertyId := sdo_sem_inference.oracle_orardf_add_res('http://example.org/geo/capital');

-- query we use to extract the capital cities contained within state boundaries
sqlStmt :=
'select idsA1.sid stateId,
idsB1.sid cityId
from   ' || resource_id_map_view || ' valuesA,
' || resource_id_map_view || ' valuesB,
' || src_tab_view || '         idsA1,
' || src_tab_view || '         idsA2,
' || src_tab_view || '         idsB1,
' || src_tab_view || '         idsB2
where  idsA1.pid = ' || to_char(rdfTypePropertyId,'TM9') || '
AND  idsA1.oid = ' || to_char(stateClassId,'TM9')      || '
AND  idsB1.pid = ' || to_char(rdfTypePropertyId,'TM9') || '
AND  idsB1.oid = ' || to_char(capitalClassId,'TM9')    || '
/* grab geometric lexical values */
AND  idsA2.sid = idsA1.sid
AND  idsA2.pid = ' || to_char(boundaryPropertyId,'TM9')|| '
AND  idsA2.oid = valuesA.value_id
AND  idsB2.sid = idsB1.sid
AND  idsB2.pid = ' || to_char(locationPropertyId,'TM9')|| '
AND  idsB2.oid = valuesB.value_id
/* compare geometries to see if city is contained by state */
AND  SDO_RELATE(
SDO_RDF.getV$GeometryVal(
valuesA.value_type,
valuesA.vname_prefix,
valuesA.vname_suffix,
valuesA.literal_type,
valuesA.language_type,
valuesA.long_value,
' || to_char(defaultSRID,'TM9') || '),
SDO_RDF.getV$GeometryVal(
valuesB.value_type,
valuesB.vname_prefix,
valuesB.vname_suffix,
valuesB.literal_type,
valuesB.language_type,
valuesB.long_value,
' || to_char(defaultSRID,'TM9') || '),
''mask=CONTAINS'') = ''TRUE''
/* ensures we have NEWDATA and only check capitals not assigned to a state */
AND  not exists
(select 1
from   ' || src_tab_view || '
where  pid = ' || to_char(capitalPropertyId,'TM9') || '
AND  (sid = idsA1.sid OR oid = idsB1.sid))
/* ensures we have UNIQDATA and only check capitals not assigned to a state */
AND  not exists
(select 1
from   ' || output_tab   || '
where  pid = ' || to_char(capitalPropertyId,'TM9') || '
AND  (sid = idsA1.sid OR oid = idsB1.sid))';

-- insert new triples using only IDs
insertStmt :=
'insert /*+ parallel append */ into ' || output_tab || ' (sid, pid, oid)
select stateId, ' || to_char(capitalPropertyId,'TM9') || ', cityId
from   (' || sqlStmt || ')';

-- execute the query
execute immediate insertStmt;

-- commit our changes
commit;
end if;

-- we only use ID values in the output_tab and we check for
-- duplicates with our NOT EXISTS clauses.
optimization_flag := SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_ALL_IDS +
SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_NEWDATA_ONLY +
SDO_SEM_INFERENCE.INF_EXT_OPT_FLAG_UNIQDATA_ONLY;

-- return true to indicate success
return true;

-- handle any exceptions
exception
when others then
diag_message := 'error occurred: ' || SQLERRM;
return false;
end sem_inf_capitals;
/
show errors;

sem_inf_capitals関数と例4a: 期間ルールのsem_inf_durations関数は、どちらの関数もネイティブのOracle演算子を利用するために、いくつかのトリプルの字句の値をOracle型に変換する必要があるという点で類似しています。sem_inf_capitalsの例では、SDO_RDF.getV$GeometryVal関数を使用して、WKT字句値のエンコーディングされたポリゴンとポイントを、Oracle Spatial and Graphの SDO_GEOMETRY型に変換します。getV$GeometryVal関数は、ほとんどがリソース・ビュー(resource_id_map_view)と追加の引数によって提供される引数、空間参照システム(SRID)へのIDを必要とします。getV$GeometryVal関数は、ジオメトリをSRIDによって指定される空間参照システムに変換します。sem_inf_capitals関数は、値8307のSRIDによって指定される、デフォルトのOracle Spatial and Graph参照システム(WGS84 Longitude-Latitude)を使用します。(RDFセマンティク・グラフの空間参照システムのサポートの詳細は、「空間のサポート」を参照してください。)

getV$GeometryVal関数を使用して、WKT値をSDO_GEOMETRY型に変換した後、sem_inf_capitals関数は、その州のジオメトリを市のジオメトリと比較して、その州にその市が含まれているかどうかを調べます。SDO_RELATE演算子がこの比較を実行し、州に市が含まれる場合は、リテラル値'TRUE'を戻します。SDO_RELATE演算子は、様々な異なる種類の比較を実行できます。(SDO_RELATEおよびその他の空間演算子の詳細は、『Oracle Spatial and Graph開発者ガイド』を参照してください。)

sem_inf_capitals関数で伴意を作成するには、次のように、MDSYSユーザーに実行権限を付与し、SEM_APIS.CREATE_ENTAILMENTプロシージャに関数名を渡します。

-- grant appropriate privileges
grant execute on sem_inf_capitals to mdsys;

-- create the entailment
begin
sem_apis.create_entailment(
'STATES_INF'
, sem_models('STATES')
, sem_rulebases('OWLPRIME')
, passes => SEM_APIS.REACH_CLOSURE
, inf_ext_user_func_name => 'sem_inf_capitals'
);
end;
/

伴意には、OWLPRIMEによって推論されるトリプルに加えて、sem_inf_capitalsによって追加される次の3つの新しいトリプルを含める必要があります。

S                                P                               O
-------------------------------- ------------------------------- --------------------------------
http://example.org/geo/Colorado  http://example.org/geo/capital  http://example.org/geo/Denver
http://example.org/geo/Utah      http://example.org/geo/capital  http://example.org/geo/SaltLake
http://example.org/geo/Wyoming   http://example.org/geo/capital  http://example.org/geo/Cheyenne

9.1.3.6 例6: Webサービスのコール

この項では、Oracle GeocoderサービスへのWebサービス・コールを可能にする、ユーザー定義の推論拡張関数(sem_inf_geocoding)と関連するヘルパー・プロシージャ(geocoding)について説明します。ユーザー定義の推論拡張関数は、述語<urn:streetAddress>を使用してトリプルのオブジェクト値を検索し、Oracleの公開Geocoderサービスのエンドポイント(http://maps.oracle.com/geocoder/gcserver)でコールアウトを実行して、経度と緯度の情報を2つの別々のトリプルとして挿入します。

たとえば、セマンティク・モデルに次の表明が含まれているとします。

<urn:NEDC>  <urn:streetAddress>  "1 Oracle Dr., Nashua, NH"

この場合、sem_inf_geocodingを使用した推論コールは、次の新しい表明を生成します。

<urn:NEDC> <http://www.w3.org/2003/01/geo/wgs84_pos#long>  "-71.46421"
<urn:NEDC> <http://www.w3.org/2003/01/geo/wgs84_pos#lat>   "42.75836"
<urn:NEDC> <http://www.opengis.net/geosparql#asWKT>  "POINT(-71.46421 42.75836)"^^<http://www.opengis.net/geosparql#wktLiteral>
<urn:NEDC> <http://xmlns.oracle.com/rdf/geo/asWKT>   "POINT(-71.46421 42.75836)"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral>

sem_inf_geocoding関数は、次のように定義されます。

create or replace function sem_inf_geocoding(
src_tab_view         in  varchar2,
resource_id_map_view in  varchar2,
output_tab           in  varchar2,
action               in  varchar2,
num_calls            in  number,
tplInferredLastRound in  number,
options              in  varchar2 default null,
optimization_flag    out number,
diag_message         out varchar2
)
return boolean
as
pragma autonomous_transaction;
iCount integer;

nLong number;
nLat  number;
nWKT  number;
nOWKT number;
nStreetAddr number;

sidTab    dbms_sql.number_table;
oidTab    dbms_sql.number_table;

vcRequestBody varchar2(32767);
vcStmt        varchar2(32767);
vcStreeAddr   varchar2(3000);

type cur_type is ref cursor;
cursorFind    cur_type;
vcLong varchar2(100);
vcLat  varchar2(100);
begin
if (action = 'START') then
nLat := sdo_sem_inference.oracle_orardf_add_res('http://www.w3.org/2003/01/geo/wgs84_pos#lat');
nLong := sdo_sem_inference.oracle_orardf_add_res('http://www.w3.org/2003/01/geo/wgs84_pos#long');
nWKT  := sdo_sem_inference.oracle_orardf_add_res('http://www.opengis.net/geosparql#asWKT');
nOWKT := sdo_sem_inference.oracle_orardf_add_res('http://xmlns.oracle.com/rdf/geo/asWKT');
end if;

if (action = 'RUN') then
nStreetAddr := sdo_sem_inference.oracle_orardf_res2vid('<urn:streetAddress>');
nLat := sdo_sem_inference.oracle_orardf_res2vid('http://www.w3.org/2003/01/geo/wgs84_pos#lat');
nLong := sdo_sem_inference.oracle_orardf_res2vid('http://www.w3.org/2003/01/geo/wgs84_pos#long');
nWKT  := sdo_sem_inference.oracle_orardf_res2vid('http://www.opengis.net/geosparql#asWKT');
nOWKT := sdo_sem_inference.oracle_orardf_res2vid('http://xmlns.oracle.com/rdf/geo/asWKT');

vcStmt := '
select /*+ parallel */ distinct s1.sid as s_id, s1.oid as o_id
from ' || src_tab_view || ' s1
where s1.pid = :1
and not exists ( select 1
from   ' || src_tab_view || ' x
where  x.sid = s1.sid
and  x.pid = :2
) ';
open cursorFind for vcStmt using nStreetAddr, nLong;

loop
fetch cursorFind bulk collect into sidTab, oidTab limit 10000;
for i in 1..sidTab.count loop
vcStreeAddr := sdo_sem_inference.oracle_orardf_vid2lit(oidTab(i));
-- dbms_output.put_line('Now processing street addr ' || vcStreeAddr);
geocoding(vcStreeAddr, vcLong, vcLat);
execute immediate 'insert into ' || output_tab || '(sid,pid,oid,gid,s,p,o,g)
values(:1, :2, null, null, null, null, :3, null) '
using sidTab(i), nLong, '"'||vcLong||'"';
execute immediate 'insert into ' || output_tab || '(sid,pid,oid,gid,s,p,o,g)
values(:1, :2, null, null, null, null, :3, null) '
using sidTab(i), nLat, '"'||vcLat||'"';
execute immediate 'insert into ' || output_tab || '(sid,pid,oid,gid,s,p,o,g)
values(:1, :2, null, null, null, null, :3, null) '
using sidTab(i), nWKT, '"POINT('|| vcLong || ' ' ||vcLat ||')"^^<http://www.opengis.net/geosparql#wktLiteral>';
execute immediate 'insert into ' || output_tab || '(sid,pid,oid,gid,s,p,o,g)
values(:1, :2, null, null, null, null, :3, null) '
using sidTab(i), nOWKT, '"POINT('|| vcLong || ' ' ||vcLat ||')"^^<http://xmlns.oracle.com/rdf/geo/WKTLiteral>';
end loop;
exit when cursorFind%notfound;
end loop;
commit;
end if;
return true;
end;
/
grant execute on sem_inf_geocoding to mdsys;

sem_inf_geocoding関数は、Geocoder Webサービス・エンドポイントで実際のHTTP通信を実行する、次のgeocodingというヘルパー・プロシージャを使用します。Webサーバーに接続するには、適切な権限が必要であることに注意してください。

create or replace procedure geocoding(addr varchar2,
vcLong out varchar2,
vcLat  out varchar2
)
as
httpReq  utl_http.req;
httpResp utl_http.resp;

vcRequestBody varchar2(32767);

vcBuffer  varchar2(32767);
idxLat integer;
idxLatEnd integer;
begin
vcRequestBody := utl_url.escape('xml_request=<?xml version="1.0" standalone="yes"?>
<geocode_request vendor="elocation">
<address_list>
<input_location id="27010">
<input_address match_mode="relax_street_type">
<unformatted country="US">
<address_line value="'|| addr ||'"/>
</unformatted>
</input_address>
</input_location>
</address_list>
</geocode_request>
');
dbms_output.put_line('request ' || vcRequestBody);

-- utl_http.set_proxy('<your_proxy_here_if_necessary>', null);
httpReq := utl_http.begin_request (
'http://maps.oracle.com/geocoder/gcserver', 'POST');

utl_http.set_header(httpReq, 'Content-Type', 'application/x-www-form-urlencoded');
utl_http.set_header(httpReq, 'Content-Length', lengthb(vcRequestBody));

utl_http.write_text(httpReq, vcRequestBody);

httpResp := utl_http.get_response(httpReq);

utl_http.read_text(httpResp, vcBuffer, 32767);
utl_http.end_response(httpResp);

-- dbms_output.put_line('response ' || vcBuffer);
-- Here we are doing some simple string parsing out of an XML.
-- It is more robust to use XML functions instead.
idxLat := instr(vcBuffer, 'longitude="');
idxLatEnd := instr(vcBuffer, '"', idxLat + 12);
vcLong := substr(vcBuffer, idxLat + 11, idxLatEnd - idxLat - 11);
dbms_output.put_line('long = ' || vcLong);

idxLat := instr(vcBuffer, 'latitude="');
idxLatEnd := instr(vcBuffer, '"', idxLat + 11);
vcLat := substr(vcBuffer, idxLat + 10, idxLatEnd - idxLat - 10);
dbms_output.put_line('lat = ' || vcLat);
exception
when others then
dbms_output.put_line('geocoding: error ' || dbms_utility.format_error_backtrace || ' '
|| dbms_utility.format_error_stack);
end;
/

9.2 ユーザー定義ファンクションと集計

RDFセマンティク・グラフ問合せの拡張アーキテクチャによって、ユーザー定義ファンクションと集計を追加して、SPARQL問合せで使用できるようになります。これには、SEM_MATCHテーブル・ファンクションと、support for Apache Jenaおよびsupport for Sesameも使用されます。

SPARQL 1.1標準には、主に、問合せによって取得されるデータをフィルタ処理して分類するために使用されるいくつかの関数が用意されています。ただし、この標準ではサポートされていない特殊な関数が必要な場合があります。

簡単な例として、特定のタイプに属する値の検索、平方和の値を使用した特定のしきい値よりも大きい値の取得があります。これは、関数を組み合せることで実行することはできますが、この計算を処理する単一の関数があると、問合せをより簡単に短くすることができて有用です。

RDFセマンティク・グラフ問合せの拡張機能によって、独自の問合せ関数と集計を含めることができます。このアーキテクチャにより、次のことが可能になっています。

- 組込みのSPARQL問合せ関数と同様に使用できるカスタム問合せ関数(「ユーザー定義関数のAPIサポート」を参照)

- 組込みのSPARQL集計と同様に使用できるカスタム集計(「ユーザー定義集計のAPIサポート」を参照)

9.2.1 ユーザー定義ファンクションと集計のデータ型

ユーザー定義関数と集計を作成するとき、RDF語句を表現するためにSDO_RDF_TERMオブジェクト型が使用されます。

SDO_RDF_TERMには次の属性があり、MDSYS.RDF_VALUE$表の列に対応しています(これらの属性については、「文」の表1-3を参照してください)。CTX1属性は将来使用するために確保されているもので、対応する列はMDSYS.RDF_VALUE$にはありません。

SDO_RDF_TERM(
VALUE_TYPE   VARCHAR2(10),
VALUE_NAME    VARCHAR2(4000),
VNAME_PREFIX   VARCHAR2(4000),
VNAME_SUFFIX   VARCHAR2(512),
LITERAL_TYPE   VARCHAR2(1000),
LANGUAGE_TYPE   VARCHAR2(80),
LONG_VALUE   CLOB,
CTX1   VARCHAR2(4000) )

SDO_RDF_TERMオブジェクトの作成には、次のコンストラクタが使用可能です。1つ目のコンストラクタは、単一の字句RDF語句文字列から、各属性を移入します。2番目と3番目のコンストラクタは、個々の属性値を入力として受け取ります。1番目のRDF語句文字列コンストラクタのみが、VNAME_PREFIXとVNAME_SUFFIXの値を設定します。これらの値は、他のコンストラクタによってNULLに初期化されます。

SDO_RDF_TERM (
rdf_term_str  VARCHAR2)
RETURN SELF;

SDO_RDF_TERM (
value_type  VARCHAR2,
value_name  VARCHAR2,
literal_type  VARCHAR2,
language_type  VARCHAR2,
long_value  CLOB)
RETURN SELF;

SDO_RDF_TERM (
value_type  VARCHAR2,
value_name  VARCHAR2,
literal_type  VARCHAR2,
language_type  VARCHAR2,
long_value  CLOB,
ctx1 VARCHAR2)
RETURN SELF;

SDO_RDF_TERMオブジェクトのリストを格納するために、SDO_RDF_TERM_LIST型が使用され、VARRAY(32767) of SDO_RDF_TERMとして定義されます。

9.2.2 ユーザー定義ファンクションのAPIサポート

ユーザー定義関数は、特定のシグネチャを使用したPL/SQL関数を実装することによって作成され、固有のURIを使用してSPARQL問合せパターンで起動されます。

推論拡張関数コールが正常に実行された後、推論拡張関数で行われた変更を保持するために、コミットが実行されます。pragma autonomous_transactionを指定することによって、推論拡張関数が自律型として定義した場合、実装ロジックの最後で、コミットまたはロールバックする必要があります。推論エンジンでは、伴意の作成時(1ラウンドにつき1回)に、拡張関数を複数回コールする場合があることに注意してください。あるコールのコミットおよびロールバックは、他のコールには影響しません。

9.2.2.1 PL/SQLファンクションの実装

各ユーザー定義関数は、次の形式のシグネチャを持つPL/SQL関数によって実装される必要があります。

FUNCTION user_function_name (params IN SDO_RDF_TERM_LIST)
RETURN SDO_RDF_TERM

このシグネチャは任意の数のRDF語句引数(単一のSDO_RDF_TERM_LISTオブジェクトを使用する際に渡される)をサポートし、単一のRDF語句(単一のSDO_RDF_TERMオブジェクトとして表現される)を出力として戻します。これらのパラメータの型チェックまたは他の検証は、実行されません。関数の用途に従ってデータを検証するための手順を実行する必要があります。

CやJavaなど、他のプログラミング言語で記述された関数に対して、PL/SQLからのコールアウトがサポートされているため、ユーザー定義の問合せ関数を実装するPL/SQL関数は、他のプログラミング言語で記述された関数のラッパーとしてのみ機能します。

9.2.2.2 SPARQL問合せパターンからのユーザー定義ファンクションの起動

これは、ユーザー定義関数がPL/SQLで実装された後、接頭辞<http://xmlns.oracle.com/rdf/extensions/>の後にschema.package_name.function_nameが続く関数URI(対応するPL/SQL関数がPL/SQLパッケージの一部である場合)、またはschema.function_nameが続く関数URI(関数がPL/SQLパッケージの一部でない場合)を使用して、SPARQL問合せパターンから起動することができます。次の2つは、関数URIの例です。

<http://xmlns.oracle.com/rdf/extensions/my_schema.my_package.my_function>(arg_1, …, arg_n)

<http://xmlns.oracle.com/rdf/extensions/my_schema.my_function>(arg_1, …, arg_n)

9.2.2.3 ユーザー定義ファンクションの例

この項では、ユーザー定義関数の実装例と、その関数のFILTER句、SELECT式およびBIND演算での使用について示します。

たとえば、ここではN-triple形式で示されている次のデータが、MYMODELと呼ばれるモデル内に存在しているとします。

<a>  <p>  "1.0"^^xsd:double .
<b>  <p>  "1.5"^^xsd:float .
<c>  <p>  "3"^^xsd:decimal .
<d>  <p>  "4"^^xsd:string .

例9-1 2つの平方和を計算するユーザー定義ファンクション

例9-1は、2つの値を受け取って各値の平方和を計算する、単純なファンクションの実装を示しています。

CREATE OR REPLACE FUNCTION sum_squares (params IN MDSYS.SDO_RDF_TERM_LIST)
RETURN MDSYS.SDO_RDF_TERM
AS
retTerm    SDO_RDF_TERM;
sqr1       NUMBER;
sqr2       NUMBER;
addVal     NUMBER;
val1       SDO_RDF_TERM;
val2       SDO_RDF_TERM;
BEGIN
–- Set the return value to null.
retTerm := SDO_RDF_TERM(NULL,NULL,NULL,NULL,NULL);
–- Obtain the data from the first two parameters.
val1 := params(1);
val2 := params(2);
–- Convert the value stored in the sdo_rdf_term to number.
–- If any exception occurs, return the null value.
BEGIN
sqr1 := TO_NUMBER(val1.value_name);
sqr2 := TO_NUMBER(val2.value_name);
EXCEPTION WHEN OTHERS THEN RETURN retTerm;
END;
–- Compute the square sum of both values.
addVal := (sqr1 * sqr1) + (sqr2 * sqr2);
–- Set the return value to the desired rdf term type.
retTerm := SDO_RDF_TERM('LIT',to_char(addVal),
'http://www.w3.org/2001/XMLSchema#integer','',NULL);
– Return the new value.
RETURN retTerm;
END;
/
SHOW ERRORS;

例9-1 sum_squaresファンクションでは、受け取った値のデータ型を検証しません。これはあくまでも例であり、SDO_RDF_TERMのVALUE_NAMEフィールドに格納されている数値の取得には、TO_NUMBERを使用します。

例9-2 FILTER句で使用されるユーザー定義ファンクション

例9-2は、FILTER句で使用されるsum_squaresファンクション(例9-1)を示します。

SELECT s, o
FROM table(sem_match(
'SELECT  ?s ?o
WHERE { ?s ?p ?o
FILTER (<http://xmlns.oracle.com/rdf/extensions/schema.sum_squares>(?o,?o) > 2)}',
sem_models('MYMODEL'),null,null,null,null,''));

例9-2の問合せは、次の結果を戻します。

s                    o
-------------------- --------------------
b                    1.5
c                    3
d                    4

例9-3 SELECT式で使用されるユーザー定義ファンクション

例9-3は、SELECT句の式で使用されるsum_squaresファンクション(例9-1)を示します。

SELECT s, o, sqr_sum
FROM table(sem_match(
'SELECT  ?s ?o
(<http://xmlns.oracle.com/rdf/extensions/schema.sum_squares>(?o,?o) AS
?sqr_sum)
WHERE { ?s ?p ?o }',
sem_models('MYMODEL'),null,null,null,null,''));

例9-3の問合せは、次の結果を戻します。

s                    o                    sqr_sum
-------------------- -------------------- --------------------
a                    1                    2
b                    1.5                  4.5
c                    3                    18
d                    4                    32

例9-4 BIND演算で使用されるユーザー定義ファンクション

例9-4は、BIND演算で使用されるsum_squaresファンクション(例9-1)を示します。

SELECT s, o, sqr_sum
FROM table(sem_match(
'SELECT  ?s ?o ?sqr_sum
WHERE { ?s ?p ?o .
BIND (<http://xmlns.oracle.com/rdf/extensions/schema.sum_squares>(?o,?o) AS
?sqr_sum)}',
sem_models('MYMODEL'),null,null,null,null,''));

例9-4の問合せは、次の結果を戻します。

s                    o                    sqr_sum
-------------------- -------------------- --------------------
a                    1                    2
b                    1.5                  4.5
c                    3                    18
d                    4                    32

9.2.3 ユーザー定義集計のAPIサポート

ユーザー定義の集計は、一連のインタフェース・メソッドを実装するPL/SQLオブジェクト型を定義することによって実装されます。ユーザー定義の集計を作成したら、固有のURIを使用してそれを起動します。

9.2.3.1 ODCIAggregateインタフェース

ユーザー定義の集計では、ODCIAggregate PL/SQLインタフェースを使用します。このインタフェースの詳細は、Oracle Databaseデータ・カートリッジ開発者ガイドのユーザー定義集計関数に関する章を参照してください。

ODCIAggregateインタフェースは、4つの主要な関数を実装するPL/SQLオブジェクト型によって実装されます。

- ODCIAggregateInitialize

- ODCIAggregateIterate

- ODCIAggregateMerge

- ODCIAggregateTerminate

ユーザー定義関数(「ユーザー定義関数のAPIサポート」を参照)と同様に、ユーザー定義の集計は、SDO_RDF_TERM_LISTオブジェクトとして渡される任意の数のRDF語句引数を受け取り、SDO_RDF_TERMオブジェクトとして表現される単一のRDF語句の値を返します。

このスキームによって、PL/SQL ODCIAggregateインタフェース関数のシグネチャは、次のようになります(my_aggregate_obj_typeは実際のオブジェクト・タイプ名)。

STATIC FUNCTION ODCIAggregateInitialize(
sctx IN OUT my_aggregate_obj_type)
RETURN NUMBER

MEMBER FUNCTION ODCIAggregateIterate(
self       IN OUT my_aggregate_obj_type
,value      IN MDSYS.SDO_RDF_TERM_LIST)
RETURN NUMBER

MEMBER FUNCTION ODCIAggregateMerge(
self IN OUT my_aggregate_obj_type
,ctx2 IN     my_aggregate_obj_type)
RETURN NUMBER

MEMBER FUNCTION ODCIAggregateTerminate (
self IN my_aggregate_obj_type
,return_value OUT MDSYS.SDO_RDF_TERM
,flags IN NUMBER)
RETURN NUMBER

9.2.3.2 ユーザー定義の集計の起動

これは、ユーザー定義の集計がPL/SQLで実装された後、接頭辞<http://xmlns.oracle.com/rdf/aggExtensions/>の後にschema_name.aggregate_nameを続けて構築される集計URIを参照することによって、SPARQL問合せから起動することができます。集計URIの例は次のとおりです。

<http://xmlns.oracle.com/rdf/aggExtensions/schema.my_aggregate>(arg_1, …, arg_n)

DISTINCT修飾子は、ユーザー定義の集計で次の例のように使用できます。

<http://xmlns.oracle.com/rdf/aggExtensions/schema.my_aggregate>(DISTINCT arg_1)

この場合、distinct引数の値のみが集計に渡されます。ただしDISTINCT修飾子は、厳密に1つの引数の集計でのみ使用できることに注意してください。

9.2.3.3 ユーザー定義の集計の例

この項では、ユーザー定義の集計を実装して使用する例を示します。たとえば、ここではN-triple形式で示されている次のデータが、MYMODELと呼ばれるモデル内に存在しているとします。

<a>  <p>  "1.0"^^xsd:double .
<b>  <p>  "1.5"^^xsd:float .
<c>  <p>  "3"^^xsd:decimal .
<c>  <p>  "4"^^xsd:decimal .
<d>  <p>  "4"^^xsd:string .

例9-5 ユーザー定義の集計の実装

例9-5は、単純なユーザー定義の集計の実装(countSameType)を示しています。この集計には2つの引数があり、1番目は任意のRDF語句、2番目は定数のデータ型URIです。集計は、1番目の引数の位置からのRDF語句にある、2番目の引数と等しいデータ型の数をカウントします。

-- Aggregate type creation
CREATE OR REPLACE TYPE countSameType authid current_user AS OBJECT(

count NUMBER, –- Variable to store the number of same-type terms.

–- Mandatory Functions for aggregates
STATIC FUNCTION ODCIAggregateInitialize(
sctx IN OUT countSameType)
RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateIterate(
self       IN OUT countSameType
, value      IN MDSYS.SDO_RDF_TERM_LIST)
RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateMerge(
self IN OUT countSameType
,ctx2 IN     countSameType)
RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateTerminate (
self IN countSameType
,return_value OUT MDSYS.SDO_RDF_TERM
,flags IN NUMBER)
RETURN NUMBER
);
/
SHOW ERRORS;

–- Interface function for the user-defined aggregate
CREATE OR REPLACE FUNCTION countSameAs (input MDSYS.SDO_RDF_TERM_LIST) RETURN MDSYS.SDO_RDF_TERM
PARALLEL_ENABLE AGGREGATE USING countSameType;
/
show errors;

–- User-defined aggregate body
CREATE OR REPLACE TYPE BODY countSameType IS

STATIC FUNCTION ODCIAggregateInitialize(
sctx            IN OUT countSameType)
RETURN NUMBER IS
BEGIN
sctx := countSameType (0); –- Aggregate initialization
RETURN ODCIConst.Success;
END;

MEMBER FUNCTION ODCIAggregateIterate(
self           IN OUT countSameType
, value          IN MDSYS.SDO_RDF_TERM_LIST )
RETURN NUMBER IS
BEGIN
-- Increment count if the first argument has a literal type
-- URI equal to the value of the second argument
IF (value(1).literal_type = value(2).value_name) THEN
self.count := self.count + 1;
END IF;
RETURN ODCIConst.Success;
END;

MEMBER FUNCTION ODCIAggregateMerge(
self            IN OUT countSameType
,ctx2            IN countSameType)
RETURN NUMBER IS
BEGIN
–- Sum count to merge parallel threads.
self.count := self.count + ctx2.count;
RETURN ODCIConst.Success;
END;

MEMBER FUNCTION ODCIAggregateTerminate(
self            IN countSameType
,return_value    OUT MDSYS.SDO_RDF_TERM
,flags           IN NUMBER)
RETURN NUMBER IS
BEGIN
-- Set the return value
return_value := MDSYS.SDO_RDF_TERM('LIT',to_char(self.count),
'http://www.w3.org/2001/XMLSchema#decimal',NULL,NULL); RETURN  ODCIConst.Success;
END;

END;
/
SHOW ERRORS;

例9-6 GROUP BY句なしで使用されるユーザー定義の集計

例9-6は、問合せ結果のすべてのグループに使用されるcountSameType集計(例9-5)を示しています。

FROM o
from table(sem_match(
'SELECT
(<http://xmlns.oracle.com/rdf/aggExtensions/schema.countSameType>(?o,xsd:decimal)
AS ?o)
WHERE { ?s ?p ?o }',
sem_models('MYMODEL'),null,null,null,null,''));

例9-6の問合せは、次の結果を戻します。

o
--------------------
2

例9-7 GROUP BY句とともに使用されるユーザー定義の集計

例9-7は、GROUP BY句から形成される一連のグループに使用されるcountSameType集計(例9-5)を示しています。

select s, o
from table(sem_match(
'SELECT ?s
(<http://xmlns.oracle.com/rdf/aggExtensions/schema.countSameType>(?o,xsd:decimal)
AS ?o)
WHERE { ?s ?p ?o } GROUP BY ?s',
sem_models('MYMODEL'),null,null,null,null,''));

例9-7の問合せは、次の結果を戻します。

s                    o
-------------------- --------------------
a                    0
b                    0
c                    2
d                    0

10 RDFビュー: RDFとしてのリレーショナル・データ

この章では、Oracle Spatial and Graph RDFセマンティク・グラフのリレーショナル・データ上にRDFビューを作成し、使用する方法を説明します。リレーショナル・データは、W3Cドキュメントに説明のあるRDB2RDFマッピングの2つのフォームのうちの1つを使用して、直接マッピングとR2RMLマッピングで仮想RDFトリプルとして表示されます。

- R2RML: RDB to RDF Mapping Language、W3C勧告(http://www.w3.org/TR/r2rml/)

- A Direct Mapping of Relational Data to RDF、W3C勧告(http://www.w3.org/TR/rdb-direct-mapping/)

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

- リレーショナル・データに対してRDFビューを使用する理由

- RDFビューのAPIサポート

- 例: 直接マッピングを使用したRDFビューの作成

- ネイティブRDFデータと仮想RDB2RDFデータの組合せ

10.1 リレーショナル・データに対してRDFビューを使用する理由

リレーショナル・データでRDFビューを使用すると、異なるソースから入手可能なデータを統合することができます。リレーショナル・データと一致するRDFトリプルを物理的に格納しなくても、リレーショナル・データの長所を利用することができます。Oracle Database 12cリリース1 (12.1)でRDFビューがRDFセマンティク・グラフに含められる前は、カスタムSQL問合せを書き込むか、非標準のマッピングを使用して、生成されたRDFトリプルを物理的にRDFモデルに格納する必要がありました。

RDFデータにリレーショナル・データのマッピングを作成する最も単純な方法は、SEM_APIS.CREATE_RDFVIEW_MODELプロシージャをコールしてRDFビューを作成することと、RDFとして表示したい内容の表またはビューのリストを指定することです。これが、それらのリレーショナル表またはビューの直接マッピングになります。

よりカスタマイズされたマッピングを行うには、R2RMLマッピング・ドキュメントを(たとえばTurtleを使用したRDFで)記述し、必要なマッピングを指定して、マッピング・ドキュメントを(N-Triple形式に変換した後で)ステージング表にロードし(表の定義は、「ステージング表を使用したセマンティク・データのバルク・ロード」を参照)、さらにSEM_APIS.CREATE_RDFVIEW_MODELプロシージャをコールして、ステージング表の名前を指定することでRDFビューを作成する方法があります。

10.2 RDFビューのAPIサポート

SEM_APISパッケージ(「SEM_APISパッケージのサブプログラム」を参照) には、RDFビューを作成、削除、エクスポート(ビューのコンテンツをマテリアライズ)するためのサブプログラムが含まれています。RDFビューはRDFモデルとして作成されますが、物理的にはメタデータのみが含まれています。実際のデータは、RDFビューが作成されたリレーショナル表に引き続き格納されます。

この項の残りの例では、起動元のスキーマに次のリレーショナル表が存在することを前提としています。

CREATE TABLE dept (
deptno NUMBER CONSTRAINT pk_DeptTab_deptno PRIMARY KEY,
dname VARCHAR2(30),
loc VARCHAR2(30)
);

CREATE TABLE emp (
empno NUMBER PRIMARY KEY,
ename VARCHAR2(30),
job VARCHAR2(20),
deptno NUMBER REFERENCES dept (deptno)
);

これらの表が起動元とは異なるスキーマ(たとえば、SCOTT)にある場合、これらの表の名前を指定する際に、スキーマ修飾された表名("SCOTT"."DEPT"および"SCOTT"."EMP")を使用する必要があることに注意してください。

10.2.1 直接マッピングを使用したRDFビューの作成

例10-1では、2つの表EMPとDEPTの直接マッピングに、ベース接頭辞http://empdb/を使用してRDFビュー・モデルを作成します。(仮想)RDF語句は、A Direct Mapping of Relational Data to RDF、W3C勧告(http://www.w3.org/TR/rdb-direct-mapping/)に従って作成されます。

例10-1 直接マッピングを使用したRDFビューの作成

BEGIN
sem_apis.create_rdfview_model(
model_name => 'empdb_model',
tables => SYS.ODCIVarchar2List('EMP', 'DEPT'),
prefix => 'http://empdb/',
options => 'KEY_BASED_REF_PROPERTY=T'
);
END;
/

生成されるプロパティを表示するには、次の文を入力します(オブジェクトは、TESTUSERというユーザーのスキーマに作成されるとします)。

SELECT DISTINCT p
FROM TABLE(SEM_MATCH(
'{?s ?p ?o}',
SEM_Models('empdb_model'),
NULL,
NULL,
NULL));

P
--------------------------------------------------------------------------------
http://empdb/TESTUSER.EMP#DEPTNO
http://empdb/TESTUSER.DEPT#LOC
http://empdb/TESTUSER.EMP#JOB
http://empdb/TESTUSER.DEPT#DEPTNO
http://empdb/TESTUSER.EMP#ENAME
http://www.w3.org/1999/02/22-rdf-syntax-ns#type
http://empdb/TESTUSER.DEPT#DNAME
http://empdb/TESTUSER.EMP#EMPNO
http://empdb/TESTUSER.EMP#ref-DEPTNO

9 rows selected.

例10-2 CONFORMANCE=Tの使用

例10-2は本質的に例10-1と同じですが、CONFORMANCE=Tオプションを使用します(SEM_APIS.CREATE_RDFVIEW_MODELのoptionsパラメータの説明を参照)。出力について、スキーマ名はプロパティ・リストに含まれないことに注意してください。たとえば、例10-2の最初の出力レコードがhttp://empdb/DEPT#LOCであるのに対し、例10-1で生成されるもう一方はhttp://empdb/TESTUSER.DEPT#LOCとなります。

BEGIN
sem_apis.create_rdfview_model(
model_name => 'empdb_model',
tables => SYS.ODCIVarchar2List('EMP', 'DEPT'),
prefix => 'http://empdb/',
options => 'CONFORMANCE=T'
);
END;
/

SELECT DISTINCT p
FROM TABLE(SEM_MATCH(
'{?s ?p ?o}',
SEM_Models('empdb_model'),
NULL,
NULL,
NULL));

P
--------------------------------------------------------------------------------
http://empdb/DEPT#LOC
http://empdb/EMP#ref-DEPTNO
http://empdb/EMP#ENAME
http://empdb/DEPT#DEPTNO
http://empdb/EMP#JOB
http://empdb/EMP#EMPNO
http://www.w3.org/1999/02/22-rdf-syntax-ns#type
http://empdb/DEPT#DNAME
http://empdb/EMP#DEPTNO

9 rows selected.

10.2.2 R2RMLマッピングを使用したRDFビューの作成

2つの表EMPとDEPTを使用してRDFビューを、独自のカスタマイズによって作成する場合、Turtleを使用して指定したR2RMLマッピング・ドキュメントを作成することができます。次に例を示します。

@prefix rr: <http://www.w3.org/ns/r2rml#>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
@prefix ex: <http://example.com/ns#>.

ex:TriplesMap_Dept
rr:logicalTable [ rr:tableName "DEPT" ];
rr:subjectMap [
rr:template "http://data.example.com/department/{DEPTNO}";
rr:class ex:Department;
];
rr:predicateObjectMap [
rr:predicate ex:deptNum;
rr:objectMap [ rr:column "DEPTNO" ; rr:datatype xsd:integer ];
];
rr:predicateObjectMap [
rr:predicate ex:deptName;
rr:objectMap [ rr:column "DNAME" ];
];
rr:predicateObjectMap [
rr:predicate ex:deptLocation;
rr:objectMap [ rr:column "LOC" ];
].

ex:TriplesMap_Emp
rr:logicalTable [ rr:tableName "EMP" ];
rr:subjectMap [
rr:template "http://data.example.com/employee/{EMPNO}";
rr:class ex:Employee;
];
rr:predicateObjectMap [
rr:predicate ex:empNum;
rr:objectMap [ rr:column "EMPNO" ; rr:datatype xsd:integer ];
];
rr:predicateObjectMap [
rr:predicate ex:empName;
rr:objectMap [ rr:column "ENAME" ];
];
rr:predicateObjectMap [
rr:predicate ex:jobType;
rr:objectMap [ rr:column "JOB" ];
];
rr:predicateObjectMap [
rr:predicate ex:worksForDeptNum;
rr:objectMap [ rr:column "DEPTNO" ; rr:dataType xsd:integer ];
];
rr:predicateObjectMap [
rr:predicate ex:worksForDept;
rr:objectMap [
rr:parentTriplesMap ex:TriplesMap_Dept ;
rr:joinCondition [ rr:child "DEPTNO"; rr:parent "DEPTNO" ]]].

その後、(N-Triples形式に変換された)R2RMLマッピングを、SCOTT.R2RTABなどのステージング表にロードし、この表へのSELECT権限をMDSYSに付与します。

次に、例10-3の場合のように、SEM_APIS.CREATE_RDFVIEW_MODELをコールします。

例10-3 R2RMLマッピングによるRDFビューの作成

BEGIN
sem_apis.create_rdfview_model(
model_name => 'empdb_model',
tables => NULL,
r2rml_table_owner => 'SCOTT',
r2rml_table_name => 'R2RTAB'
);
END;
/

10.2.3 RDFビューの削除

例10-4に示すように、RDFビューは、SEM_APIS.DROP_RDFVIEW_MODELプロシージャを使用して削除できます。

例10-4 RDFビューの削除

BEGIN
sem_apis.drop_rdfview_model(
model_name => 'empdb_model'
);
END;
/

10.2.4 RDFビューからステージング表への仮想コンテンツのエクスポート

RDFビューのコンテンツは仮想、つまり直接マッピングまたはR2RMLマッピングによってマップされ、基礎となるリレーショナル・データに対応するRDFトリプルであり、実体はなく、どこにも格納されていません。ただしテストのために、これらの仮想RDFトリプルをRDFモデルに具体化し、格納する必要がある場合があります。SEM_APIS.EXPORT_RDFVIEW_MODELサブプログラムは、RDFビューのRDFトリプルをステージング表に格納します。その後、ステージング表を使用してRDFモデルへロードすることができます。

例10-5では、RDFビューempdb_modelのコンテンツをステージング表SCOTT.RDFTABに実体化(N-Triples形式)します。

例10-5 RDFビューのエクスポート

BEGIN
sem_apis.export_rdfview_model(
model_name => 'empdb_model',
rdf_table_owner => 'SCOTT',
rdf_table_name => 'RDFTAB'
);
END;

10.3 例: 直接マッピングを使用したRDFビューの作成

例10-6は、直接マッピングによるRDFビューを使用した単純なワークフローを示しています。ここでは、次のことを行っています。

1. 2つのリレーショナル表(EMPおよびDEPT)を作成します。

2. 表にデータを挿入します。

3. 2つの表の直接マッピングを使用して、RDFビュー・モデル(empdb_model)を作成します。

4. SEM_MATCHベースのSQL問合せで、SPARQLを使用してRDFビューを問い合せます。

例10-7は、例10-6の文の出力を示しています。

例10-6 直接マッピングによるRDFビューの使用

-- Use the following relational tables.

CREATE TABLE dept (
deptno NUMBER CONSTRAINT pk_DeptTab_deptno PRIMARY KEY,
dname VARCHAR2(30),
loc VARCHAR2(30)
);

CREATE TABLE emp (
empno NUMBER PRIMARY KEY,
ename VARCHAR2(30),
job VARCHAR2(20),
deptno NUMBER REFERENCES dept (deptno)
);

-- Insert some data.

INSERT INTO dept (deptno, dname, loc)
VALUES (1, 'Sales', 'Boston');
INSERT INTO dept (deptno, dname, loc)
VALUES (2, 'Manufacturing', 'Chicago');
INSERT INTO dept (deptno, dname, loc)
VALUES (3, 'Marketing', 'Boston');

INSERT INTO emp (empno, ename, job, deptno)
VALUES (1, 'Alvarez', 'SalesRep', 1);
INSERT INTO emp (empno, ename, job, deptno)
VALUES (2, 'Baxter', 'Supervisor', 2);
INSERT INTO emp (empno, ename, job, deptno)
VALUES (3, 'Chen', 'Writer', 3);
INSERT INTO emp (empno, ename, job, deptno)
VALUES (4, 'Davis', 'Technician', 2);

-- Create an RDF view model using direct mapping of two tables, EMP and DEPT,
-- with a base prefix of http://empdb/.
-- Specify KEY_BASED_REF_PROPERTY=T for the options parameter.

BEGIN
sem_apis.create_rdfview_model(
model_name => 'empdb_model',
tables => SYS.ODCIVarchar2List('EMP', 'DEPT'),
prefix => 'http://empdb/',
options => 'KEY_BASED_REF_PROPERTY=T'
);
END;
/

-- Query an RDF view using SPARQL in a SEM_MATCH-based SQL query.
-- The next statament is a query against an RDF view named empdb_model
-- to find the employees who work for any department located in Boston.

SELECT emp
FROM TABLE(SEM_MATCH(
'{?emp emp:ref-DEPTNO ?dept . ?dept dept:LOC "Boston"}',
SEM_Models('empdb_model'),
NULL,
SEM_ALIASES(
SEM_ALIAS('dept','http://empdb/TESTUSER.DEPT#'),
SEM_ALIAS('emp','http://empdb/TESTUSER.EMP#')
),
null));

-- The preceding query is functionally comparable to this:
SELECT e.empno FROM emp e, dept d WHERE e.deptno = d.deptno AND d.loc = 'Boston';

例10-7 例10-6の出力

SQL> -- Use the following relational tables.
SQL>
SQL> CREATE TABLE dept (
2    deptno NUMBER CONSTRAINT pk_DeptTab_deptno PRIMARY KEY,
3    dname VARCHAR2(30),
4    loc VARCHAR2(30)
5  );

Table created.

SQL>
SQL> CREATE TABLE emp (
2    empno NUMBER PRIMARY KEY,
3    ename VARCHAR2(30),
4    job VARCHAR2(20),
5    deptno NUMBER REFERENCES dept (deptno)
6  );

Table created.

SQL>
SQL> -- Insert some data.
SQL>
SQL> INSERT INTO dept (deptno, dname, loc)
2    VALUES (1, 'Sales', 'Boston');

1 row created.

SQL> INSERT INTO dept (deptno, dname, loc)
2    VALUES (2, 'Manufacturing', 'Chicago');

1 row created.

SQL> INSERT INTO dept (deptno, dname, loc)
2    VALUES (3, 'Marketing', 'Boston');

1 row created.

SQL>
SQL> INSERT INTO emp (empno, ename, job, deptno)
2    VALUES (1, 'Alvarez', 'SalesRep', 1);

1 row created.

SQL> INSERT INTO emp (empno, ename, job, deptno)
2    VALUES (2, 'Baxter', 'Supervisor', 2);

1 row created.

SQL> INSERT INTO emp (empno, ename, job, deptno)
2    VALUES (3, 'Chen', 'Writer', 3);

1 row created.

SQL> INSERT INTO emp (empno, ename, job, deptno)
2    VALUES (4, 'Davis', 'Technician', 2);

1 row created.

SQL>
SQL> -- Create an RDF view model using direct mapping of two tables, EMP and DEPT,
SQL> -- with a base prefix of http://empdb/.
SQL> -- Specify KEY_BASED_REF_PROPERTY=T for the options parameter.
SQL>
SQL> BEGIN
2    sem_apis.create_rdfview_model(
3      model_name => 'empdb_model',
4      tables => SYS.ODCIVarchar2List('EMP', 'DEPT'),
5      prefix => 'http://empdb/',
6      options => 'KEY_BASED_REF_PROPERTY=T'
7    );
8  END;
9  /

PL/SQL procedure successfully completed.

SQL>
SQL> -- Query an RDF view using SPARQL in a SEM_MATCH-based SQL query.
SQL> -- The next statament is a query against an RDF view named empdb_model
SQL> -- to find the employees who work for any department located in Boston.
SQL>
SQL> SELECT emp
2    FROM TABLE(SEM_MATCH(
3      '{?emp emp:ref-DEPTNO ?dept . ?dept dept:LOC "Boston"}',
4      SEM_Models('empdb_model'),
5      NULL,
6      SEM_ALIASES(
7        SEM_ALIAS('dept','http://empdb/TESTUSER.DEPT#'),
8        SEM_ALIAS('emp','http://empdb/TESTUSER.EMP#')
9      ),
10      null));

EMP
--------------------------------------------------------------------------------
http://empdb/TESTUSER.EMP/EMPNO=1
http://empdb/TESTUSER.EMP/EMPNO=3

SQL>
SQL> -- The preceding query is functionally comparable to this:
SQL> SELECT e.empno FROM emp e, dept d WHERE e.deptno = d.deptno AND d.loc = 'Boston';

EMPNO
----------
1
3

10.4 ネイティブRDFデータと仮想RDB2RDFデータの組合せ

1つのSEM_MATCH問合せでSERVICEキーワード(「グラフ・パターン: SPARQL 1.1フェデレーテッド問合せのサポート」を参照)を使用してネイティブ・トリプル・データと仮想RDB2RDFトリプル・データを組み合せることができます。SERVICEキーワードは、ローカル(仮想) RDFデータを示す特別なSERVICE URLを使用してオーバーロードされます。特別なSERVICE URLを表すために次の接頭辞が使用されます。

- ネイティブ・モデル - oram: <http://xmlns.oracle.com/models/>

- ネイティブ仮想モデル - oravm: <http://xmlns.oracle.com/virtual_models/>

- RDB2RDFモデル - orardbm: <http://xmlns.oracle.com/rdb_models/>

例10-8 複数のデータセットの問合せ

例10-8は複数のデータセットを問い合せます。この問合せでは、最初のトリプル・パターン{ ?x rdf:type :Person }は通常どおりネイティブ・モデルm1に対応しますが、{ ?x :name ?name }はローカル・ネイティブ・モデルm2に対応し、{ ?x :email ?email }はローカルRDB2RDFモデルrdfview1に対応します。

select * from table (sem_match(
'SELECT ?x ?name ?email
WHERE {
?x rdf:type :Person .
OPTIONAL { SERVICE oram:m2 { ?x :name ?name } }
OPTIONAL { SERVICE orardbm:rdfview1 { ?x :email ?email } }
}'
sem_models('m1'), null, null, null, null, ' '));

オーバーロードされたSERVICEの使用は、SEM_MATCHのmodels引数に指定された1つのモデルのみで許可されます。オーバーロードされたSERVICE問合せでは、複数のモデルまたは入力としてのルールベースは許可されません。そのような組合せのかわりに、複数のモデルまたは伴意(あるいは両方)を含む仮想モデルを使用する必要があります。また、SEM_MATCHのindex_status引数は、modelsパラメータで入力として渡された仮想モデルに含まれる伴意のみをチェックします。つまり、オーバーロードされたSERVICEコールで参照される伴意のステータスはチェックされません。

例10-9 仮想RDB2RDFデータとネイティブRDFデータの問合せ

例10-9は、2つのデータセットを問い合せます。例10-6のempdb_modelと、peopleという名前のネイティブ・モデルです。

-- Create native model people --
create table atab (gval varchar2(4000), tri sdo_rdf_triple_s);

execute sem_apis.create_sem_model('people','atab','tri');

create table stab(RDF$STC_GRAPH varchar2(4000), RDF$STC_sub varchar2(4000),
RDF$STC_pred varchar2(4000), RDF$STC_obj varchar2(4000));
grant select on stab to mdsys;
grant insert on atab to mdsys;

insert into stab values (null, '<http://empdb/TESTUSER.EMP/EMPNO=1>', '<http://people.org/age>', '"35"^^<http://www.w3.org/2001/XMLSchema#int>');
insert into stab values (null, '<http://empdb/TESTUSER.EMP/EMPNO=2>', '<http://people.org/age>', '"39"^^<http://www.w3.org/2001/XMLSchema#int>');
insert into stab values (null, '<http://empdb/TESTUSER.EMP/EMPNO=3>', '<http://people.org/age>', '"30"^^<http://www.w3.org/2001/XMLSchema#int>');
insert into stab values (null, '<http://empdb/TESTUSER.EMP/EMPNO=4>', '<http://people.org/age>', '"42"^^<http://www.w3.org/2001/XMLSchema#int>');
commit;

exec sem_apis.bulk_load_from_staging_table('people','testuser','stab');

-- Querying multiple datasets --
SELECT emp, age
FROM TABLE(SEM_MATCH(
'SELECT ?emp ?age WHERE{
?emp peop:age ?age
SERVICE orardbm:empdb_model { ?emp emp:ref-DEPTNO ?dept . ?dept dept:LOC "Boston" }
}',
SEM_Models('people'),
NULL,
SEM_ALIASES(
SEM_ALIAS('dept','http://empdb/TESTUSER.DEPT#'),
SEM_ALIAS('emp','http://empdb/TESTUSER.EMP#'),
SEM_ALIAS('peop','http://people.org/')
),
NULL));

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

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

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

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

第II部には、リファレンスおよび補足情報に関する次の章が含まれます。

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

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

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

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

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

- RDFセマンティク・グラフ・サポートの有効化、ダウンロード、または削除

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

- 用語集

リファレンスの章の例を理解するには、「RDFセマンティク・グラフの概要」と「OWLの概要」に記載されている概念およびデータ型について理解しておく必要があります。

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

SEM_APISパッケージには、Oracle DatabaseのResource Description Framework (RDF)およびWeb Ontology Language (OWL)とともに使用できるサブプログラム(ファンクションとプロシージャ)が含まれます。この章のサブプログラムを使用するには、「RDFセマンティク・グラフの概要」と「OWLの概要」に記載されている概念および使用情報について理解しておく必要があります。

この章では、サブプログラムに関するリファレンス情報を示します(サブプログラムのリストはアルファベット順です)。

11.1 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です(「空間データの索引付け」を参照)。テキスト索引の作成に関連付けられているサポート対象オプションは、PREFIX_INDEX、PREFIX_MIN_LENGTH、PREFIX_MAX_LENGTH、およびSUBSTRING_INDEXです(「全文検索」を参照)。キーワードの名前は大/小文字が区別されるため、大文字で指定してください。

使用上の注意

このプロシージャをコールするには、DBA権限が必要です。

データ型索引付けの詳細は、「データ型索引の使用」を参照してください。

RDF空間データに対するデータ型索引の作成に関する詳細は、「空間データの索引付け」を参照してください。

例

次の例では、MY_TBS表領域にxsd:string型のリテラルおよびプレーン・リテラルで索引を作成します。

EXECUTE SEM_APIS.ADD_DATATYPE_INDEX('http://www.w3.org/2001/XMLSchema#string', tablespace_name=>'MY_TBS', parallel=>4);

11.2 SEM_APIS.ADD_SEM_INDEX

書式

SEM_APIS.ADD_SEM_INDEX(
index_code  IN VARCHAR2);

説明

セマンティク・ネットワーク索引を作成することにより、セマンティク・ネットワークの既存のモデルおよび伴意それぞれに対して、一意でないBツリー索引がUNUSABLEステータスで作成されます。

パラメータ

index_code

索引コード文字列。

使用上の注意

このプロシージャをコールするには、DBA権限が必要です。

セマンティク・ネットワーク索引の詳細は、「セマンティク・ネットワーク索引の使用」を参照してください。

例

次の例では、索引コード文字列pcsmを使用して、セマンティク・ネットワークのモデルおよび伴意に対するセマンティク・ネットワーク索引を作成します。

EXECUTE SEM_APIS.ADD_SEM_INDEX('pscm');

11.3 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権限が必要です。

データ型索引の詳細は、「データ型索引の使用」を参照してください。

例

次の例では、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);

11.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およびパーティショニング・ガイド』を参照してください。

使用上の注意

伴意の詳細は、「伴意(ルール索引)」を参照してください。

例

次の例では、伴意rdfs_rix_familyを表領域my_tbsに移動します。

EEXECUTE SEM_APIS.ALTER_ENTAILMENT('rdfs_rix_family', 'MOVE',  'my_tbs');

11.5 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およびパーティショニング・ガイド』を参照してください。

使用上の注意

モデルの詳細は、「セマンティク・データのモデル化」および「データベースのセマンティク・データ」を参照してください。

「RDFデータに対してWorkspace Managerサポートを使用する場合の特別な考慮事項」の説明にあるとおり、このプロシージャはバージョン対応RDFモデルではサポートされません。

例

次の例では、モデルfamilyを表領域my_tbsに移動します。

EEXECUTE SEM_APIS.ALTER_MODEL('family', 'MOVE',  'my_tbs');

11.6 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操作は許可されません。

使用上の注意

セマンティク・ネットワーク索引の詳細は、「セマンティク・ネットワーク索引の使用」を参照してください。

例

次の例では、伴意rdfs_rix_familyのセマンティク・ネットワーク索引を再作成します(また、使用不可になっている場合は使用可能にします)。

EXECUTE SEM_APIS.ALTER_SEM_INDEX_ON_ENTAILMENT('rdfs_rix_family', 'pscm', 'rebuild');

11.7 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操作は許可されません。

使用上の注意

セマンティク・ネットワーク索引の詳細は、「セマンティク・ネットワーク索引の使用」を参照してください。

例

次の例では、モデルfamilyのセマンティク・ネットワーク索引を再作成します(また、使用不可になっている場合は使用可能にします)。

EXECUTE SEM_APIS.ALTER_SEM_INDEX_ON_MODEL('family', 'pscm', 'rebuild');

11.8 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: 列のデータ分布とワークロードに基づいて、ヒストグラムを収集する列が決まります。

- - SKEWONLY: 列のデータ分布に基づいてヒストグラムを収集する列が決まります。

- - 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パッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

「伴意」の詳細は、「伴意(ルール索引)」を参照してください。

例

次の例では、伴意rdfs_rix_familyの統計を収集します。

EXECUTE SEM_APIS.ANALYZE_ENTAILMENT('rdfs_rix_family');

11.9 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: 列のデータ分布とワークロードに基づいて、ヒストグラムを収集する列が決まります。

- - SKEWONLY: 列のデータ分布に基づいてヒストグラムを収集する列が決まります。

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

11.10 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つ以上含まれる、引用符で囲んだオプションの文字列。

- DEL_BATCH_DUPS=USE_INSERTを指定すると、挿入に基づく重複除去方法を使用できるため、入力データに多くの重複が含まれている場合に処理がより高速になる可能性があります。

- MBV_METHOD=SHADOWを指定すると、異なる値をロードする方法を使用できるため、大量のロード処理がより高速になる可能性があります。

- PARALLEL_CREATE_INDEXを指定すると、内部索引をパラレルに作成できるため、バルク・ロード処理のパフォーマンスが向上する可能性があります。

- PARALLEL=<integer>を指定すると、バルク・ロードで行われる処理の多くを、その操作に関連付けて指定した並行度で並列実行できます。

- PARSEを指定すると、ステージング表(グラフ名を含む解析トリプル)から取得されるトリプルを解析できます。

- <task>_JOIN_HINT=<join_type>。ここで、<task>はバルク・ロード中に実行される内部タスクで、IZC(衝突なし)、MBV(バッチ値のマージ)またはMBT(バッチ・トリプルのマージで、空でないモデルにトリプルを追加する際に使用されます)のいずれかの値を取ることができます。また<join_type>が取ることができる値は、USE_NLおよびUSE_HASH。です。

debug

(今後使用予定)

start_comment

ロード操作の開始についてのオプションのコメント。

end_comment

ロード操作の終了についてのオプションのコメント。

使用上の注意

このプロシージャをコールする前に、ステージング表にセマンティク・データをロードする必要があります。詳細は「ステージング表を使用したセマンティク・データのバルク・ロード」を参照してください。

BULK_LOAD_FROM_STAGING_TABLEとファイングレイン・アクセス制御(VPDおよびOLS)の併用

VPDを使用する特定のモデルに対して、またはOLSを使用するネットワーク全体に対して、ファイングレイン・アクセス制御(「RDFデータのファイングレイン・アクセス制御」を参照)が有効な場合、関連ポリシーへの完全なアクセス権限を持つユーザーのみがバルク・ロード操作を実行できます。VPDポリシー(「RDFデータのVPDポリシー」を参照)に関連付けられる名前空間に対して、パッケージ定数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 => 'IZC_JOIN_HINT=USE_HASH MBV_JOIN_HINT=USE_HASH');

11.11 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ビュー(「推論: ルールとルールベース」を参照)またはSDO_RULES_INDEX_INFOビュー(「伴意 (ルール索引)」を参照)のSTATUS列の値がFAILEDであるかどうかを確認します。

ルールベースまたは伴意が失敗の状態にない場合、このプロシージャは何のアクションも実行せず、成功のステータスを戻します。

RDFオブジェクトが現在使用されている場合、例外が生成されます。

例

次の例では、ルールベースfamily_rbが失敗の状態にある場合にのみ、そのルールベースを削除します。

EXECUTE SEM_APIS.CLEANUP_FAILED('RULEBASE', 'family_rb');

11.12 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$表(「文」を参照)のVALUE_NAME列の値、またはSEM_MATCHテーブル・ファンクションから戻されたvar属性の値と一致する必要があります。

value_type

テキスト情報のタイプ。MDSYS.RDF_VALUE$表(「文」を参照)のVALUE_TYPE列の値、またはSEM_MATCHテーブル・ファンクションから戻されたvar$RDFVTYP属性の値と一致している必要があります。

literal_type

型付きリテラルの場合は型情報、それ以外の場合はNULL。NULL値か、MDSYS.RDF_VALUE$表(「文」を参照)のLITERAL_TYPE列の値、またはSEM_MATCHテーブル・ファンクションから戻されたvar$RDFLTYP属性の値と一致している必要があります。

language_type

言語タグ。MDSYS.RDF_VALUE$表(「文」を参照)のLANGUAGE_TYPE列の値、またはSEM_MATCHテーブル・ファンクションから戻されたvar$RDFLANG属性の値と一致している必要があります。

long_value

字句の値の長さが4000バイトを超える場合の文字列。MDSYS.RDF_VALUE$表(「文」を参照)の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>

11.13 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,
inf_ext_user_func_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です。ルールおよびルールベースの詳細は、「推論: ルールとルールベース」を参照してください。

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の1つ目のモデルのトリプルがmodels_inの1つ目のモデルにコピーされ、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(前件ラベルの使用の場合)。各定数の詳細な説明は、「推論されたトリプルのラベルの生成」を参照してください。

- カスタム・ラベル・ジェネレータを使用する場合、カスタム・ラベル・ジェネレータ・タイプを指定します。カスタム・ラベル・ジェネレータの作成および実装の詳細は、「アプリケーション・ロジックに基づくラベルの使用」を参照してください。

include_named_g

指定された名前付きグラフからのすべてのトリプル(すべてのソース・モデル全体)を、名前付きグラフ・ベースのグローバル推論(NGGI、「名前付きグラフ・ベースのグローバル推論(NGGI)」を参照)に加えます。たとえばinclude_named_g => sem_graphs('<urn:G1>','<urn:G2>')は、名前付きグラフG1およびG2からのトリプルがNGGIに含められることを意味します。

このデータ型はSEM_GRAPHSで、TABLE OF VARCHAR2(4000)という定義を持ちます。

include_default_g

指定されたモデルのグラフ名がNULLであるすべてのトリプルを、名前付きグラフ・ベースのグローバル推論(NGGI、「名前付きグラフ・ベースのグローバル推論」を参照)に加えます。たとえば、include_default_g => sem_models('m1')は、モデルM1からのグラフ名がNULLであるすべてのトリプルをNGGIに含めます。

include_all_g

指定されたモデル内にあるすべてのトリプルを、そのグラフ名の値に関わらず、名前付きグラフ・ベースのグローバル推論(NGGI、「名前付きグラフ・ベースのグローバル推論」を参照)に加えます。たとえば、include_all_g => sem_models('m2')は、モデルM2のすべてのトリプルをNGGIに含めます。

inf_ng_name

名前付きグラフ・ベースのグローバル推論(NGGI、「名前付きグラフ・ベースのグローバル推論(NGGI)」を参照)で推論された新しいトリプルすべてに、指定されたグラフ名を割り当てます。

inf_ext_user_func_name

ユーザー定義の推論ファンクションの名前、またはユーザー定義ファンクションの名前のカンマ区切りのリスト。特定のパラメータの形式要件やオプションなど、ユーザー定義の推論ファンクションの作成の詳細は、「ユーザー定義の推論のAPIサポート」を参照してください。(例を含むユーザー定義の推論の詳細は、「ユーザー定義の推論と問合せ」を参照してください。)

使用上の注意

inf_components_inパラメータには、キーワードSCOHCOMPH、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の任意の組合せを指定できます。これらのキーワードの意味の説明は、キーワードのアルファベット順のリストである表11-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ルールベースなどの既存のルールベースには、デフォルトでは前述の新しいコンポーネントは含まれていないため、使用するには明示的に設定する必要があります。これらを表11-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');

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

キーワード

説明

CHAIN

OWL 2で定義されるプロパティ・チェーン・セマンティクを取得します。長さが2のチェーンのみがサポートされます。デフォルトでは、これはSKOSCOREルールベースに含まれています。サブプロパティ・チェーンはOWL 2の機能であり、下位互換性を確保するため、このコンポーネントはデフォルトではOWLPrimeルールベースに含まれていません。(プロパティ・チェーンの処理の詳細は、「プロパティ・チェーンの処理」を参照)(リリース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の詳細は、「RDF Semantics」(http://www.w3.org/TR/rdf-mt/)の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は「問合せのための圧縮レベルが低い」設定を使用しますが、CPQH=Tを追加して「問合せのための圧縮レベルが高い」設定に変更できます。

注意:

COL_COMPRESS=Tは、ハイブリッド列圧縮(HCC) をサポートするシステムでのみ指定できます。HCCの詳細は、『Oracle Database概要』を参照してください。

- DEST_MODEL=<model_name>は、増分推論のために、1つ以上のdelta_inモデルが追加される宛先モデルを指定します。指定される宛先モデルは、models_inパラメータで指定されるモデルの1つである必要があります。

- DISTANCE=T: セマンティク演算子に有効な補助的距離情報を生成します。

- DOP=nには、パラレル推論の並列度を指定します。これにより推論パフォーマンスを向上させることができます。パラレル推論の詳細は、「パラレル推論の使用」を参照してください。

- ENTAIL_ANYWAY=T: 伴意のステータスが有効の場合、OWL推論を強制的に続行し、既存の推論データ(伴意)を再利用します。デフォルトでは、モデルとルールベースの組合せに対して有効な伴意がすでに存在する場合、SEM_APIS.CREATE_ENTAILMENTは即座に終了します。

- HASH_PART=nを指定すると、指定した数のハッシュ・パーティションが、内部の作業表に作成されます。(この数は、2、4、8、16、32など、2の累乗値である必要があります。)多くの異なった述語がセマンティク・データ・モデルにある場合、値を指定できます。ベンチマーク・オントロジのOracle内部のテストで、HASH_PART=32は適切に動作しました。

- INC=Tは、伴意に対して増分推論を有効にします。増分推論の詳細は、「増分推論の実行」を参照してください。

- LOCAL_NG_INF=Tは、名前付きグラフ・ベースのグローバル推論(NGGI)のかわりに名前付きグラフ・ベースのローカル推論(NGLI)が使用されるようにします。NGLIの詳細は、「名前付きグラフ・ベースのローカル推論(NGLI)」を参照してください。

- OPT_SAMEAS=Tは、伴意に、統合されたowl:sameAs伴意を使用します。このオプションを指定する場合、PROOF=Tは指定できません。owl:sameAs推論の最適化に関する詳細は、「owl:sameAs推論の最適化」を参照してください。

- 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ラベル・ジェネレータを使用する場合、表11-2から適切なSEM_RDFSAパッケージ定数値を指定します。

表11-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

トリプルのコンポーネント(主語、述語、目的語およびルール)のためのすべての使用可能なラベルのうち、優位ラベルを計算して、推論されたトリプルのラベルとしてそれを適用するラベル・ジェネレータ。

ファイングレイン・アクセス制御(OLSおよびVPD)に関する考慮事項

VPDを使用する特定のモデルに対して、またはOLSを使用するネットワーク全体に対して、ファイングレイン・アクセス制御を有効にした場合、関連ポリシーへの完全なアクセス権限を持つユーザーのみが伴意を作成できます。VPDポリシー(「RDFデータのVPDポリシー」を参照)に関連付けられる名前空間に対して、パッケージ定数sem_rdfsa.VPD_FULL_ACCESSによって1に定義されるコンテキスト属性を設定することで、VPDポリシーへの完全なアクセス権限が付与されます。OLSが有効な場合、OLSポリシーへの完全なアクセス権限はSA_USER_ADMIN.SET_USER_PRIVSプロシージャを使用して付与されます。1つ以上のVPD対応RDFモデルを使用して作成されるすべての伴意に対して、VPDポリシーが自動的に適用されます。「RDFデータのVPDポリシー」で説明するように、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. --

11.14 SEM_APIS.CREATE_RDFVIEW_MODEL

書式

SEM_APIS.CREATE_RDFVIEW_MODEL(
model_name               IN VARCHAR2,
tables                          IN SYS.ODCIVarchar2List,
prefix                           IN VARCHAR2 DEFAULT NULL,
r2rml_table_owner      IN VARCHAR2 DEFAULT NULL,
r2rml_table_name       IN VARCHAR2 DEFAULT NULL,
schema_table_owner  IN VARCHAR2 DEFAULT NULL,
schema_table_name   IN VARCHAR2 DEFAULT NULL,
options                         IN VARCHAR2 DEFAULT NULL);

説明

指定された表またはビューのリストの直接マッピングを使用して、または、R2RMLマッピングを使用してRDFビューを作成します。

パラメータ

model_name

作成するRDFビューの名前。

tables

直接マッピングを使用して作成されるRDFビューのリレーショナル・データのソースである表またはビューのリスト。R2RMLマッピングを使用する場合、このパラメータはNULLである必要があります。

prefix

RDFビューでURIの先頭に追加される、ベースとなる接頭辞。

r2rml_table_owner

R2MLマッピングの場合、このパラメータは必須であり、RDFビューの作成に使用されるR2RMLマッピング(N-triple形式)を保持するステージング表を所有するスキーマの名前を指定します。

直接マッピングの場合、このパラメータはオプションで、直接マッピングから生成されるR2RMLマッピング(N-triple形式)が格納されるステージング表を所有するスキーマの名前を指定します。

r2rml_table_name

R2MLマッピングの場合、このパラメータは必須であり、RDFビューの作成に使用されるR2RMLマッピング(N-triple形式)を保持するステージング表の名前を指定します。

直接マッピングの場合、このパラメータはオプションで、直接マッピングから生成されるR2RMLマッピング(N-triple形式)が格納されるステージング表の名前を指定します。

schema_table_owner

RDFビューのために生成されたRDFスキーマが格納されるステージング表を所有するスキーマの名前。

schema_table_name

RDFビューのために生成されたRDFスキーマが格納されるステージング表の名前。

options

直接マッピングでは、次の任意の組合せ(何も含めない場合を含む)をオプションで指定できます。

- CONFORMANCE=Tは、RDFの述語名を構築するためのデータベース制約名およびスキーマ修飾された表名またはビュー名など、デフォルトでは含まれない一部の情報を抑止します。
詳細は、「直接マッピングによるRDFビューの作成」の例10-2を参照してください。

- GENERATE_ONLY=Tは、指定された表のためにR2RMLマッピングを生成して、指定されたr2rml_table_nameに格納するのみで、基礎となるRDFビュー・モデルは作成されません。このオプションを指定する場合、r2rml_table_nameパラメータはNULL以外である必要があります。

- KEY_BASED_REF_PROPERTY=Tは、外部キー列名を使用してRDFの述語名を構築します。このオプションが指定されない場合は、データベース制約名がRDFの述語名を構築するために使用されます。
直接マッピングの場合、RDFの述語名は対応するデータベース名から導出されるため、外部キー制約のために名前を保持することはデフォルトの動作です。

KEY_BASED_REF_PROPERTY=Tの使用例については、「直接マッピングによるRDFビューの作成」の例10-1を参照してください。

- SCALAR_COLUMNS_ONLY=Tは、指定された表またはビューのスカラー列にのみR2RMLマッピングを生成します。表またはビューの他の非スカラー列は、無視されます。このオプションを指定しない場合、ユーザー定義型またはLOBの列がある表に直接マッピングを作成しようとすると、エラーが発生します。

使用上の注意

MDSYSに、r2rml_table_nameおよびschema_table_nameに対するSELECTおよびINSERT権限を付与する必要があります。

RDFビューの詳細は、「RDFビュー: RDFとしてのリレーショナル・データ」を参照してください。

例

次の例では、表EMPおよびDEPTに直接マッピングを使用してRDFビューを作成します。URIに使用した接頭辞はhttp://empdb/です。

BEGIN
sem_apis.create_rdfview_model(
model_name => 'empdb_model_direct',
tables => sem_models('EMP', 'DEPT'),
prefix => 'http://empdb/'
);
END;
/

次の例では、ステージング表SCOTT.R2RTABのRDFトリプルによって指定されるように、R2RMLマッピングを使用してRDFビューを作成します。

BEGIN
sem_apis.create_rdfview_model(
model_name => 'empdb_model_R2RML',
tables => NULL,
r2rml_table_owner => 'SCOTT',
r2rml_table_name => 'R2RTAB'
);
END;
/

11.15 SEM_APIS.CREATE_RULEBASE

書式

SEM_APIS.CREATE_RULEBASE(
rulebase_name  IN VARCHAR2);

説明

ルールベースを作成します。

パラメータ

rulebase_name

ルールベースの名前。

使用上の注意

このプロシージャは、ユーザー定義のルールベースを作成します。ルールベースの作成後、そのルールベースにルールを追加できます。RDFデータの問合せでルールベースのルールを適用するには、SEM_MATCH表関数のコールでルールベースを指定します。

ルールおよびルールベースの詳細は、「推論: ルールとルールベース」を参照してください。(SEM_MATCH表関数については、「SEM_MATCH表関数を使用したセマンティク・データの問合せ」を参照してください。)

例

次の例では、ルールベースfamily_rbを作成します。(この例は、「例: 家系の情報」の 例1-90からの抜粋です。)

EXECUTE SEM_APIS.CREATE_RULEBASE('family_rb');

11.16 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プロシージャのコールで指定された表領域です。

使用上の注意

このプロシージャをコールしてセマンティク・テクノロジ・モデルを作成する前に、セマンティク・テクノロジ・データへの参照を保持する表を作成する必要があります。詳細は、「セマンティク・データを使用するためのクイック・スタート」を参照してください。

このプロシージャは、モデルをMDSYS.SEM_MODEL$ビュー(「モデルのメタデータ」を参照)に追加します。

このプロシージャは、モデルを作成する際にサポートされる唯一の方法です。MDSYS.SEM_MODEL$ビューにSQLのINSERT文を使用しないでください。

モデルを削除するには、SEM_APIS.DROP_SEM_MODELプロシージャを使用します。

例

次の例では、セマンティク・テクノロジ・モデルarticlesを作成します。モデルのトリプル・データへの参照は、ARTICLES_RDF_DATA表のTRIPLE列に格納されます。(この例は、「例: 家系の情報」の例1-89の抜粋です。)

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

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

11.18 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

(今後使用予定)

使用上の注意

詳細および例は、「外部表を使用してN-Quad形式データをステージング表にロードする方法」を参照してください。

例

次の例では、ソース外部表を作成します。(この例は、「外部表を使用してN-Quad形式データをステージング表にロードする方法」の例1-82から抜粋したものです。)

BEGIN
sem_apis.create_source_external_table(
source_table    => 'stage_table_source'
,def_directory   => 'DATA_DIR'
,bad_file        => 'CLOBrows.bad'
);
END;

11.19 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,
entailments IN SEM_ENTAILMENTS DEFAULT NULL);

説明

指定されたセマンティク・モデルや伴意を含む仮想モデルを作成します。伴意は、次のいずれかの方法で指定できます。

- 1つ以上のモデルおよび1つ以上のルールベースを指定する。この場合、仮想モデルは、指定されたモデルおよびルールベースの正確な組合せに対応する単一の伴意を使用して作成されます。このような伴意が存在しない場合はエラーが発生します。

- 0 (ゼロ)以上のモデルおよび1つ以上の伴意を指定する。この場合、モデルと伴意の関係にかかわらず、モデルと伴意の内容が組み合されます。

最初のメソッドを使用すると、確実に適切で完全なデータセットになり、2つ目のメソッドを使用すると、適切で完全な制約が緩和され、より柔軟になります。

パラメータ

vm_name

作成する仮想モデルの名前。

models

1つ以上のセマンティク・モデル名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。このパラメータがNULLの場合、仮想モデル定義にモデルは含まれません。

rulebases

1つ以上のルールベース名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_RULEBASESです。このパラメータがNULLの場合、仮想モデル定義にルールベースは含まれません。ルールおよびルールベースの詳細は、「推論: ルールとルールベース」を参照してください。

このパラメータを指定する場合、entailmentsパラメータも指定することはできません。

options

REPLACE=Tを指定すると、仮想モデルを、削除することなく置き換えます。(このオプションを使用することは、ビューでCREATE OR REPLACE VIEWを使用することと似ています。)

entailments

1つ以上の伴意名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_ENTAILMENTSです。このパラメータがNULLの場合、仮想モデル定義に伴意は含まれません。伴意の詳細は、「OWL推論の使用方法」を参照してください。

このパラメータを指定する場合、rulebasesパラメータも指定することはできません。

使用上の注意

仮想モデルの説明(使用方法の情報を含む)は、「仮想モデル」を参照してください。

指定されたセマンティク・モデルとルールベースの組合せごとに、伴意が存在する必要があります。

仮想モデルを作成するには、(A)指定された各モデルおよび対応する伴意の所有者、または(B) DBA権限を持つユーザーである必要があります。

仮想モデルを置き換えるには、仮想モデルの所有者またはDBA権限を持つユーザーである必要があります。

このプロシージャは、次の書式の名前を持つビューを作成します。

- SEMV_vm_name。これは、各モデルおよび伴意内のトリプルのUNION ALLに対応します。このビューには重複が含まれることがあります。

- SEMU_vm_nameは、各モデルおよび伴意内のトリプルのUNIONに対応します。このビューには重複は含まれません(このため、SEMUのUはunique(一意)を表します)。
ただし、仮想モデルに1つのみのセマンティク・モデルが含まれ、伴意は含まれない場合、SEMU_vm_nameビューは作成されません。

モデルm1、m2、m3から作成された仮想モデルvm1の「仮想モデル」の例を、モデルm1、m2、m3用にOWLPrimeルールベースを使用して作成した伴意で使用するために、このプロシージャは次の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'));

次の例では、緩和された伴意の指定を使用して、仮想モデルVM1を作成します。

EXECUTE sem_apis.create_virtual_model('VM1', models=>sem_models('model_1', 'model_2'), entailments=>sem_entailments('entailment1','entailment2'));

次の例では、REPLACE=Tオプションを使用して、仮想モデルVM1を効果的に再定義します。

EXECUTE sem_apis.create_virtual_model('VM1', models=>sem_models('model_1', 'model_2'), entailments=>sem_entailments('entailment1'), options=>'REPLACE=T');

11.20 SEM_APIS.DELETE_ENTAILMENT_STATS

書式

SEM_APIS.DELETE_ENTAILMENT_STATS (
entailment_name  IN VARCHAR2,
cascade_parts    IN BOOLEAN DEFAULT TRUE,
cascade_columns  IN BOOLEAN DEFAULT TRUE,
cascade_indexes  IN BOOLEAN DEFAULT TRUE,
no_invalidate    IN BOOLEAN DEFAULT DBMS_STATS.AUTO_INVALIDATE,
force            IN BOOLEAN DEFAULT FALSE);

説明

指定された伴意の統計を削除します。

パラメータ

entailment_name

伴意の名前。

(他のパラメータ)

DBMS_STATS.DELETE_TABLE_STATSプロシージャのパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。なお、ここでのforceは伴意統計に適用されます。

使用上の注意

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、伴意OWLTST_IDXの統計を削除します。

EXECUTE SEM_APIS.DELETE_ENTAILMENT_STATS('owltst_idx');

11.21 SEM_APIS.DELETE_MODEL_STATS

書式

SEM_APIS.DELETE_MODEL_STATS (
model_name      IN VARCHAR2,
cascade_parts   IN BOOLEAN DEFAULT TRUE,
cascade_columns IN BOOLEAN DEFAULT TRUE,
cascade_indexes IN BOOLEAN DEFAULT TRUE,
no_invalidate   IN BOOLEAN DEFAULT DBMS_STATS.AUTO_INVALIDATE,
force           IN BOOLEAN DEFAULT FALSE);

説明

指定されたモデルの統計を削除します。

パラメータ

model_name

モデルの名前。

(他のパラメータ)

DBMS_STATS.DELETE_TABLE_STATSプロシージャのパラメータに関する詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。なお、ここでのforceは伴意統計に適用されます。

使用上の注意

モデル所有者またはDBA権限を持つユーザーのみが、このプロシージャを実行できます。

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、モデルFAMILYの統計を削除します。

EXECUTE SEM_APIS.DELETE_MODEL_STATS('family');

11.22 SEM_APIS.DISABLE_CHANGE_TRACKING

書式

SEM_APIS.DISABLE_CHANGE_TRACKING(
models_in IN SEM_MODELS);

説明

指定されたモデルのセットの変更トラッキングを無効にします。

パラメータ

models_in

1つ以上のモデル名。そのデータ型は、TABLE OF VARCHAR2(25)という定義を持つSEM_MODELSです。

使用上の注意

モデルの変更トラッキングを無効にすることにより、そのモデルを使用するすべての伴意の増分推論が自動的に無効になります。

このプロシージャを使用するには、指定したモデルの所有者である必要があり、あらかじめ増分推論を有効にしておく必要があります。

増分推論の説明(使用方法の情報を含む)は、「増分推論の実行」を参照してください。

例

次の例では、familyモデルの変更トラッキングを無効にします。

EXECUTE sem_apis.disable_change_tracking(sem_models('family'));

11.23 SEM_APIS.DISABLE_INC_INFERENCE

書式

SEM_APIS.DISABLE_INC_INFERENCE(
entailment_name IN VARCHAR2);

説明

指定された伴意(ルール索引)の増分推論を無効にします。

パラメータ

entailment_name

増分推論を無効にする伴意の名前。

使用上の注意

このプロシージャを使用するには、指定した伴意の所有者である必要があり、SEM_APIS.ENABLE_INC_INFERENCEプロシージャによって、あらかじめ増分推論を有効にしておく必要があります。

このプロシージャをコールすることにより、起動ユーザーが所有する、この特定の推論によってのみ変更を追跡していたすべてのモデルの変更トラッキングが自動的に無効になります。

増分推論の説明(使用方法の情報を含む)は、「増分推論の実行」を参照してください。

例

次の例では、伴意RDFS_RIX_FAMILYの増分推論を有効にします。

EXECUTE sem_apis.disable_inc_inference('rdfs_rix_family');

11.24 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権限が必要です。

データ型索引の詳細は、「データ型索引の使用」を参照してください。

例

次の例では、xsd:string型のリテラルおよびプレーン・リテラルのデータ型索引を削除します。

EXECUTE SEM_APIS.DROP_DATATYPE_INDEX('http://www.w3.org/2001/XMLSchema#string');

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

11.26 SEM_APIS.DROP_RDFVIEW_MODEL

書式

SEM_APIS.DROP_RDFVIEW_MODEL(
model_name IN VARCHAR2,
options    IN VARCHAR2 DEFAULT NULL);

説明

RDFビューを削除します。

パラメータ

model_name

削除するRDFビューの名前。

options

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

使用上の注意

削除するRDFビューの所有者である必要があります。

RDFビューの詳細は、「RDFビュー: RDFとしてのリレーショナル・データ」を参照してください。

例

次の例では、RDFビューを削除します。

BEGIN
sem_apis.drop_rdfview_model(
model_name => 'empdb_model'
);
END;
/

11.27 SEM_APIS.DROP_RULEBASE

書式

SEM_APIS.DROP_RULEBASE(
rulebase_name  IN VARCHAR2);

説明

ルールベースを削除します。

パラメータ

rulebase_name

ルールベースの名前。

使用上の注意

このプロシージャは、指定されたルールベースを削除します。削除されたルールベースは、SEM_MATCH表関数のコールで使用できなくなります。ルールベースの詳細は、「推論: ルールとルールベース」を参照してください。

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

例

次の例では、ルールベースfamily_rbを削除します。

EXECUTE SEM_APIS.DROP_RULEBASE('family_rb');

11.28 SEM_APIS.DROP_SEM_INDEX

書式

SEM_APIS.DROP_SEM_INDEX(
index_code  IN VARCHAR2);

説明

セマンティク・ネットワークのモデルおよび伴意に対するセマンティク・ネットワーク索引を削除します。

パラメータ

index_code

索引コード文字列。前のSEM_APIS.ADD_SEM_INDEXプロシージャのコールで指定されたindex_code値と一致している必要があります。

使用上の注意

セマンティク・ネットワーク索引の詳細は、「セマンティク・ネットワーク索引の使用」を参照してください。

例

次の例では、索引コード文字列pcsmを使用して、セマンティク・ネットワークのモデルおよび伴意に対するセマンティク・ネットワーク索引を削除します。

EXECUTE SEM_APIS.DROP_SEM_INDEX('pscm');

11.29 SEM_APIS.DROP_SEM_MODEL

書式

SEM_APIS.DROP_SEM_MODEL(
model_name  IN VARCHAR2);

説明

セマンティク・テクノロジ・モデルを削除します。

パラメータ

model_name

モデルの名前。

使用上の注意

このプロシージャで、MDSYS.SEM_MODEL$ビュー(「モデルのメタデータ」を参照)からモデルが削除されます。

このプロシージャは、モデルを削除する際にサポートされる唯一の方法です。MDSYS.SEM_MODEL$ビューにSQLのDELETE文を使用しないでください。

モデルを削除できるのは、そのモデルの作成者のみです。

例

次の例では、セマンティク・テクノロジ・モデルarticlesを削除します。

EXECUTE SEM_APIS.DROP_SEM_MODEL('articles');

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

11.31 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.

11.32 SEM_APIS.DROP_VIRTUAL_MODEL

書式

SEM_APIS.DROP_VIRTUAL_MODEL(
vm_name  IN VARCHAR2);

説明

仮想モデルを削除します。

パラメータ

vm_name

削除する仮想モデルの名前。

使用上の注意

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

このプロシージャを使用するには、指定した仮想モデルの所有者である必要があります。

仮想モデルの説明(使用方法の情報を含む)は、「仮想モデル」を参照してください。

例

次の例では、仮想モデルVM1を削除します。

EXECUTE sem_apis.drop_virtual_model('VM1');

11.33 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プロシージャを使用します。

増分推論の説明(使用方法の情報を含む)は、「増分推論の実行」を参照してください。

例

次の例では、familyモデルの変更トラッキングを有効にします。

EXECUTE sem_apis.enable_change_tracking(sem_models('family'));

11.34 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プロシージャを使用します。

増分推論の説明(使用方法の情報を含む)は、「増分推論の実行」を参照してください。

例

次の例では、伴意RDFS_RIX_FAMILYの増分推論を有効にします。

EXECUTE sem_apis.enable_inc_inference('rdfs_rix_family');

11.35 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キーワードを使用する際の詳細は、「セマンティク・データに対する問合せでの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;

11.36 SEM_APIS.ESCAPE_CLOB_VALUE

書式

SEM_APIS.ESCAPE_CLOB_VALUE(
val          IN  CLOB 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)に従って、特殊文字と非ASCII文字がエスケープされた入力CLOB値が返されます。

パラメータ

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キーワードを使用する際の詳細は、「セマンティク・データに対する問合せでのSEM_MATCH表関数の使用」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力文字列をエスケープします。

SELECT SEM_APIS.ESCAPE_CLOB_VALUE('abc' || chr(9) || 'def' || chr(10) || 'hij')
FROM DUAL;

11.37 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キーワードを使用する際の詳細は、「セマンティク・データに対する問合せでの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;

11.38 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文字がエスケープされた入力CLOB値が返されます。

パラメータ

val

エスケープするテキスト。

utf_encode

chr(8)、chr(9)、chr(10)、chr(12)、chr(13)以外の非ASCII文字および出力不可能なASCII文字をエスケープする必要がある場合は、1 (デフォルト)に設定します。それ以外の場合、これらの文字はエスケープされません。

使用上の注意

SEM_MATCH表関数のoptionsパラメータで、DO_UNESCAPEキーワードを使用する際の詳細は、「セマンティク・データに対する問合せでのSEM_MATCH表関数の使用」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力文字列をエスケープします。

SELECT SEM_APIS.ESCAPE_RDF_VALUE('abc' || chr(9) || 'def' || chr(10) || 'hij')
FROM DUAL;

11.39 SEM_APIS.EXPORT_ENTAILMENT_STATS

書式

SEM_APIS.EXPORT_ENTAILMENT_STATS (
entailment_name IN VARCHAR2,
stattab         IN VARCHAR2,
statid          IN VARCHAR2 DEFAULTNULL,
cascade         IN BOOLEAN DEFAULT TRUE,
statown         IN VARCHAR2 DEFAULT NULL,
stat_category   IN VARCHAR2 DEFAULT 'OBJECT_STATS');

説明

指定された伴意の統計をエクスポートして、ユーザー統計表に格納します。

パラメータ

entailment_name

伴意の名前。

(他のパラメータ)

DBMS_STATS.EXPORT_TABLE_STATSプロシージャのパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。なお、ここでのforceは伴意統計に適用されます。

また、cascadeを指定しても、伴意に関連付けられているすべての索引統計をエクスポートします。

使用上の注意

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、伴意OWLTST_IDXの統計をエクスポートして、表STAT_TABLEに格納します。

EXECUTE SEM_APIS.EXPORT_ENTAILMENT_STATS('owltst_idx', 'stat_table');

11.40 SEM_APIS.EXPORT_MODEL_STATS

書式

SEM_APIS.EXPORT_MODEL_STATS (
model_name   IN VARCHAR2,
stattab      IN VARCHAR2,
statid       IN VARCHAR2 DEFAULT NULL,
cascade      IN BOOLEAN DEFAULT TRUE,
statown      IN VARCHAR2 DEFAULT NULL,
stat_category IN VARCHAR2 DEFAULT 'OBJECT_STATS');

説明

指定されたモデルの統計をエクスポートして、ユーザー統計表に格納します。

パラメータ

entailment_name

伴意の名前。

(他のパラメータ)

DBMS_STATS.EXPORT_TABLE_STATSプロシージャのパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

また、cascadeを指定しても、モデルに関連付けられているすべての索引統計をエクスポートします。

使用上の注意

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、モデルFAMILYの統計をエクスポートして、表STAT_TABLEに格納します。

EXECUTE SEM_APIS.EXPORT_MODEL_STATS('family', 'stat_table');

11.41 SEM_APIS.EXPORT_RDFVIEW_MODEL

書式

SEM_APIS.EXPORT_RDFVIEW_MODEL(
model_name       IN VARCHAR2,
rdf_table_owner  IN VARCHAR2 DEFAULT NULL,
rdf_table_name   IN VARCHAR2 DEFAULT NULL,
options          IN VARCHAR2 DEFAULT NULL);

説明

RDFビューの仮想RDFトリプルをステージング表にエクスポート(マテリアライズ)します。

パラメータ

model_name

エクスポートするRDFビューの名前。

rdf_table_owner

RDFビューから取得されたRDFトリプルが格納されるステージング表を所有するスキーマの名前。

rdf_table_name

RDFビューから取得されたRDFトリプルが格納されるステージング表の名前。

options

(今後使用予定)

使用上の注意

データベース・ビューSEMM_<model_name>のSELECT権限を持つ必要があります。

RDFビューの詳細は、「RDFビュー: RDFとしてのリレーショナル・データ」を参照してください。RDFビューのエクスポートの詳細は、「ステージング表へのRDFビューの仮想内容のエクスポート」を参照してください。

例

次の例では、RDFビューempdb_modelからステージング表SCOTT.RDFTABにRDFトリプルをエクスポートします。

BEGIN
sem_apis.export_rdfview_model(
model_name => 'empdb_model',
rdf_table_owner => 'SCOTT',
rdf_table_name => 'RDFTAB'
);
END;
/

11.42 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$ビュー(「モデルのメタデータ」を参照)のMODEL_NAME列の値と一致している必要があります。

モデルのセットの変更トラッキングを有効にするには、SEM_APIS.ENABLE_CHANGE_TRACKINGプロシージャを使用します。

増分推論の説明(使用方法の情報を含む)は、「増分推論の実行」を参照してください。

例

次の例では、モデルの変更トラッキング情報を表示します。

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

11.43 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プロシージャを使用します。

増分推論の説明(使用方法の情報を含む)は、「増分推論の実行」を参照してください。

例

次の例では、伴意の増分推論情報を表示します。

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
/

11.44 SEM_APIS.GET_MODEL_ID

書式

SEM_APIS.GET_MODEL_ID(
model_name  IN VARCHAR2
) RETURN NUMBER;

説明

セマンティク・テクノロジ・モデルのモデルID番号を戻します。

パラメータ

model_name

セマンティク・テクノロジ・モデルの名前。

使用上の注意

model_nameの値は、MDSYS.SEM_MODEL$ビュー(「モデルのメタデータ」を参照)のMODEL_NAME列の値と一致している必要があります。

例

次の例では、モデルarticlesのモデルID番号を戻します。(この例は、「例: 家系の情報」の例1-89の抜粋です。)

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

MODEL_ID
----------
1

11.45 SEM_APIS.GET_MODEL_NAME

書式

SEM_APIS.GET_MODEL_NAME(
model_id  IN NUMBER
) RETURN VARCHAR2;

説明

セマンティク・テクノロジ・モデルのモデル名を戻します。

パラメータ

model_id

セマンティク・テクノロジ・モデルのID番号。

使用上の注意

model_idの値は、MDSYS.SEM_MODEL$ビュー(「モデルのメタデータ」を参照)のMODEL_ID列の値と一致している必要があります。

例

次の例では、IDの値に1を持つモデルのモデルID番号を戻します。(この例は、「例: 家系の情報」の例1-89の抜粋です。)

SQL> SELECT SEM_APIS.GET_MODEL_NAME(1) AS model_name FROM DUAL;

MODEL_NAME
--------------------------------------------------------------------------------
ARTICLES

11.46 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$ビュー(「モデルのメタデータ」を参照)のMODEL_ID列の値と一致している必要があります。

model_name

セマンティク・テクノロジ・モデルの名前。MDSYS.SEM_MODEL$ビュー(「モデルのメタデータ」を参照)のMODEL_NAME列の値と一致している必要があります。

subject

主語。MDSYS.RDF_VALUE$表(「文」を参照)のVALUE_NAME列の値と一致している必要があります。

property

プロパティ。MDSYS.RDF_VALUE$表(「文」を参照)のVALUE_NAME列の値と一致している必要があります。

object

オブジェクト。MDSYS.RDF_VALUE$表(「文」を参照)のVALUE_NAME列の値と一致している必要があります。

使用上の注意

この関数には、2つの書式があり、モデル番号またはモデル名でセマンティク・テクノロジ・モデルを指定できます。

例

次の例では、トリプルのID番号を戻します。(この例は、 「例: 家系の情報」の例1-89の抜粋です。)

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

11.47 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語句の言語タイプ。

使用上の注意

パフォーマンスを向上させるには、このファンクションでファンクション・ベース索引を作成することを検討します。詳細は、「型付きリテラルを含むFILTER構成要素のファンクション・ベースの索引」を参照してください。

例

次の例では、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$;

11.48 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語句の言語タイプ。

使用上の注意

パフォーマンスを向上させるには、このファンクションでファンクション・ベース索引を作成することを検討します。詳細は、「型付きリテラルを含むFILTER構成要素のファンクション・ベースの索引」を参照してください。

例

次の例では、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$;

11.49 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語句の言語タイプ。

使用上の注意

パフォーマンスを向上させるには、このファンクションでファンクション・ベース索引を作成することを検討します。詳細は、「型付きリテラルを含むFILTER構成要素のファンクション・ベースの索引」を参照してください。

例

次の例では、MDSYS.RDF_VALUE$表のすべての数値リテラルに対して数値を戻します。

SELECT SEM_APIS.GETV$NUMERICVAL(value_type, vname_prefix, vname_suffix,
literal_type, language_type)
FROM MDSYS.RDF_VALUE$;

11.50 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語句の言語タイプ。

使用上の注意

パフォーマンスを向上させるには、このファンクションでファンクション・ベース索引を作成することを検討します。詳細は、「型付きリテラルを含むFILTER構成要素のファンクション・ベースの索引」を参照してください。

例

次の例では、MDSYS.RDF_VALUE$表のすべてのプレーン・リテラルおよびxsd:string型のリテラルに対して字句の値を戻します。

SELECT SEM_APIS.GETV$STRINGVAL(value_type, vname_prefix, vname_suffix,
literal_type, language_type)
FROM MDSYS.RDF_VALUE$;

11.51 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語句の言語タイプ。

使用上の注意

パフォーマンスを向上させるには、このファンクションでファンクション・ベース索引を作成することを検討します。詳細は、「型付きリテラルを含むFILTER構成要素のファンクション・ベースの索引」を参照してください。

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

11.52 SEM_APIS.IMPORT_ENTAILMENT_STATS

書式

SEM_APIS.IMPORT_ENTAILMENT_STATS (
entailment_name  IN VARCHAR2,
stattab          IN VARCHAR2,
statid           IN VARCHAR2 DEFAULT NULL,
cascade          IN BOOLEAN DEFAULT TRUE,
statown          IN VARCHAR2 DEFAULT NULL,
no_invalidate    IN BOOLEAN DEFAULT FALSE,
force            IN BOOLEAN DEFAULT FALSE,
stat_category    IN VARCHAR2 DEFAULT 'OBJECT_STATS');

説明

ユーザー統計表から伴意の統計を取得して、ディクショナリに格納します。

パラメータ

entailment_name

伴意の名前。

(他のパラメータ)

DBMS_STATS.IMPORT_TABLE_STATSプロシージャのパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。なお、ここでのforceは伴意統計に適用されます。

また、cascadeを指定しても、モデルに関連付けられているすべての索引統計をエクスポートします。

使用上の注意

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、表STAT_TABLEから伴意OWLTST_IDXの統計をインポートします。

EXECUTE SEM_APIS.IMPORT_ENTAILMENT_STATS('owltst_idx', 'stat_table');

11.53 SEM_APIS.IMPORT_MODEL_STATS

書式

SEM_APIS.IMPORT_MODEL_STATS (
model_name    IN VARCHAR2,
stattab       IN VARCHAR2,
statid        IN VARCHAR2 DEFAULT NULL,
cascade       IN BOOLEAN DEFAULT TRUE,
statown       IN VARCHAR2 DEFAULT NULL,
no_invalidate IN BOOLEAN DEFAULT FALSE,
force         IN BOOLEAN DEFAULT FALSE,
stat_category IN VARCHAR2 DEFAULT 'OBJECT_STATS);

説明

指定されたモデルの統計をユーザー統計表から取得して、ディクショナリに格納します。

パラメータ

model_name

伴意の名前。

(他のパラメータ)

DBMS_STATS.IMPORT_TABLE_STATSプロシージャのパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

また、cascadeを指定しても、モデルに関連付けられているすべての索引統計をインポートします。

使用上の注意

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、表STAT_TABLEからモデルFAMILYの統計をインポートして、ディクショナリに格納します。

EXECUTE SEM_APIS.IMOPRT_MODEL_STATS('family', 'stat_table');

11.54 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$ビュー(「モデルのメタデータ」を参照)のMODEL_ID列の値と一致している必要があります。

model_name

セマンティク・テクノロジ・モデルの名前。MDSYS.SEM_MODEL$ビュー(「モデルのメタデータ」を参照)のMODEL_NAME列の値と一致している必要があります。

subject

主語。MDSYS.RDF_VALUE$表(「文」を参照)のVALUE_NAME列の値と一致している必要があります。

property

プロパティ。MDSYS.RDF_VALUE$表(「文」を参照)のVALUE_NAME列の値と一致している必要があります。

object

オブジェクト。MDSYS.RDF_VALUE$表(「文」を参照)のVALUE_NAME列の値と一致している必要があります。

使用上の注意

この関数は、文字列値FALSE、TRUEまたはTRUE (EXACT)を戻します。

- FALSE: 文はデータベースの指定したモデルのトリプルではありません。

- TRUE: 文はデータベースの指定したモデルのトリプル値に一致しているか、トリプル値の正規形表現と同じです。

- TRUE (EXACT): 指定したsubject、propertyおよびobjectの値は、データベースの指定したモデルのトリプルと完全に一致しています。

例

次の例では、文がデータベースのトリプルであるかどうかをチェックします。この場合、完全一致するトリプルが存在します。(この例は、「例: 家系の情報」の例1-89の抜粋です。)

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)

11.55 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

(今後使用予定)

使用上の注意

詳細および例は、「外部表を使用してN-Quad形式データをステージング表にロードする方法」を参照してください。

例

次の例では、ステージング表をロードします。(この例は、「外部表を使用してN-Quad形式データをステージング表にロードする方法」の例1-82から抜粋したものです。)

BEGIN
sem_apis.load_into_staging_table(
staging_table => 'STAGE_TABLE'
,source_table  => 'stage_table_source'
,input_format  => 'N-QUAD');
END;

11.56 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つ以上のルールベース名。そのデータ型はSEM_RULEBASESであり、TABLE OF VARCHAR2(25)として定義されます。ルールおよびルールベースの詳細は、「推論: ルールとルールベース」を参照してください。

使用上の注意

ルールベース索引が戻されるには、その索引が指定したすべてのモデルおよびルールベースに基づいている必要があります。

例

次の例では、familyモデルとRDFSおよびfamily_rbルールベースに基づく伴意を検出します。(この例は、「例: 家系の情報」の例1-90からの抜粋です。)

SELECT SEM_APIS.LOOKUP_ENTAILMENT(SEM_MODELS('family'),
SEM_RULEBASES('RDFS','family_rb')) AS lookup_entailment FROM DUAL;

LOOKUP_ENTAILMENT
--------------------------------------------------------------------------------
RDFS_RIX_FAMILY

11.57 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対応またはバージョン対応のセマンティク・モデルでは使用できません。

- このプロシージャは、仮想モデル(「仮想モデル」を参照)ではサポートされません。

- 表の制約は、宛先のアプリケーション表では許容されません。

例

次の例では、モデルM1の内容をM2に挿入します。

EXECUTE SEM_APIS.MERGE_MODELS('M1', 'M2');

次の例では、モデルM1の内容をM2に挿入し、並列度4 (マージ操作の実行では最大4つのパラレル・スレッド)を指定します。

EXECUTE SEM_APIS.MERGE_MODELS('M1', 'M2', null, null, 'DOP=4');

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

11.59 SEM_APIS.PURGE_UNUSED_VALUES

書式

SEM_APIS.PURGE_UNUSED_VALUES(
flags  IN VARCHAR2 DEFAULT NULL);

説明

セマンティク・ネットワークから無効なジオメトリ・リテラル値をパージします。

パラメータ

flags

次のキーワード指定が1つ以上含まれる、引用符で囲んだオプションの文字列。

- MBV_METHOD=SHADOWを指定すると、値の別のロード方法を使用できるため、大量の値をパージする必要がある場合に、処理がより高速になる可能性があります。

- PARALLEL=<integer>を指定すると、この処理のほとんどを、integerで指定した、操作に関連付けられている並列度を使用してパラレルに実行できます。並列度なしでPARALLELのみを指定すると、デフォルトの並列度が使用されます。

- PUV_COMPUTE_VIDS_USEDを指定すると、別の方法を使用できるため、ほとんどの値がパージされると予測される場合に、処理がより高速になる可能性があります。

使用上の注意

このプロシージャをコールする前に、MDSYSに、既存の全RDFモデルのアプリケーション表へのSELECT権限を付与する必要があります。

使用方法と使用例の詳細は、「未使用値のパージ」を参照してください。

例

次の例では、並列度4を使用して、未使用値をパージします。

EXECUTE SEM_APIS.PURGE_UNUSED_VALUES(flags => 'PARALLEL=4');

11.60 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ビュー(「MDSYS.SEM_NETWORK_INDEX_INFOビュー」を参照)の情報を更新します。

例

次の例では、セマンティク・ネットワーク索引に関する情報をリフレッシュします。

EXECUTE sem_apis.refresh_sem_network_index_info;

11.61 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は、索引を再作成しません。

使用上の注意

重複トリプルが削除されると、トリプル列以外の列の情報など、削除された行のすべての情報が失われます。

このプロシージャは、仮想モデル(「仮想モデル」を参照)ではサポートされません。

このプロシージャは、バージョン対応モデル(「RDFデータに対するWorkspace Managerサポート」を参照)ではサポートされません。

モデルが空の場合、または、重複トリプルが存在しないか(threshold値を使用して計算されるような)十分な重複トリプルが存在しない場合、このプロシージャはどのような削除操作も実行しません。

操作を実行するには(threshold値を使用して計算されるような)十分な重複がない場合、情報メッセージが表示されます。

使用不可な索引が含まれる場合、SKIP_UNUSABLE_INDEXESシステム・パラメータがTRUEに設定されているかどうかを確認してください。TRUEはこのパラメータのデフォルト値ですが、いくつかの本番データベースは値FALSEを使用することがあるため、これを変更する必要がある場合は、次を入力します。

SQL> alter session set skip_unusable_indexes=true;

1つ以上のユーザー定義のトリガーを持つアプリケーション表でこのプロシージャを使用するには、DBAユーザーとして接続する必要があり、次のように、ALTER ANY TRIGGER権限をMDSYSユーザーに付与する必要があります。

SQL> grant alter any trigger to MDSYS;

例

次の例では、familyという名前のモデルから重複したトリプルを削除します。デフォルトのしきい値0.3が適用され、重複が削除された後、索引が再構築されます(デフォルトの動作)。

EXECUTE SEM_APIS.REMOVE_DUPLICATES('family');

11.62 SEM_APIS.RENAME_ENTAILMENT

書式

SEM_APIS.RENAME_ENTAILMENT(
old_name  IN VARCHAR2,
new_name  IN VARCHAR2);

説明

伴意(ルール索引)の名前を変更します。

パラメータ

old_name

名前を変更する既存の伴意の名前。

new_name

伴意の新規の名前。

使用上の注意

「RDFデータに対してWorkspace Managerサポートを使用する場合の特別な考慮事項」の説明にあるとおり、このプロシージャはバージョン対応RDFモデルではサポートされません。

例

次の例では、伴意OWLTST_IDXの名前をMY_OWLTST_IDXに変更します。

EXECUTE sem_apis.rename_entailment('owltst_idx', 'my_owltst_idx');

11.63 SEM_APIS.RENAME_MODEL

書式

SEM_APIS.RENAME_MODEL(
old_name  IN VARCHAR2,
new_name  IN VARCHAR2);

説明

モデルの名前を変更します。

パラメータ

old_name

名前を変更する既存のモデルの名前。

new_name

モデルの新規の名前。

使用上の注意

このプロシージャを使用する場合、次の考慮事項が適用されます。

- 既存のモデルの所有者である必要があります。

- このプロシージャは、VPD対応またはバージョン対応のセマンティク・モデルでは使用できません。

- このプロシージャは、仮想モデル(「仮想モデル」を参照)ではサポートされません。

このプロシージャは、2つの既存のモデルの名前を交換するSEM_APIS.SWAP_NAMESとは対照的です。

例

次の例では、モデルMODEL1の名前をMODEL2に変更します。

EXECUTE sem_apis.rename_model('model1', 'model2');

11.64 SEM_APIS.SET_ENTAILMENT_STATS

書式

SEM_APIS.SET_ENTAILMENT_STATS (
entailment_name IN VARCHAR2,
numrows         IN NUMBER DEFAULT NULL,
numblks         IN NUMBER DEFAULT NULL,
avgrlen         IN NUMBER DEFAULT NULL,
flags           IN NUMBER DEFAULT NULL,
no_invalidate   IN BOOLEAN DEFAULT DBMS_STATS.AUTO_INVALIDATE,
cachedblk       IN NUMBER DEFAULT NULL,
cachehit        IN NUMBER DEFAULT NULL,
force           IN BOOLEAN DEFAULT FALSE);

説明

指定された伴意の統計を設定します。

パラメータ

entailment_name

伴意の名前。

(他のパラメータ)

DBMS_STATS.SET_TABLE_STATSプロシージャのパラメータに関する詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。なお、ここでのforceは伴意統計に適用されます。

使用上の注意

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、伴意OWLTST_IDXの統計を設定します。

EXECUTE SEM_APIS.SET_ENTAILMENT_STATS('owltst_idx', numrows => 100);

11.65 SEM_APIS.SET_MODEL_STATS

書式

SEM_APIS.SET_MODEL_STATS (
model_name  IN VARCHAR2,
numrows       IN NUMBER DEFAULT NULL,
numblks       IN NUMBER DEFAULT NULL,
avgrlen       IN NUMBER DEFAULT NULL,
flags         IN NUMBER DEFAULT NULL,
no_invalidate IN BOOLEAN DEFAULT DBMS_STATS.AUTO_INVALIDATE,
cachedblk     IN NUMBER DEFAULT NULL,
cachehit      IN NUMBER DEFAULT NULL,
force         IN BOOLEAN DEFAULT FALSE);

説明

指定されたモデルの統計を設定します。

パラメータ

model_name

モデルの名前。

(他のパラメータ)

DBMS_STATS.DELETE_TABLE_STATSプロシージャのパラメータに関する詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。なお、ここでのforceは伴意統計に適用されます。

使用上の注意

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、モデルFAMILYの統計を設定します。

EXECUTE SEM_APIS.SET_MODEL_STATS('family', numrows => 100);

11.66 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を指定できますが、結果は同じになります。

「RDFデータに対してWorkspace Managerサポートを使用する場合の特別な考慮事項」の説明にあるとおり、このプロシージャはバージョン対応RDFモデルではサポートされません。

このプロシージャは、既存のモデルの名前を変更するSEM_APIS.RENAME_MODELとは対照的です。

例

次の例では、(古い)TESTモデルの名前をPRODUCTIONに、(古い)PRODUCTIONモデルの名前をTESTに変更します。

EXECUTE sem_apis.swap_names('test', 'production');

11.67 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キーワードを使用する際の詳細は、「セマンティク・データに対する問合せでのSEM_MATCH表関数の使用」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力RDF語句をアンエスケープします。

SEM_APIS.UNESCAPE_CLOB_TERM('"abc\tdef\nhij"^^<http://www.w3.org/2001/XMLSchema#string>')
FROM DUAL;

11.68 SEM_APIS.UNESCAPE_CLOB_VALUE

書式

SEM_APIS.UNESCAPE_CLOB_VALUE(
val           IN  CLOB 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キーワードを使用する際の詳細は、「セマンティク・データに対する問合せでのSEM_MATCH表関数の使用」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力文字列をアンエスケープします。

SELECT SEM_APIS.UNESCAPE_CLOB_VALUE('abc\tdef\nhij')
FROM DUAL;

11.69 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キーワードを使用する際の詳細は、「セマンティク・データに対する問合せでのSEM_MATCH表関数の使用」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力RDF語句をアンエスケープします。

SELECT SEM_APIS.UNESCAPE_RDF_TERM('"abc\tdef\nhij"^^<http://www.w3.org/2001/XMLSchema#string>')
FROM DUAL;

11.70 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)で指定された入力CLOB値を、特殊文字および非ASCII文字をアンエスケープして返します。

パラメータ

val

アンエスケープするテキスト。

utf_encode

chr(8)、chr(9)、chr(10)、chr(12)、chr(13)以外の非ASCII文字および出力不可能なASCII文字をエスケープする必要がある場合は、1 (デフォルト)に設定します。それ以外の場合、これらの文字はエスケープされません。

使用上の注意

SEM_MATCH表関数のoptionsパラメータで、DO_UNESCAPEキーワードを使用する際の詳細は、「セマンティク・データに対する問合せでのSEM_MATCH表関数の使用」を参照してください。

例

次の例では、タブ文字と改行文字を含む入力文字列をアンエスケープします。

SELECT SEM_APIS.UNESCAPE_RDF_VALUE('abc\tdef\nhij')
FROM DUAL;

11.71 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です。ルールおよびルールベースの詳細は、「推論: ルールとルールベース」を参照してください。

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で使用するために予約済。)

使用上の注意

このプロシージャは、元の伴意の非一貫性を検出するために使用できます。詳細は、「OWLモデルおよび伴意の検証」を参照してください。

このプロシージャは、エラーが検出されなかった場合はNULL値を戻し、エラーが検出された場合はVARRAY(32767) OF VARCHAR2(4000)という定義を持つRDF_LONGVARCHARARRAY型のオブジェクトを戻します。

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

例

このプロシージャの例は、「OWLモデルおよび伴意の検証」の例2-5を参照してください。

11.72 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で使用するために予約済。)

使用上の注意

このプロシージャは、元のデータ・モデルの非一貫性を検出するために使用できます。詳細は、「OWLモデルおよび伴意の検証」を参照してください。

このプロシージャは、エラーが検出されなかった場合はNULL値を戻し、エラーが検出された場合はVARRAY(32767) OF VARCHAR2(4000)という定義を持つRDF_LONGVARCHARARRAY型のオブジェクトを戻します。

例

次の例では、モデルfamilyを検証します。

SELECT SEM_APIS.VALIDATE_MODEL(SEM_MODELS('family')) FROM DUAL;

11.73 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$表(「文」を参照)にあるVALUE_NAME列の値と一致している必要があります。

value_type

値のタイプ。MDSYS.RDF_VALUE$表(「文」を参照)にある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.

11.74 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$表(「文」を参照)にあるVALUE_NAME列の値と一致している必要があります。

value_type

値のタイプ。MDSYS.RDF_VALUE$表(「文」を参照)にある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

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

SEM_OLSパッケージには、Oracle Label Security (OLS)を使用した、RDFデータに対するトリプルレベル・セキュリティに関連するサブプログラム(ファンクションとプロシージャ)が含まれます。この章のサブプログラムを使用するには、「RDFセマンティク・グラフの概要」と「RDFデータのファイングレイン・アクセス制御」に記載されている概念および使用情報について理解しておく必要があります。

この章では、サブプログラムに関するリファレンス情報を示します(サブプログラムのリストはアルファベット順です)。

12.1 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のサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、MY_SCHEMA.MY_APP_TABLEアプリケーション表にOLSポリシーdefenseを適用します。

begin
sem_ols.apply_policy_to_app_table(
policy_name => 'defense',
schema_name => 'my_schema',
table_name  => 'my_app_table');
end;
/

12.2 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のサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、MY_SCHEMA.MY_APP_TABLEアプリケーション表からOLSポリシーdefenseを削除します。

begin
sem_ols.remove_policy_from_app_table(
policy_name => 'defense',
schema_name => 'my_schema',
table_name  => 'my_app_table');
end;
/

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

SEM_PERFパッケージには、Oracle DatabaseのResource Description Framework (RDF)およびWeb Ontology Language (OWL)サポートのパフォーマンスを調査および拡張できるサブプログラムが含まれます。この章のサブプログラムを使用するには、「RDFセマンティク・グラフの概要」と「OWLの概要」に記載されている概念および使用情報について理解しておく必要があります。

この章では、サブプログラムに関するリファレンス情報を示します(サブプログラムのリストはアルファベット順です)。

13.1 SEM_PERF.DELETE_NETWORK_STATS

書式

SEM_PERF.DELETE_NETWORK_STATS (
cascade_parts    IN BOOLEAN DEFAULT TRUE,
cascade_columns  IN BOOLEAN DEFAULT TRUE,
cascade_indexes  IN BOOLEAN DEFAULT TRUE,
no_invalidate    IN BOOLEAN DEFAULT DBMS_STATS.AUTO_INVALIDATE,
force            IN BOOLEAN DEFAULT FALSE,
options          IN VARCHAR2 DEFAULT NULL);

説明

セマンティク・ネットワークの統計を削除します。

パラメータ

options

次のように操作の範囲を制御します。

- MDSYS.SDO_RDF.VALUE_TABLE_ONLYの場合、操作はMDSYS.RDF_VALUE$表にのみ適用されます。

- MDSYS.SDO_RDF.LINK_TABLE_ONLYの場合、操作はMDSYS.RDF_LINK$表にのみ適用されます。

- NULLである場合(デフォルト)、操作はMDSYS.RDF_VALUE$およびMDSYS.RDF_LINK$表の両方に適用されます。

(他のパラメータ)

DBMS_STATS.DELETE_TABLE_STATSプロシージャのパラメータに関する詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。なお、ここでのforceはネットワーク統計に適用されます。

使用上の注意

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、セマンティク・ネットワークの統計を削除します。

EXECUTE SEM_APIS.DELETE_NETWORK_STATS;

13.2 SEM_PERF.EXPORT_NETWORK_STATS

書式

SEM_PERF.EXPORT_NETWORK_STATS (
stattab        IN VARCHAR2,
statid         IN VARCHAR2 DEFAULT NULL,
cascade        IN BOOLEAN DEFAULT TRUE,
statown        IN VARCHAR2 DEFAULT NULL,
stat_category  IN VARCHAR2 DEFAULT 'OBJECT_STATS',
options        IN VARCHAR2 DEFAULT NULL);

説明

セマンティク・ネットワークの統計をエクスポートして、ユーザー統計表に格納します。

パラメータ

options

次のように操作の範囲を制御します。

- MDSYS.SDO_RDF.VALUE_TABLE_ONLYの場合、操作はMDSYS.RDF_VALUE$表にのみ適用されます。

- MDSYS.SDO_RDF.LINK_TABLE_ONLYの場合、操作はMDSYS.RDF_LINK$表にのみ適用されます。

- NULLである場合(デフォルト)、操作はMDSYS.RDF_VALUE$およびMDSYS.RDF_LINK$表の両方に適用されます。

(他のパラメータ)

DBMS_STATS.EXPORT_TABLE_STATSプロシージャのパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

使用上の注意

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、セマンティク・ネットワークの統計をエクスポートして、表STAT_TABLEに格納します。

EXECUTE SEM_APIS.EXPORT_NETWORK_STATS('stat_table');

13.3 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 and GraphがOracle Databaseの一部としてインストールされている場合、このプロシージャを実行できるのはMDSYSユーザーのみです。ただし、このプロシージャの実行権限は、必要に応じて各ユーザーに付与できます。

このプロシージャは、推論パフォーマンスの向上に有効な統計情報を収集します(「推論パフォーマンスの向上」を参照)。このプロシージャは、内部的にDBMS_STATS.GATHER_TABLE_STATSプロシージャをコールしてRDFおよびOWL関連の表とその索引に関する統計を収集し、その統計をOracle Databaseのデータ・ディクショナリに格納します。DBMS_STATSパッケージの使用方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

統計の収集ではシステム・リソースが大量に使用されるため、このプロシージャは重要なアプリケーションおよび操作が悪影響を受ける可能性のない時期に実行してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、RDFおよびOWL関連の表とその索引に関する統計を収集します。

EXECUTE SEM_PERF.GATHER_STATS;

13.4 SEM_PERF.IMPORT_NETWORK_STATS

書式

SEM_PERF.IMPORT_NETWORK_STATS (
stattab       IN VARCHAR2,
statid        IN VARCHAR2 DEFAULT NULL,
cascade       IN BOOLEAN DEFAULT TRUE,
statown       IN VARCHAR2 DEFAULT NULL,
no_invalidate IN BOOLEAN DEFAULT FALSE,
force         IN BOOLEAN DEFAULT FALSE,
stat_category IN VARCHAR2 DEFAULT 'OBJECT_STATS',
options       IN VARCHAR2 DEFAULT NULL);

説明

ユーザー統計表からセマンティク・ネットワークの統計を取得して、ディクショナリに格納します。

パラメータ

options

次のように操作の範囲を制御します。

- MDSYS.SDO_RDF.VALUE_TABLE_ONLYの場合、操作はMDSYS.RDF_VALUE$表にのみ適用されます。

- MDSYS.SDO_RDF.LINK_TABLE_ONLYの場合、操作はMDSYS.RDF_LINK$表にのみ適用されます。

- NULLである場合(デフォルト)、操作はMDSYS.RDF_VALUE$およびMDSYS.RDF_LINK$表の両方に適用されます。

(他のパラメータ)

DBMS_STATS.IMPORT_TABLE_STATSプロシージャのパラメータに関する詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。なお、ここでのforceはネットワーク統計に適用されます。

使用上の注意

DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

「セマンティク・モデルおよびセマンティク・ネットワークの統計の管理」を参照してください。

例

次の例では、表STAT_TABLEのセマンティク・ネットワークの統計をインポートして、ディクショナリに格納します。

EXECUTE SEM_APIS.IMPORT_NETWORK_STATS('stat_table');

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

SEM_RDFCTXパッケージには、ドキュメントに作成されるエクストラクタ・ポリシーおよびセマンティク索引を管理するサブプログラム(ファンクションとプロシージャ)が含まれます。この章のサブプログラムを使用するには、「ドキュメントのセマンティク索引付け」に記載されている概念および使用情報について理解しておく必要があります。

この章では、サブプログラムに関するリファレンス情報を示します(サブプログラムのリストはアルファベット順です)。

14.1 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;
/

14.2 SEM_RDFCTX.CREATE_POLICY

書式

SEM_RDFCTX.CREATE_POLICY(
policy_name  IN VARCHAR2,
extractor    IN mdsys.rdfctx_extractor,
preferences  IN 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パラメータに含める必要があります。

エクストラクタ・ポリシーに対して指定されるプリファレンスは、索引付けされるドキュメントおよびその他の関連情報に使用されているリポジトリのタイプを決定します。詳細は、「外部ドキュメントの索引付け」を参照してください。

例

次の例では、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;
/

14.3 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;
/

14.4 SEM_RDFCTX.MAINTAIN_TRIPLES

書式

SEM_RDFCTX.MAINTAIN_TRIPLES(
index_name     IN VARCHAR2,
where_clause   IN VARCHAR2,
rdfxml_content IN 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;
/

14.5 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句の名前のスペース区切りリストとして指定できます。「ドキュメントのセマンティク索引付け」の説明にあるとおり、エクストラクタ・ポリシーを名前で識別しないすべてのSEM_CONTAINS問合せのデフォルトのエクストラクタ・ポリシーとして、このリストの最初のポリシーが使用されます。SEM_RDFCTX.SET_DEFAULT_POLICYプロシージャを使用すると、索引に異なるデフォルトのポリシーを設定できます。

例

次の例では、ArticleIndex索引のデフォルトのエクストラクタ・ポリシーとして、CITY_EXTRを設定します。

begin
sem_rdfctx.set_default_policy (index_name => 'ArticleIndex',
policy_name => 'CITY_EXTR');
end;
/

14.6 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エクストラクタ・タイプ(「Calaisエクストラクタ・タイプの構成」を参照)を使用するには、次のパラメータの値を指定する必要があります。

- CALAIS_WS_ENDPOINT: CalaisのWebサービスのエンド・ポイント。

- CALAIS_KEY: Calaisのライセンス・キー。

- CALAIS_WS_SOAPACTION: Calais WebサービスのSOAPアクション。

General Architecture for Text Engineering (GATE)エクストラクタ・タイプ(「General Architecture for Text Engineering (GATE)の使用」を参照)を使用するには、次のパラメータの値を指定する必要があります。

- GATE_NLP_HOST: GATE NLPリスナーのホスト。

- GATE_NLP_PORT: GATE NLPリスナーのポート。

これらのパラメータの他に、情報エクストラクタを使用したりファイアウォールの外側にあるドキュメントを索引付けしたりするには、HTTP_PROXYパラメータの値を指定する必要がある場合があります。

データベース・インスタンスには、これらのパラメータ用に1セットの値のみがあり、対応する情報エクストラクタを使用してセマンティク索引のすべてのインスタンスに使用されます。パラメータのいずれかの既存値を変更する必要がある場合、このプロシージャを使用できます。

例

例は、次の項を参照してください。

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

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

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

SEM_RDFSAパッケージには、仮想プライベート・データベース(VPD)またはOracle Label Security (OLS)を使用してRDFデータにファイングレイン・アクセス制御を提供するサブプログラム(ファンクションとプロシージャ)が含まれます。この章のサブプログラムを使用するには、「RDFセマンティク・グラフの概要」と「RDFデータのファイングレイン・アクセス制御」に記載されている概念および使用情報について理解しておく必要があります。

この章では、サブプログラムに関するリファレンス情報を示します(サブプログラムのリストはアルファベット順です)。

15.1 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モデルで問合せのために実施されます。

制約グループが、アプリケーション・コンテキスト(「RDFデータのVPDポリシー」を参照)に基づいて実行時に選択的にアクティブ化または非アクティブ化できるように、ポリシーごとに指定される場合があります。制約グループのない制約は、常にアクティブです。このプロシージャに渡される一致および適用パターンの詳細は、「データ・アクセス制約」を参照してください。

MDSYS.RDFVPD_POLICY_CONSTRAINTSビュー(「RDFVPD_POLICY_CONSTRAINTSビュー」で説明)も参照してください。

VPDのサポートに関する説明は、「RDFセマンティク・グラフでの仮想プライベート・データベースのサポート」を参照してください。

例

次の例では、RDFクラスContractsへのデータ・アクセス制約を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;
/

15.2 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パラメータを使用して「使用方法」の表15-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パラメータの場合、パッケージ定数を必要なオプションに対して指定できます。表15-1に、これらの定数および説明を示します。

表15-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のサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、セキュアな主語およびセキュアな述語オプションを使用して、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;
/

15.3 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ビュー(「RDFVPD_POLICIESビュー」)も参照してください。

VPDのサポートに関する説明は、「RDFセマンティク・グラフでの仮想プライベート・データベースのサポート」を参照してください。

例

次の例では、RDFモデルにVPDポリシーを適用します。

begin
sem_rdfsa.apply_vpd_policy(
policy_name => 'contracts_policy',
model_name  => 'contracts');
end;
/

15.4 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値の名前と照合されます。(詳細は「RDFデータのVPDポリシー」を参照してください)。

MDSYS.RDFVPD_POLICIESビュー(「RDFVPD_POLICIESビュー」)も参照してください。

VPDのサポートに関する説明は、「RDFセマンティク・グラフでの仮想プライベート・データベースのサポート」を参照してください。

例

次の例では、名前空間マップで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;
/

15.5 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ビュー(「RDFVPD_POLICY_CONSTRAINTSビュー」で説明)も参照してください。

VPDのサポートに関する説明は、「RDFセマンティク・グラフでの仮想プライベート・データベースのサポート」を参照してください。

例

次の例では、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;
/

15.6 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のサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、セマンティク・データ・ストアのOLSポリシーを無効にします。

begin
sem_rdfsa.disable_ols_policy;
end;
/

15.7 SEM_RDFSA.DROP_VPD_POLICY

書式

SEM_RDFSA.DROP_VPD_POLICY(
policy_name   IN VARCHAR2);

説明

使用していないVPDポリシーを削除します。

パラメータ

policy_name

既存のVPDポリシーの名前。

使用上の注意

このプロシージャは、使用していないVPDポリシーを、そのメタデータおよび制約とともに永続的に削除します。VPDポリシーの所有者またはこの操作を実行するDBAロールを持つユーザーである必要があります。

VPDのサポートに関する説明は、「RDFセマンティク・グラフでの仮想プライベート・データベースのサポート」を参照してください。

例

次の例では、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;
/

15.8 SEM_RDFSA.ENABLE_OLS_POLICY

書式

SEM_RDFSA.ENABLE_OLS_POLICY;

説明

すでに無効にされているOLSポリシーを有効にします。

パラメータ

(なし)

使用上の注意

このプロシージャを使用すると、セマンティク・データ・ストアに対して無効にされているOLSポリシーを有効にできます。ポリシーを有効にするユーザーは、OLSポリシーを管理するために必要な権限を持つ必要があり、また、RDFデータに適用されるOLSポリシーにアクセスする必要もあります。

OLSポリシーを無効にするには、SEM_RDFSA.DISABLE_OLS_POLICYプロシージャを使用します。

OLSのサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、セマンティク・データ・ストアのOLSポリシーを有効にします。

begin
sem_rdfsa.enable_ols_policy;
end;
/

15.9 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ビューについては、それぞれ「RDFVPD_PREDICATE_MDATAビュー」と「RDFVPD_RESOURCE_RELビュー」を参照してください。

VPDのサポートに関する説明は、「RDFセマンティク・グラフでの仮想プライベート・データベースのサポート」を参照してください。

例

次の例では、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;

15.10 SEM_RDFSA.REMOVE_OLS_POLICY

書式

SEM_RDFSA.REMOVE_OLS_POLICY;

説明

セマンティク・データ・ストアからOLSポリシーを永続的に削除または分離します。

パラメータ

(なし)

使用上の注意

OLSポリシーを管理するために必要な権限を持つ必要があり、また、RDFデータに適用されるOLSポリシーにアクセスする必要もあります。OLSポリシーがセマンティク・データ・ストアから分離されると、すでにトリプルおよびリソースに割り当てられているすべての機密性ラベルが失われます。

この操作は、特にRDFセキュリティ・ポリシーを保持するために作成されるオブジェクトを削除します。

OLSポリシーを適用するには、SEM_RDFSA.APPLY_OLS_POLICYプロシージャを使用します。

OLSのサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、すでにセマンティク・データ・ストアに適用されているOLSポリシーを削除します。

begin
sem_rdfsa.remove_ols_policy;
end;
/

15.11 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のサポートに関する説明は、「RDFセマンティク・グラフでの仮想プライベート・データベースのサポート」を参照してください。

例

次の例では、RDFモデルからVPDポリシーを削除します。

begin
sem_rdfsa.remove_vpd_policy(
policy_name => 'contracts_policy',
model_name  => 'contracts');
end;
/

15.12 SEM_RDFSA.RESET_MODEL_LABELS

書式

SEM_RDFSA.RESET_MODEL_LABELS(
model_name  IN VARCHAR2);

説明

モデルまたはグローバル・リソースに関連付けられているラベルをリセットします(関連付けられている1つ以上のモデルは空である必要があります)。

パラメータ

model_name

ラベルをリセットする必要があるモデルの名前、またはすべてのグローバル・リソースに関連付けられているラベルをリセットするための文字列RDF$GLOBAL。

使用上の注意

モデル名を指定する場合、モデルは空である必要があります。RDF$GLOBALを指定する場合、すべてのモデルは空である必要があります(つまり、RDFリポジトリにトリプルは存在しません)。

セマンティク・データ・ストアに適用されるOLSポリシーに関して完全なアクセス権限を持っている必要があります。

OLSのサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、Contractsモデルに関連付けられているすべてのリソースおよびそのラベルを削除します。

begin
sem_rdfsa.reset_model_labels(model_name => 'Contracts');
end;
/

15.13 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のサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、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;
/

15.14 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のサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、すべてのRDFスキーマ要素に、一意のコンパートメントを持つラベルを設定します。新しいRDFクラスおよびプロパティを定義できるユーザーは、コンパートメントへの独占的なメンバーシップを持つことが求められます。

begin
sem_rdfsa.set_rdfs_label(
label_string  => 'SE:RDFS:',
inf_override  => 'SE:US_SPCL:US');
end;
/

15.15 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のサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、複数のリソースにその位置に基づいて機密性ラベルを設定します。

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

15.16 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のサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。

例

次の例では、RDFSルールに機密性ラベルを割り当てます。

begin
sem_rdfsa.set_rule_label (rule_base    => 'RDFS',
rule_name    => 'RDF-AXIOMS',
label_string => 'SE:US_SPCL:');
end;
/

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

この付録では、現在のOracle DatabaseリリースでRDFセマンティク・グラフ・サポートに関連する任意の型、シノニムまたはPL/SQLパッケージを使用するために実行する必要がある手順について説明します。1つ以上のスクリプトを実行し、Spatial and Graphがインストールされており、Partitioningオプションが使用可能であることを確認する必要があります。これらの要求事項については、「RDFセマンティック・グラフ・サポートを有効にする」を参照してください。

この付録では、RDFセマンティク・グラフ・サポートを有効にした後、次のいずれかを実行する必要がある場合、その手順についても説明します。

- 「以前のリリースへのRDFセマンティク・グラフ・サポートのダウングレード」の説明にあるとおり、以前のOracle Databaseリリースに付属のRDFセマンティク・グラフ・サポートをダウングレードします。

- 「RDFセマンティク・グラフ・サポートの削除」の説明にあるとおり、データベースからRDFセマンティク・グラフのすべてのサポートを削除します。

A.1 RDFセマンティク・グラフ・サポートの有効化

現在のOracle DatabaseリリースでRDFセマンティク・グラフ・サポートに関する任意の型、シノニムまたはPL/SQLパッケージを使用するには、次の項でご使用の状況に該当する手順に従って、この機能を新しいOracle Databaseインストールにインストールするか、またはこの機能を以前のリリースからアップグレードする必要があります。

- 新規データベース・インストールでのRDFセマンティク・グラフ・サポートの有効化

- リリース11.1または11.2からのRDFセマンティク・グラフ・サポートのアップグレード

また、「SpatialおよびPartitioningの要件」の説明にあるとおり、Spatial and Graphがインストール済みで、Partitioningオプションが有効化されていることを確認する必要があります。

A.1.1 新規データベース・インストールでのRDFセマンティク・グラフ・サポートの有効化

Oracle Databaseリリース11.2以上の新規インストールでRDFセマンティック・グラフ・サポートを有効化するには、次の手順を実行します。

1. SYSDBA権限を持つSYSユーザーとしてデータベースに接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

2. リリース12.1.0.2に限り(リリース12.1.0.1以前と12.1.0.2より後のリリースは含みません)、Oracle SpatialおよびGraph GeoRaster機能を有効にしていない場合は次のように入力してください。

EXECUTE mdsys.enableGeoRaster;

Oracle Spatial and Graph GeoRaster機能が有効化されていないと、リリース12.1.0.2.0ではOracle Spatial and Graph RDF Semantic Graphが正しく構成されない場合があります。セマンティク・モデルに関連付けられたアプリケーション表に対するDDL操作のためのシステム・トリガーが存在しないためです。このシステム・トリガーはGeoRasterが有効化されると作成されます。つまり、ユーザーがGeoRasterを有効化しないとこのトリガーは存在しません。

データ破損のチェックおよびデータ破損が発生した場合の対応を含むその他の詳細は、後述するリリース12.1.0.2専用の資料を参照してください。

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

- Linuxの場合: @$ORACLE_HOME/md/admin/catsem.sql

- Windowsの場合: @%ORACLE_HOME%\md\admin\catsem.sql

セマンティク・ネットワークがすでに存在する場合、または、RDFセマンティク・グラフの型、表またはPL/SQLパッケージがすでに存在する場合、catsem.sqlスクリプトはエラーで終了します。

スクリプトが正常に実行された場合、次の列値を持つ行がMDSYS.RDF_PARAMETER表に挿入されます。

- NAMESPACE: MDSYS

- 属性: SEM_VERSION

- VALUE: (12.1で始まる文字列)

- 説明: VALID

「RDFデータに対するWorkspace Managerサポートの有効化」の説明にあるとおり、Workspace ManagerでRDFデータを使用する場合、catsem.sqlを実行した後に適切なスクリプトを実行する必要もあります。

リリース12.1.0.2に限り、Oracle Spatial and Graph GeoRaster機能が有効化されていないと、Oracle Spatial and Graph RDF Semantic Graphが正しく構成されない場合があります。これは、セマンティク・モデルに関連付けられたアプリケーション表に対するDDL操作用のシステム・トリガーが存在しないためです。このトリガーを作成するには、SYSとしてmdsys.enableGeoRasterを実行する必要があります。

この問題は、Oracle Databaseバージョン12.1.0.2.0新規インストールと、バージョン12.1.0.2.0にアップグレードされたデータベースの両方に影響します。

このDDLトリガーが存在しない場合、アプリケーション表に対するTRUNCATE操作によって、アプリケーション表のすべての行が削除されますが、MDSYS.RDF_LINK$に格納されている関連するトリプルは削除されません。この場合、アプリケーション表と関連するセマンティク・モデルに不一致が生じるため、この不一致を修正する必要があります。

次のようなSQL問合せを使用して、データの不一致をチェックします(たとえば、ATABという名前のアプリケーション表がMというセマンティク・モデルに関連付けられているとします)。

SELECT COUNT(*) FROM ATAB;
SELECT SUM(COST) FROM MDSYS.RDFM_M;

2つの問合せが同一の結果を返す場合、データの不一致はありません。mdsys.enableGeoRasterを実行する以外の処置は必要ありません。

ただし、2つの問合せから返される結果が異なる場合は、mdsys.enableGeoRasterを実行する他に、破損したそれぞれのモデルをさらに処理する必要があります。モデルのセキュリティがOLSポリシーに対応している場合はOracleサポートに問い合せます。その他のモデルの場合は、次のいずれかのアクションを実行する必要があります。

- 次の手順に従って、モデルを再作成します。

1. アプリケーション表の内容からステージング表を構築します。たとえば、SDO_RDF_TRIPLE_S列TRIを含むアプリケーション表ATABの内容からステージング表STABを構築します。

create table stab as
select
a.tri.get_subject() rdf$stc_sub,
a.tri.get_property() rdf$stc_pred,
a.tri.get_object() rdf$stc_obj,
(case when(instr(a.tri.get_model(),':') > 0) then
substr(a.tri.get_model(),instr(a.tri.get_model(),':')+1)
else null
end) rdf$stc_graph
from atab a;

または、非常に大きなモデルの場合、次のような問合せを使用して2つのステージング表(VARCHAR目的語とCLOB目的語に対して1つずつ)にデータを挿入できます。次の例ではCREATE TABLE文で並列度4 (/*+ parallel(4) */)が使用されることに注意してください。並列度は特定のハードウェア設定に合せてカスタマイズする必要があります。

-- for varchar literals
create /*+ parallel(4) */ table stab_vc as
select /*+ parallel */
(case when vs.value_type = 'UR' then '<' || vs.value_name || '>'
else vs.value_name
end) rdf$stc_sub,
('<' || vp.value_name || '>') rdf$stc_pred,
(case when vo.value_type = 'UR' then '<' || vo.value_name || '>'
when vo.value_type = 'BN' then vo.value_name
else '"' || vo.value_name || '"' ||
nvl2(vo.language_type,'@' || vo.language_type,'') ||
nvl2(vo.literal_type,'^^<' || vo.literal_type || '>', '')
end) rdf$stc_obj,
(nvl2(vg.value_name,('<' || vg.value_name || '>'),'')) rdf$stc_graph
from atab a, mdsys.rdf_value$ vs, mdsys.rdf_value$ vp, mdsys.rdf_value$ vo, mdsys.rdf_value$ vg
where
(a.tri.rdf_s_id = vs.value_id) and
(a.tri.rdf_p_id = vp.value_id) and
(a.tri.rdf_c_id = vo.value_id) and
((bitand(a.tri.rdf_m_id, 79228162514264337593543950335-4294967295)/4294967296) = vg.value_id(+)) and
(vo.long_value is null);

-- for clob literals
create /*+ parallel(4) */ table stab_clob as
select /*+ parallel */
(case when vs.value_type = 'UR' then '<' || vs.value_name || '>'
else vs.value_name
end) rdf$stc_sub,
('<' || vp.value_name || '>') rdf$stc_pred,
(sem_apis.compose_rdf_term(vo.value_name, vo.value_type, vo.literal_type, vo.language_type, vo.long_value)) as rdf$stc_obj,
(nvl2(vg.value_name,('<' || vg.value_name || '>'),'')) rdf$stc_graph
from atab a, mdsys.rdf_value$ vs, mdsys.rdf_value$ vp, mdsys.rdf_value$ vo, mdsys.rdf_value$ vg
where
(a.tri.rdf_s_id = vs.value_id) and
(a.tri.rdf_p_id = vp.value_id) and
(a.tri.rdf_c_id = vo.value_id) and
((bitand(a.tri.rdf_m_id, 79228162514264337593543950335-4294967295)/4294967296) = vg.value_id(+)) and
(vo.long_value is not null);

2. モデルを削除します。たとえば、次のようにモデルMを削除します。

exec sem_apis.drop_sem_model('m');

3. アプリケーション表の切捨てを行います。たとえば、次のようにATABを切り捨てます。

truncate table atab;

4. アプリケーション表を使用してモデルを作成します。たとえば、次のようにアプリケーション表ATABからモデルMを作成します。

exec sem_apis.create_sem_model('m','atab','tri');

5. ステージング表のトリプルまたはクワッドをモデルにロードします。たとえば、次のようにSTABのトリプルまたはクワッドをモデルMにロードします。(大きなモデルの場合は、かわりにSEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャを使用できます。)

insert into atab(tri)
select sdo_rdf_triple_s('m1' || nvl2(s.rdf$stc_graph,':'||s.rdf$stc_graph,''), s.rdf$stc_sub, s.rdf$stc_pred, s.rdf$stc_obj)
from stab s;

または、非常に大きなモデルに対して2つのステージング表を使用する手順1の代替例を参考に、SEM_APIS.BULK_LOAD_FROM_STAGING_TABLEプロシージャを使用してVARCHAR表(stab_vc)のデータをロードし、INSERT AS SELECTを使用してCLOB表(stab_clob)のデータをロードします。

- または、Oracleサポートに連絡します。

A.1.2 リリース11.1または11.2からのRDFセマンティク・グラフ・サポートのアップグレード

セマンティク・テクノロジ・サポートが含まれるOracle Databaseリリース11.1または11.2からのアップグレードでは、データベースがアップグレードされると、セマンティク・テクノロジ・サポートがリリース12.1以上に自動的にアップグレードされます。

ただし、既存のリリース11.1または11.2の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リテラルがある場合は、「空の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データを移行する(「空のRDFリテラルの処理」を参照)には、次の文を入力します。

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

注意:

リリース12.1以上にアップグレードした後に、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 SpatialおよびPartitioningの要件

Oracle Spatial and Graphは、RDFおよびOWLの機能を使用する前にインストールする必要があります。Oracle Locatorだけでは十分でありません。Spatial and GraphとLocatorの詳細は、『Oracle Spatial and Graph開発者ガイド』を参照してください。

Partitioningオプションは、RDFおよびOWLの機能を使用する前に有効にする必要があります。Partitioningオプションに関するライセンス情報は、『Oracle Databaseライセンス情報』を参照してください。パーティショニングの使用に関する情報は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

A.2 以前のリリースへのRDFセマンティク・グラフ・サポートのダウングレード

この項では、RDFセマンティク・グラフ・サポートをダウングレードする方法について、Oracle Databaseのリリース11.2へのダウングレードとあわせて説明します。

まれに必要になる場合を除き、ダウングレードはしないことをお薦めします。以前のリリースにダウングレードすると、その間のリリースで行われたバグ・フィックスや機能拡張のメリットが得られないことになります。

RDFデータのWorkspace Managerサポートを有効にした場合、そのサポートは、「RDFデータに対するWorkspace Managerサポートの削除」の説明にあるとおり、データベースのRDFセマンティク・グラフ・サポートをダウングレードする前に、削除する必要があります。

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

Oracle Databaseリリース11.2にダウングレードする必要がある場合、データベースをダウングレードすると、セマンティク・テクノロジ・コンポーネントは自動的にダウングレードされます。ただし、リリース12に固有のRDFデータまたはOWLデータ(以前のバージョンでサポートされない、リリース12以上のRDF/OWL永続的な構造)は、リリース11.2との互換性のために、ダウングレードを実行する前に削除する必要があります。

リリース12.1以上のRDFデータにリリース11.2との非互換性があるかどうかを確認するには、次の手順を実行します。

1. SYSDBA権限を持つSYSユーザーとしてデータベース(リリース12.1以上)に接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

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

SET SERVEROUT ON
EXECUTE SDO_SEM_DOWNGRADE.CHECK_112_COMPATIBLE;

リリース11.2と互換性がないRDFデータがある場合、プロシージャはエラーを生成し、非互換データのリストを表示します。この場合は、次の手順を実行する必要があります。

1. この項の前半の説明にあるとおり、リリース12.1以上のリリース固有のRDFデータまたはOWLデータを削除します(まだ削除していない場合)。

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

3. SYSDBA権限を持つSYSユーザーとしてリリース11.2のデータベースに接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

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

- Linuxの場合: @$ORACLE_HOME/md/admin/semrelod.sql

- Windowsの場合: @%ORACLE_HOME%\md\admin\semrelod.sql

スクリプトが正常に実行された場合、次の列値を持つ行がMDSYS.RDF_PARAMETER表に挿入されます。

- NAMESPACE: MDSYS

- 属性: SEM_VERSION

- 値: (112で始まる文字列)

- 説明: VALID

semrelod.sqlスクリプトが正常に完了すると、リリース11.2のOracleセマンティク・テクノロジ・サポートが有効化されて使用可能になり、すべてのリリース11.2互換データが保持されます。

A.3 RDFセマンティク・グラフ・サポートの削除

この項では、データベースからRDFセマンティク・グラフ・サポートを削除する方法について説明します。特別な理由がないかぎり、このサポートは削除しないことを強くお薦めします。このサポートを削除すると、アプリケーションまたはデータベース・ユーザーはRDFセマンティク・グラフ・サポートに関連する型、シノニムまたはPL/SQLパッケージを使用できなくなります。

RDFデータのWorkspace Managerサポートを有効にした場合、そのサポートは、「RDFデータに対するWorkspace Managerサポートの削除」の説明にあるとおり、データベースのRDFセマンティク・グラフ・サポートを削除する前に、削除する必要があります。

データベースからRDFセマンティク・グラフ・サポートを削除するには、次の手順を実行します。

1. SYSDBA権限を持つSYSユーザーとしてデータベースに接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。

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

- Linuxの場合: @$ORACLE_HOME/md/admin/semremov.sql

- Windowsの場合: @%ORACLE_HOME%\md\admin\semremov.sql

semremov.sqlスクリプトは、セマンティク・ネットワークを削除し、RDFセマンティク・グラフの型、表およびPL/SQLパッケージも削除します。

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

この付録では、SEM_MATCHでの空間問合せを実行するためのSPARQL拡張ファンクションのリファレンス情報を示します。これらのファンクションを使用するには、「空間のサポート」に説明する概念を理解する必要があります。

注意:

この付録では、geomLiteralが、orageo:WKTLiteralとogc:wktLiteralの両方(これらは形式表現およびパラメータ記述で同義的に使用可能)のプレースホルダとして使用されます。(ただし、orageo:WKTLiteralまたはogc:wktLiteralが実際の例で使用されます。)

この付録には、次のGeoSPARQLおよびOracle固有のファンクションが含まれます。

GeoSPARQLの関数

- ogcf:boundary

- ogcf:buffer

- ogcf:convexHull

- ogcf:difference

- ogcf:distance

- ogcf:envelope

- ogcf:getSRID

- ogcf:intersection

- ogcf:relate

- ogcf:sfContains

- ogcf:sfCrosses

- ogcf:sfDisjoint

- ogcf:sfEquals

- ogcf:sfIntersects

- ogcf:sfOverlaps

- ogcf:sfTouches

- ogcf:sfWithin

- ogcf:symDifference

Oracle固有の関数:

- 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

B.1 ogcf:boundary

書式

ogcf:boundary(geom : geomLiteral) : ogc:wktLiteral

説明

geomの境界の閉包であるジオメトリ・オブジェクトを戻します。

パラメータ

geom

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、米国下院議員選挙区ポリゴンの境界を検出します。

SELECT cb
FROM table(sem_match(
'SELECT (ogcf:boundary(?cgeom) AS ?cb)
WHERE
{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom }'
,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 '));

B.2 ogcf:buffer

書式

ogcf:buffer(geom : geomLiteral, radius : xsd:decimal, units : xsd:anyURI) : ogc:wktLiteral

説明

ジオメトリの周りの指定された半径(単位で測定)のバッファ・ポリゴンを戻します。

パラメータ

geom

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

radius

バッファを定義するために使用される半径の値。

units

測定単位。<http://xmlns.oracle.com/rdf/geo/uom/{SDO_UNIT}形式のURI(<http://xmlns.oracle.com/rdf/geo/uom/KMなど)。MDSYS.SDO_DIST_UNITS表からのSDO_UNIT値がすべて認識されます。測定単位の仕様の詳細は、『Oracle Spatial and Graph開発者ガイド』の測定単位の項を参照してください。

使用上の注意

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、指定された点の周り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 (
ogcf:sfWithin(?cgeom,
ogcf:buffer("POINT(-71.46444 42.7575)"^^ogc:wktLiteral,
100,
<http://xmlns.oracle.com/rdf/geo/uom/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 '));

B.3 ogcf:convexHull

書式

ogcf:convexHull(geom : geomLiteral) : ogc:wktLiteral

説明

geomの凸型部分を表現するポリゴン・ジオメトリを戻します。(凸型とは、ジオメトリ・オブジェクトを完全に囲む最小ポリゴンを作成するために、使用する直線の辺をできるだけ少なくした、ジオメトリ・オブジェクトを完全に囲む単純な凸型のポリゴンです)。

パラメータ

geom

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、凸型が、指定された点を含む米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfContains(ogcf:convexHull(?cgeom),
"POINT(-71.46444 42.7575)"^^ogc:wktLiteral)) } '
,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 '));

B.4 ogcf:difference

書式

ogcf:difference(geom1 : geomLiteral, geom2 : geomLiteral) : ogc:wktLiteral

説明

geom1とgeom2で位相的に差(MINUS演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、中心が、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 (ogcf:sfWithin(orageo:centroid(?cgeom),
ogcf:difference("Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral,
"Polygon((-83.2 34.3, -83.0 34.3, -83.0 34.5,
-83.2 34.5, -83.2 34.3))"^^ogc:wktLiteral))) } '
,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 '));

B.5 ogcf:distance

書式

ogcf:distance(geom1 : geomLiteral, geom2 : geomLiteral, units : xsd:anyURI) : xsd:decimal

説明

geom1とgeom2の2点間の最短距離を、指定された単位で戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

units

測定単位。<http://xmlns.oracle.com/rdf/geo/uom/{SDO_UNIT}形式のURI(<http://xmlns.oracle.com/rdf/geo/uom/KMなど)。MDSYS.SDO_DIST_UNITS表からのSDO_UNIT値がすべて認識されます。測定単位の仕様の詳細は、『Oracle Spatial and Graph開発者ガイド』の測定単位の項を参照してください。

使用上の注意

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、指定された点からの距離に基づいて米国下院議員選挙区を順序付けします。

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
}
ORDER BY ASC(ogcf:distance(?cgeom,
"POINT(-71.46444 42.7575)"^^ogc:wktLiteral,
<http://xmlns.oracle.com/rdf/geo/uom/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;

B.6 ogcf:envelope

書式

ogcf:envelope(geom : geomLiteral) : ogc:wktLiteral

説明

geomの最小境界矩形(MBR)、つまり、geomを囲む単一の最小の矩形を戻します。

パラメータ

geom

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、最小境界矩形が、指定された点を含む米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfContains(ogcf:envelope(?cgeom),
"POINT(-71.46444 42.7575)"^^ogc:wktLiteral)) } '
,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 '));

B.7 ogcf:getSRID

書式

ogcf:getSRID(geom : geomLiteral) : xsd:anyURI

説明

geomの空間参照システムURIを戻します。

パラメータ

geom

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、米国下院議員選挙区ポリゴンの空間参照システムURIを検出します。

SELECT csrid
FROM table(sem_match(
'SELECT (ogcf:getSRID(?cgeom) AS ?csrid)
WHERE
{ ?person usgovt:name ?name .
?person pol:hasRole ?role .
?role pol:forOffice ?office .
?office pol:represents ?cdist .
?cdist orageo:hasExactGeometry ?cgeom }'
,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 '));

B.8 ogcf:intersection

書式

ogcf:intersection (geom1 : geomLiteral, geom2 : geomLiteral) : ogc:wktLiteral

説明

geom1とgeom2で位相的に共通部分(AND演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、中心が、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 (ogcf:sfWithin(orageo:centroid(?cgeom),
ogcf:intersection("Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral,
"Polygon((-83.2 34.3, -83.0 34.3, -83.0 34.5,
-83.2 34.5, -83.2 34.3))"^^ogc:wktLiteral))) } '
,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 '));

B.9 ogcf:relate

書式

ogcf:relate(geom1 : geomLiteral, geom2 : geomLiteral, pattern-matrix : xsd:string) : xsd:boolean

説明

geom1とgeom2間の位相関係が、指定されたDE-9IMパターンマトリックスを満たす場合、trueを戻します。それ以外の場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

pattern-matrix

T(true)およびF(false)の値からなる、次元的に拡張された9交差モデル(DE-9IM)の交差パターン文字列。DE-9IMパターン文字列は、2つのジオメトリの内部、境界および外部の共通部分を示します。

使用上の注意

問合せ変数と定数ジオメトリを使用してogcf:relateをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、ogcf:relate空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?varに対する制限的なogcf:relate空間フィルタを含む場合は、LEADING(?var) HINT0ヒントを使用することをお薦めします。

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

DE-9IM交差パターンの詳細は、OGCのシンプル・フィーチャの仕様(OGC 06-103r3)を参照してください。OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、指定された点を含む米国下院議員選挙区を検出します。

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 (ogcf:relate(?cgeom,
"POINT(-71.46444 42.7575)"^^ogc:wktLiteral,
"TTTFFTFFT")) } '
,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 '
));

B.10 ogcf:sfContains

書式

ogcf:sfContains(geom1 : geomLiteral, geom2 : geomLiteral) : xsd:boolean

説明

OGCのシンプル・フィーチャの仕様(OGC 06-103r3)で定義されているようにgeom1がgeom2を空間的に含む場合、trueを戻します。それ以外の場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

問合せ変数と定数ジオメトリを使用してこのファンクションをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、ogcf:sfContains空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?varに対する制限的なogcf:sfContains空間フィルタを含む場合は、LEADING(?var) HINT0ヒントを使用することをお薦めします。

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、定数ポリゴンを空間的に含む米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfContains(?cgeom,
"Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral)) } '
,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 '));

B.11 ogcf:sfCrosses

書式

ogcf:sfCrosses(geom1 : geomLiteral, geom2 : geomLiteral) : xsd:boolean

説明

OGCのシンプル・フィーチャの仕様(OGC 06-103r3)で定義されているようにgeom1がgeom2を空間的に横断する場合、trueを戻します。それ以外の場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

問合せ変数と定数ジオメトリを使用してこのファンクションをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、ogcf:sfCrosses空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?varに対する制限的なogcf:sfCrosses空間フィルタを含む場合は、LEADING(?var) HINT0ヒントを使用することをお薦めします。

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、定数ポリゴンを空間的に横断する米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfCrosses(?cgeom,
"Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral)) } '
,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 '));

B.12 ogcf:sfDisjoint

書式

ogcf:fDisjoint(geom1 : geomLiteral, geom2 : geomLiteral) : xsd:boolean

説明

OGCのシンプル・フィーチャの仕様(OGC 06-103r3)で定義されているように2つのジオメトリが空間的に非接続である場合、trueを戻します。それ以外の場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

ogcf:sfDisjointフィルタは、評価のために空間索引を使用できないため、パフォーマンスは、多くの場合、他のシンプル・フィーチャの空間関数よりも非常に悪くなります。

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、定数ポリゴンから空間的に非接続である米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfDisjoint(?cgeom,
"Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral)) } '
,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 '));

B.13 ogcf:sfEquals

書式

ogcf:sfEquals(geom1 : geomLiteral, geom2 : geomLiteral) : xsd:boolean

説明

OGCのシンプル・フィーチャの仕様(OGC 06-103r3)で定義されているように2つのジオメトリが空間的に同じである場合、trueを戻します。それ以外の場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

問合せ変数と定数ジオメトリを使用してこのファンクションをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、ogcf:sfEquals空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?varに対する制限的なogcf:sfEquals空間フィルタを含む場合は、LEADING(?var) HINT0ヒントを使用することをお薦めします。

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、定数ポリゴンと空間的に同じである米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfEquals(?cgeom,
"Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral)) } '
,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 '));

B.14 ogcf:sfIntersects

書式

ogcf:sfIntersects(geom1 : geomLiteral, geom2 : geomLiteral) : xsd:boolean

説明

OGCのシンプル・フィーチャの仕様(OGC 06-103r3)で定義されているように2つのジオメトリが非接続でない場合、trueを戻します。それ以外の場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

問合せ変数と定数ジオメトリを使用してこのファンクションをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、ogcf:sfIntersects空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?varに対する制限的なogcf:sfIntersects空間フィルタを含む場合は、LEADING(?var) HINT0ヒントを使用することをお薦めします。

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、定数ポリゴンと交差する米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfIntersects(?cgeom,
"Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral)) } '
,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 '));

B.15 ogcf:sfOverlaps

書式

ogcf:sfOverlaps(geom1 : geomLiteral, geom2 : geomLiteral) : xsd:boolean

説明

OGCのシンプル・フィーチャの仕様(OGC 06-103r3)で定義されているようにgeom1がgeom2に空間的に重なる場合、trueを戻します。それ以外の場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

問合せ変数と定数ジオメトリを使用してこのファンクションをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、ogcf:sfOverlaps空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?varに対する制限的なogcf:sfOverlaps空間フィルタを含む場合は、LEADING(?var) HINT0ヒントを使用することをお薦めします。

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、定数ポリゴンに空間的に重なる米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfOverlaps(?cgeom,
"Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral)) } '
,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 '));

B.16 ogcf:sfTouches

書式

ogcf:sfTouches(geom1 : geomLiteral, geom2 : geomLiteral) : xsd:boolean

説明

OGCのシンプル・フィーチャの仕様(OGC 06-103r3)で定義されているように2つのジオメトリが空間的に接している場合、trueを戻します。それ以外の場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

問合せ変数と定数ジオメトリを使用してこのファンクションをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、ogcf:sfTouches空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?varに対する制限的なogcf:sfTouches空間フィルタを含む場合は、LEADING(?var) HINT0ヒントを使用することをお薦めします。

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、定数ポリゴンに空間的に接している米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfTouches(?cgeom,
"Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral)) } '
,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 '));

B.17 ogcf:sfWithin

書式

ogcf:sfWithin(geom1 : geomLiteral, geom2 : geomLiteral) : xsd:boolean

説明

OGCのシンプル・フィーチャの仕様(OGC 06-103r3)で定義されているようにgeom1が空間的にgeom2の内部にある場合、trueを戻します。それ以外の場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

問合せ変数と定数ジオメトリを使用してこのファンクションをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、ogcf:sfWithin空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?varに対する制限的なogcf:sfWithin空間フィルタを含む場合は、LEADING(?var) HINT0ヒントを使用することをお薦めします。

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、空間的に定数ポリゴンの内部にある米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfWithin(?cgeom,
"Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral)) } '
,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 '));

B.18 ogcf:symDifference

書式

ogcf:symDifference(geom1 : geomLiteral, geom2 : geomLiteral) : ogc:wktLiteral

説明

geom1とgeom2で位相的に排他的論理和(XOR演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、指定された点の周り100kmのバッファ内にある米国下院議員選挙区ポリゴンを検出します。

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 (ogcf:sfWithin(orageo:centroid(?cgeom),
ogcf:symDifference("Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral,
"Polygon((-83.2 34.3, -83.0 34.3, -83.0 34.5,
-83.2 34.5, -83.2 34.3))"^^ogc:wktLiteral))) } '
,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 '));

B.19 ogcf:union

書式

ogcf:union(geom1 : geomLiteral, geom2 : geomLiteral) : ogc:wktLiteral

説明

geom1とgeom2で位相的に結合部分(OR演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

OGCのGeoSPARQLの仕様も参照してください。

例

次の例では、中心が、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 (ogcf:sfWithin(orageo:centroid(?cgeom),
ogcf:union("Polygon((-83.6 34.1, -83.2 34.1, -83.2 34.5,
-83.6 34.5, -83.6 34.1))"^^ogc:wktLiteral,
"Polygon((-83.2 34.3, -83.0 34.3, -83.0 34.5,
-83.2 34.5, -83.2 34.3))"^^ogc:wktLiteral))) } '
,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 '));

B.20 orageo:area

書式

orageo:area(geom1 : geomLiteral, unit : Literal) : xsd:decimal

説明

指定された測定単位でgeom1の面積を戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

unit

測定単位(MDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で、たとえば"unit=SQ_KM")を指定します。測定単位の仕様の詳細は、『Oracle Spatial and Graph開発者ガイド』の測定単位の項を参照してください。

使用上の注意

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

B.21 orageo:buffer

書式

orageo:buffer(geom1 : geomLiteral, distance : xsd:decimal, unit : Literal) : geomLiteral

説明

ジオメトリの周りまたは内部の、指定された距離にあるバッファ・ポリゴンを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

distance

距離値。距離値。値が正の場合、バッファはgeom1の周りに生成され、値が負の場合(ポリゴンに対してのみ有効)、バッファはgeom1の内部に生成されます。

unit

測定単位(MDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で、たとえば"unit=KM")を指定します。測定単位の仕様の詳細は、『Oracle Spatial and Graph開発者ガイド』の測定単位の項を参照してください。

使用上の注意

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

B.22 orageo:centroid

書式

orageo:centroid(geom1 : geomLiteral) : geomLiteral

説明

geom1の中心である点ジオメトリを戻します。(中心は「重心」とも呼ばれます。)

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

複数のオブジェクトで構成される入力ジオメトリの場合、ジオメトリ・オブジェクトの各ポリゴンの面積によって結果が重み付けされます。ジオメトリ・オブジェクトにポリゴンおよび点が混在する場合、中心の計算では点が使用されません。ジオメトリ・オブジェクトがすべて点で構成される場合、それらの点は均等に重み付けされます。

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

B.23 orageo:convexHull

書式

orageo:convexHull(geom1 : geomLiteral) : geomLiteral

説明

geom1の凸型部分を表現するポリゴンタイプ・オブジェクトを戻します。(凸型とは、ジオメトリ・オブジェクトを完全に囲む最小ポリゴンを作成するために、使用する直線の辺をできるだけ少なくした、ジオメトリ・オブジェクトを完全に囲む単純な凸型のポリゴンです)。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

凸型は、複雑なジオメトリ・オブジェクトの近似値を取る場合に便利です。

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

B.24 orageo:difference

書式

orageo:difference(geom1 : geomLiteral, geom2 : geomLiteral) : geomLiteral

説明

geom1とgeom2で位相的に差(MINUS演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

B.25 orageo:distance

書式

orageo:distance(geom1 : geomLiteral, geom2 : geomLiteral, unit : Literal) : xsd:decimal

説明

指定された測定単位で、2つの点またはセグメントgeom1とgeom2の最短距離を戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

unit

測定単位(MDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で、たとえば"unit=KM")を指定します。測定単位の仕様の詳細は、『Oracle Spatial and Graph開発者ガイド』の測定単位の項を参照してください。

使用上の注意

orageo:withinDistanceは、より効率的な索引ベースの実装が行われているため、可能な場合は、orageo:distanceのかわりにorageo:withinDistanceを使用します。

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

『Oracle Spatial and Graph開発者ガイド』の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;

B.26 orageo:intersection

書式

orageo:intersection(geom1 : geomLiteral, geom2 : geomLiteral) : geomLiteral

説明

geom1とgeom2で位相的に共通部分(AND演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

B.27 orageo:length

書式

orageo:length(geom1 : geomLiteral, unit : Literal) : xsd:decimal

説明

指定された測定単位でgeom1の長さ、つまり周囲を戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

unit

測定単位(MDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で、たとえば"unit=KM")を指定します。測定単位の仕様の詳細は、『Oracle Spatial and Graph開発者ガイド』の測定単位の項を参照してください。

使用上の注意

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

B.28 orageo:mbr

書式

orageo:mbr(geom1 : geomLiteral) : geomLiteral

説明

geom1の最小境界矩形、つまりgeom1を囲む単一の最小の矩形を戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

B.29 orageo:nearestNeighbor

書式

orageo:nearestNeighbor(geom1:  geomLiteral, geom2 : geomLiteral, param : Literal) : xsd:boolean

説明

geom1がgeom2の最も近い隣接である場合(設定される最も近い隣接のサイズはparamによって指定されます)、trueを戻し、そうでない場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

param

演算子の処理を指定します。使用可能なキーワードと値のペアの詳細は、「使用方法」を参照してください。

使用上の注意

paramパラメータで使用可能なキーワードと値のペアは次のとおりです。

- distance=nには、最近傍探索における最大許容距離を指定します。

- sdo_num_res=nには、最近傍探索におけるセットのサイズを指定します。

- unit=unitには、distance値で使用する測定単位を指定します。値を指定しない場合、データに関連付けられている測定単位が使用されます。

geom1は、ローカル変数(つまり、orageo:nearestNeighbor空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?varに対する制限的なorageo:relate空間フィルタを含む場合は、'LEADING(?var)' HINT0ヒントを使用することをお薦めします。

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

B.30 orageo:relate

書式

orageo:relate(geom1:  geomLiteral, geom2 : geomLiteral, param : Literal) : xsd:boolean

説明

geom1とgeom2がparamパラメータによって指定される空間的な位相関係を満たす場合、trueを戻し、そうでない場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

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を戻します。

paramの値は、論理ブール演算子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での空間データの表現、索引付け、および問合せの詳細は、「空間のサポート」を参照してください。

『Oracle Spatial and Graph開発者ガイド』の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 '
));

B.31 orageo:union

書式

orageo:union(geom1 : geomLiteral, geom2 : geomLiteral) : geomLiteral

説明

geom1とgeom2で位相的に結合部分(OR演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

『Oracle Spatial and Graph開発者ガイド』のSDO_GEOM.SDO_UN ION関数も参照してください。

例

次の例では、中心が、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 '));

B.32 orageo:withinDistance

書式

orageo:withinDistance(geom1 : geomLiteral, geom2 : geomLiteral, distance : xsd:decimal, unit : Literal) : xsd:boolean

説明

geom1とgeom2の間の距離がunitで測定されるdistance以下である場合、trueを戻し、そうでない場合はfalseを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

distance

距離値。

unit

測定単位(MDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で、たとえば"unit=KM")を指定します。測定単位の仕様の詳細は、『Oracle Spatial and Graph開発者ガイド』の測定単位の項を参照してください。

使用上の注意

問合せ変数と定数ジオメトリを使用してこのファンクションをコールする場合は、常に、問合せ変数を1番目のパラメータとして、定数ジオメトリを2番目のパラメータとして使用します。

最適なパフォーマンスを得るには、geom1は、ローカル変数(つまり、orageo:withinDistance空間フィルタを含む基本的なグラフ・パターンに出現する変数)である必要があります。

問合せが、?varに対する制限的なorageo:withinDistance空間フィルタを含む場合は、'LEADING(?var)' HINT0ヒントを使用することをお薦めします。

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

B.33 orageo:xor

書式

orageo:xor(geom1 : geomLiteral, geom2 : geomLiteral) : geomLiteral

説明

geom1とgeom2で位相的に排他的論理和(XOR演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

geom1

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

geom2

ジオメトリ・オブジェクト。問合せ変数または定数geomLiteralの値で指定します。

使用上の注意

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

『Oracle Spatial and Graph開発者ガイド』の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 '));

CRDFセマンティク・グラフでの仮想プライベート・データベースのサポート

注意:

Oracle Databaseリリース12c (12.1)では、RDFセマンティク・グラフでの仮想プライベート・データベース(VPD)のサポートは、ファイングレイン・アクセス制御の提供に関しては非推奨となり、今後のメジャー・リリースでは削除されます。

VPDに依存する新しいRDFセマンティク・グラフ・アプリケーションは開発しないようにし、VPDに依存する既存のRDFセマンティク・グラフ・アプリケーションを、Oracle Label Security (OLS)を使用するように移行してください。(OLSのサポートの詳細は、「RDFデータのファイングレイン・アクセス制御」を参照してください。)

詳細は、My Oracle SupportのNote 1468273.1を参照してください

RDFデータの仮想プライベート・データベース(VPD)によって、セキュリティ管理者は、特定のRDFクラスまたはプロパティのインスタンスを含むトリプルに対するユーザーのアクセスを条件付きで制限するポリシーを定義できます。VPDを使用すると、RDFモデルに格納されたデータはそのメタデータを使用して分類され、各ユーザー問合せは、アクセス制限を実施するコンテキスト依存のデータ・アクセス制約を含むようにリライトされます。

VPDの使用方法の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

RDFデータでVPDとOLSのどちらを使用するかを選択する場合に考慮する要素は、次のとおりです。

- OLSは、RDFデータに対して有効化されると、ネットワーク・レベルで実施されますが、VPDは個々のRDFモデルに対して実施できます。

- Oracleインスタンスで同時にRDFデータに対してVPDとOLSの両方を使用することはできません。

セマンティク・データとともにVPDまたはOLSを実装するためのアプリケーション・プログラミング・インタフェース(API)は、SEM_RDFSA PL/SQLパッケージで提供されます。「SEM_RDFSAパッケージのサブプログラム」には、SEM_RDFSAパッケージのプログラムに関するリファレンス情報が示されています。

RDFデータに対するVPDおよびOLSのサポートは、Oracle DatabaseのRDFセマンティク・グラフ・サポートに含まれています。(RDFセマンティク・グラフ・サポートの有効化、ダウングレード、または削除の詳細は、「RDFセマンティク・グラフ・サポートの有効化、ダウングレードまたは削除」を参照してください。)

CDB (マルチテナント・コンテナ・データベース)環境では、RDFに対してVPDを使用できません。

C.1 RDFデータの仮想プライベート・データベース(VPD)

仮想プライベート・データベース(VPD)機能は、セキュリティ・ポリシーとアプリケーション・コンテキストを使用してリレーショナル表またはビューの特定の行に対するアクセスを制限する行レベルのセキュリティ・メカニズムです。セキュリティ・ポリシーには、ユーザー問合せに対して戻される行ごとに実施される述語を動的に生成するポリシー・ファンクションが含まれます。表に関連付けられたポリシー・ファンクションによって戻されるセキュリティ述語は、通常、表の列を使用して表現されるため、表のメタデータに依存します。実際、セキュリティ述語によって、ユーザー問合せに対して戻される行が、その行の内容に適用される追加の条件を満たすことが保証されます。

リレーショナル・データがRDFにマップされている場合、特定のリレーショナル表に格納されているデータは、特定のRDFクラスのインスタンスを記述するトリプルを表します。この表現では、リレーショナル表の列は、リソースを記述するために使用されるRDFプロパティにマップされます。このマッピングは、さらにVPDポリシーのアプリケーションに拡張できます。

RDFデータに適用されるVPDポリシーは、述語を、グラフ・パターンおよびフィルタ条件の形式でインスタンス・データに適用することによって、ユーザーのアクセスを特定のRDFクラスまたはプロパティのインスタンスに制限します。たとえば、Contract RDFクラスのインスタンスへのアクセスを特定の部門に属するユーザーのみに制限する場合に、VPDポリシーを定義できます。また、Contract RDFクラスのインスタンスと識別されるリソースのhasContractValueプロパティへのアクセスを、契約の管理者のみに制限できます。RDFデータに対するVPDサポートでは、セキュリティ条件またはデータ・アクセス制約をRDFクラスおよびプロパティに関連付けて、対応するインスタンス・データへのアクセスが制限されるようにできます。

RDFクラスまたはプロパティに関連付けられるデータ・アクセス制約によって、問合せ結果として戻されるすべての対応するデータ・インスタンスに対して実施される必要がある、グラフ問合せパターンが指定されます。たとえば、Contractクラスのすべてのインスタンスの期限を検索するSPARQL問合せパターン({?contract :hasDueDate ?due})は、戻される情報が特定の部門に属する契約に関係することを保証するデータ・アクセス制約をアクティブにすることができます。これは、次の例に示すように、追加のグラフ・パターンを含むようにユーザーのグラフ問合せパターンを論理的にリライトすることによって、実現されます。

{ ?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問合せに対してのみ実施されます。データ・アクセスの他のすべての形式(グラフ・パターンの従来の構文またはモデル・ビューに対する直接問合せなど)は、許可されません。

C.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ポリシーに定義されたデータ・アクセス制約によって、制約グループの名前を指定できます(「データ・アクセス制約」を参照)。データベース・セッション内で、コンテキスト・パッケージによって設定されたセッション・コンテキストに基づいて、制約の適切なグループがアクティブ化されます。データベース・セッションの後続のすべてのSPARQL問合せでは、適切なセキュリティ・ポリシーを実施するために、アクティブなグループに属している制約が参照されます。

VPDポリシーを持つRDFモデル上のメンテナンス操作では、モデルのデータへの無条件のアクセスが必要です。この操作には、VPDで保護された1つ以上のモデルで使用する伴意の作成、およびロードまたはデータ操作が含まれます。VPDポリシーに関連付けられている名前空間に対して予約済の属性を初期化することで、RDFモデルに格納されたデータへの無条件のアクセス権限を付与できます。この予約済の属性はパッケージ定数sem_rdfsa.VPD_FULL_ACCESSで定義され、前の例で示したコンテキスト・パッケージ実装によってRDF_ADMINユーザーに完全なアクセス権限が付与されます。

アプリケーション表に対するDML操作は、VPD制約違反については検証されないため、対応するモデルに対する完全なアクセス権限を持つユーザーのみが、既存のトリプルを追加または変更できます。

SEM_MATCH演算子を使用すると、標準のSQL問合せでVPDポリシーのあるRDFモデルを問い合せることや、VPD対応のモデルとVPDポリシーのないモデルの組合せに対してマルチモデル問合せを実行することができます。ただし、マルチモデル問合せの複数のモデルがVPD対応の場合、それらはすべて同じVPDポリシーに関連付けられている必要があります。RDFモデルに関連付けられたVPDポリシーは、モデルから推論された任意のデータに自動的に拡張されます。推論中に複数のRDFモデルが指定される場合、そのセット内のすべてのVPD対応モデルで同じVPDポリシーを使用する必要があります。

C.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ポリシー内では、別のプロパティと等価であると宣言されたプロパティに追加のメタデータまたはデータ・アクセス制約を直接割り当てることはできません。

C.1.3 データ・アクセス制約

VPDポリシーに関連付けられたデータ・アクセス制約は、実施されるアクセス制限のタイプに基づいて次の2つの一般的なカテゴリに分類されます。

- 特定のRDFクラスのインスタンスに対するアクセスを制限するもの

- 特定のRDFプロパティを使用する表明に制限するもの

アクセス制限は、アプリケーション・コンテキストとSPARQL問合せでアクセスされるリソースの特徴に基づいて、条件付きで実施されます。データ・アクセス制約では、リソースに関連付けられるいくつかのプロパティを使用して、アクセスをRDFクラスまたはプロパティのインスタンスに制限します。たとえば、Contractクラスのメンバーであるリソースへのアクセスを、その契約を担当するユーザーのみに制限する(そのリソースに関連付けられているhasMemberプロパティを使用して識別する)ことができます。同様に、リソースのhasContractValueプロパティへのアクセスを、同じリソースに関連付けられるhasManagerプロパティによって契約の管理者として識別されるユーザーに制限できます。

各データ・アクセス制約は、一致パターンおよび適用パターンとして識別される2つのグラフ・パターンを使用して表現されます。制約の一致パターンによって、制約が実施するアクセス制限のタイプが決定され、1つ以上の変数がユーザー問合せでアクセスされる対応するデータ・インスタンスにバインドされます。たとえば、Contractクラスのインスタンスに対して次の一致パターンを定義し、SPARQL問合せでアクセスされるこのようなインスタンスすべてに1つの変数をバインドします。

{ ?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ポリシーに制約を追加しますが、そのVPDポリシーがpredおよびemp名前空間接頭辞に関して適切な名前空間マップで定義されていることを前提とします。(名前空間マップを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制約グループ内で定義される)を、管理者ロールを持つユーザーが関係するすべてのセッションに対してアクティブにできます。この場合は、sa$appctx名前空間の属性app_user_uriをログインしたユーザーの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問合せにネストしたグラフ・パターンがある場合、データ・アクセス制約は適切な基本問合せグラフ・パターン・ブロックに適用されます。次の例では、OPTIONALグラフ・パターンでhasContractValueプロパティが参照され、それによってこのブロックのグラフ・パターンに、対応する適用パターンが実施されます。

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問合せに出現する変数または語句のクラス情報は、問合せに出現するプロパティのドメインおよびレンジ情報を使用して導出されます。VPDポリシーにdrivenByプロパティのドメインはContractクラスであると表明するRDFスキーマ文がある場合、次の例のSPARQL問合せでの変数?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ファンクションを使用すると、構造的に類似したグラフ・パターンを持つコンテキスト依存のアクセス制限を実施できます。構造的に異なるグラフ・パターンを使用して代替アクセス制限を実施するには、アプリケーション・コンテキストに基づいて、制約グループを動的にアクティブ化および非アクティブ化できます。

C.1.4 RDFVPD_POLICIESビュー

MDSYS.RDFVPD_POLICIESビューには、スキーマに定義されているすべてのVPDポリシーまたはユーザーが完全なアクセス権限を持っているポリシーに関する情報が含まれます。同じポリシーが複数のモデルに関連付けられている場合、ビューにはそのような関連ごとに1つのエントリが含まれます。このビューは、セマンティク・ネットワークとVPDポリシーが作成された後にのみ存在します。

MDSYS.RDFVPD_POLICIESビューには、表C-1に示す列が含まれます。

表C-1 MDSYS.RDFVPD_POLICIESビューの列

列名

データ型

説明

POLICY_OWNER

VARCHAR2(32)

VPDポリシーの所有者。

POLICY_NAME

VARCHAR2(32)

VPDポリシーの名前。

NAMESPACE_MAP

RDF_ALIASES

VPD制約定義で使用される名前空間エントリのマッピング。

CONTEXT_NAME

VARCHAR2(32)

制約グループを管理するために使用されるコンテキストの名前。

C.1.5 RDFVPD_MODELSビュー

MDSYS.RDFVPD_MODELSビューには、RDFモデルとそれに関連付けられたVPDポリシーに関する情報が含まれます。このビューは、セマンティク・ネットワークとVPDポリシーが作成された後にのみ存在します。

MDSYS.RDFVPD_MODELSビューには、表C-2に示す列が含まれます。

表C-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。

C.1.6 RDFVPD_POLICY_CONSTRAINTSビュー

MDSYS.RDFVPD_POLICY_CONSTRAINTSビューには、現在のユーザーがアクセスできるVPDポリシーに定義された制約に関する情報が含まれます。このビューは、セマンティク・ネットワークとVPDポリシーが作成された後にのみ存在します。

MDSYS.RDFVPD_POLICY_CONSTRAINTSビューは、表C-3で表示される列を含みます。

表C-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)

制約が属している制約グループの名前。(大/小文字は区別されません。)

C.1.7 RDFVPD_PREDICATE_MDATAビュー

MDSYS.RDFVPD_PREDICATE_MDATAビューには、VPDポリシーに関連付けられた述語メタデータに関する情報が含まれます。このビューは、セマンティク・ネットワークとVPDポリシーが作成された後にのみ存在します。

MDSYS.RDFVPD_PREDICATE_MDATAビューには、表C-4に示す列が含まれます。

表C-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。

C.1.8 RDFVPD_RESOURCE_RELビュー

MDSYS.RDFVPD_RESOURCE_RELビューには、VPDポリシーのリソース間に定義されているサブクラス、サブプロパティおよび等価プロパティの関係に関する情報が含まれます。このビューは、セマンティク・ネットワークとVPDポリシーが作成された後にのみ存在します。

MDSYS.RDFVPD_RESOURCE_RELビューには、表C-5に示す列が含まれます。

表C-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)

主語リソースと目的語リソースの間に存在する関係。

用語集

RDFセマンティク・グラフ・サポートのOracle Database実装に関連する用語を示します。これは、RDFおよびOWLの包括的な用語集でありません。

適用パターン

データ・アクセス制約の一部であり、一致パターンと一致するリソースが問合せ結果の構築に使用される前に、そのリソースに適用する追加のグラフ・パターンを定義します。関連項目: 「一致パターン」

基本グラフ・パターン(BGP)

1組のトリプル・パターン。W3C勧告の「SPARQL Query Language for RDF」の説明では、「SPARQLのグラフ・パターン照合は、基本グラフ・パターンの照合結果を組み合せるという観点で定義されています。単一の基本グラフ・パターンは、フィルタの割込がある一連のトリプル・パターンによって形成されます。任意のグラフ・パターンによって、基本グラフ・パターンが終了します」と記述されています。

クリーク

そのすべてのノードが同じグラフの他のすべてのノードに双方向に接続されているグラフです。

Cytoscape

分子間相互作用ネットワークを視覚化し、遺伝子発現プロファイルおよびその他の状態データとのこれらの相互作用を統合するためのオープン・ソースのバイオインフォマティクス・ソフトウェア・プラットフォームです。(http://www.cytoscape.org/を参照してください。)RDFビューアは、Cytoscapeプラグインとして提供されています(ダウンロード可能です)。

伴意

指定したルールベースのセットを指定したモデルのセットに適用することで推論できる計算済のトリプルを含むオブジェクトです。関連項目: 「ルールベース」

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

ポリシーを使用して作成されるセマンティク索引の特性を決定する、名前付きディクショナリ・エンティティです。各エクストラクタ・ポリシーは、直接的または間接的にエクストラクタ・タイプのインスタンスを参照します。

グラフ・パターン

トリプルの組合せであり、トリプル・パターンを様々な方法で組み合せ(複数のトリプル・パターンのグループ化など)、必要に応じてフィルタ条件を使用、その後のコネクタ(分離、外部結合など)を使用してこのようなグループを組み合せます。SPARQL問合せは、グラフ・パターン一致に基づいています。

推論(inferencing)

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

情報エクストラクタ

構造化されていないドキュメントを処理し、それらから意味のある情報を抽出するアプリケーションです(通常は、自然言語処理エンジンとオントロジを使用します)。

一致パターン

制約の一部であり、制約が実施するアクセス制限のタイプを決定し、ユーザー問合せでアクセスされる対応するデータ・インスタンスに1つ以上の変数をバインドします。関連項目: 「適用パターン」

モデル

ユーザーが作成するセマンティク構造であり、モデル名を持ち、指定した表の列に格納されているトリプルを参照します。このマニュアルでの例は、ArticlesモデルとFamilyモデルです。

オントロジ

特定の領域で共有される知識の概念化です。オントロジは、クラス、プロパティおよび(オプションの)インスタンスの集合で構成されます。クラスは、通常、クラス階層(サブクラスとスーパークラスの関係)によって関連付けられます。同様に、プロパティは、プロパティ階層(サブプロパティとスーパープロパティの関係)によって関連付けられます。プロパティは、対称的または推移的(あるいはその両方)です。プロパティには、それぞれ指定されたドメイン、レンジおよびカーディナリティの制約があります。

OWLPrime

OWL機能のOracle定義のサブセットです。RDFセマンティク・グラフのネイティブ推論エンジンによってサポートされるOWL標準の要素を参照してください。

RDF Semantic Graph support for Apache Jena

Oracleが提供するApache Jena用のアダプタ(セマンティクWebアプリケーションを構築するためのJavaフレームワーク)で、ダウンロード可能です。

RDF Semantic Graph support for OpenRDF Sesame

一般的なSesame Java APIとRDFセマンティク・グラフ・サポートを統合する、Oracleが提供するアダプタです(ダウンロード可能です)。

推論(reasoning)

「推論」を参照

ルール

セマンティク・データから推論を導く際に適用できるオブジェクトです。

ルールベース

ルールを含むことができるオブジェクトです。関連項目: 「ルール」

ルール索引

関連項目: 「伴意」

セマンティク索引

タイプMDSYS.SEMCONTEXTの索引であり、表の列に格納されているテキスト・ドキュメントで作成され、情報エクストラクタとともに使用されて、構造化されていないドキュメントから意味のある情報を検索し、抽出します。関連項目: 「情報エクストラクタ」

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

記号

- .gvファイル(DOTファイル)

- 出力 1

A

- ADD_DATATYPE_INDEXプロシージャ 1

- ADD_DEPENDENT_POLICYプロシージャ 1

- ADD_SEM_INDEXプロシージャ 1

- ADD_VPD_CONSTRAINTプロシージャ 1

- 高度な圧縮 1

- 集計

- ユーザー定義 1

- エイリアス

- SEM_ALIASESおよびSEM_ALIASデータ型 1 2

- ALL_BGP_HASH

- SEM_MATCHの問合せオプション 1

- ALL_BGP_NL

- SEM_MATCHの問合せオプション 1

- ALL_LINK_HASH

- SEM_MATCHの問合せオプション 1

- ALL_LINK_NL

- SEM_MATCHの問合せオプション 1

- ALL_MAX_PP_DEPTH(n)

- SEM_MATCHの問合せオプション 1

- ALLOW_DUP=T

- SEM_MATCHの問合せオプション 1

- ALTER_DATATYPE_INDEXプロシージャ 1

- ALTER_ENTAILMENTプロシージャ 1

- ALTER_MODELプロシージャ 1

- ALTER_SEM_INDEX_ON_ENTAILMENTプロシージャ 1

- ALTER_SEM_INDEX_ON_MODELプロシージャ 1

- ANALYZE_ENTAILMENTプロシージャ 1

- ANALYZE_MODELプロシージャ 1

- APPLY_OLS_POLICYプロシージャ 1

- APPLY_POLICY_TO_APP_TABプロシージャ 1

- APPLY_VPD_POLICYプロシージャ 1

- 適用パターン 1

B

- BASEキーワード

- グローバル接頭辞 1

- 基本グラフ・パターン(BGP) 1

- バッチ(バルク)・ロード 1、2

- セマンティク・データのバッチ・ロード 1

- ベスト・エフォート

- SPARQL問合せの指定 1

- BGP(基本グラフ・パターン) 1

- 空白ノード 1

- BULK_LOAD_FROM_STAGING_TABLEプロシージャ 1

- バルク・ロード 1 、 2

- セマンティク・データのバルク・ロード 1

C

- Calais

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

- 正規形 1

- catsem.sqlスクリプト 1

- 変更トラッキング

- 無効化 1

- 有効 1

- 情報の取得 1

- CLEANUP_FAILEDプロシージャ 1

- クライアント識別子 1

- クリーク(sameAs) 1

- COMPOSE_RDF_TERMファンクション 1

- 接続プーリング

- RDF Semantic Graph support for Apache Jenaでのサポート 1

- RDF Semantic Graph support for OpenRDF Sesameでのサポート 1

- CONSTRUCT_STRICT=T

- SEM_MATCHの問合せオプション 1

- CONSTRUCT_UNIQUE=T

- SEM_MATCHの問合せオプション 1

- セマンティク・データのコンストラクタ 1

- convert_old_rdf_dataプロシージャ 1

- コーパス中心の推論 1

- CREATE_ENTAILMENTプロシージャ 1

- CREATE_POLICYプロシージャ 1

- CREATE_RDFVIEW_MODELプロシージャ 1

- CREATE_RULEBASEプロシージャ 1

- CREATE_SEM_MODELプロシージャ 1

- CREATE_SEM_NETWORKプロシージャ 1

- CREATE_SOURCE_EXTERNAL_TABLEプロシージャ 1

- CREATE_VIRTUAL_MODELプロシージャ 1

- CREATE_VPD_POLICYプロシージャ 1

D

- データ型索引

- 追加 1

- 変更 1

- 削除 1

- SEM_DTYPE_INDEX_INFOビュー 1

- 使用 1

- データ型

- リテラルの 1

- セマンティク・データのデータ型 1

- default.xsltファイル

- カスタマイズ 1

- DELETE_ENTAILMENT_STATSプロシージャ 1

- DELETE_MODEL_STATSプロシージャ 1

- DELETE_NETWORK_STATSプロシージャ 1

- DELETE_VPD_CONSTRAINTプロシージャ 1

- デモ・ファイル

- セマンティク・データ 1

- DISABLE_CHANGE_TRACKINGプロシージャ 1

- DISABLE_INC_INFERENCEプロシージャ 1

- DISABLE_OLS_POLICYプロシージャ 1

- ディスカッション・フォーラム

- RDFセマンティク・グラフ 1

- ドキュメント中心の推論 1

- ドキュメント

- セマンティク索引付け 1

- DOTファイル

- 出力 1

- ダウングレード

- リリース11.1のセマンティク・テクノロジ・サポート 1

- ダウンロード

- RDFセマンティク・グラフ 1

- DROP_DATATYPE_INDEXプロシージャ 1

- DROP_ENTAILMENTプロシージャ 1

- DROP_POLICYプロシージャ 1

- DROP_RDFVIEW_MODELプロシージャ 1

- DROP_RULEBASEプロシージャ 1

- DROP_SEM_INDEXプロシージャ 1

- DROP_SEM_MODELプロシージャ 1

- DROP_SEM_NETWORKプロシージャ 1

- DROP_USER_INFERENCE_OBJSプロシージャ 1

- DROP_VIRTUAL_MODELプロシージャ 1

- DROP_VPD_POLICYプロシージャ 1

- 重複トリプル

- 確認 1

- モデルからの削除 1 , 2

E

- ENABLE_CHANGE_TRACKINGプロシージャ 1

- ENABLE_INC_INFERENCEプロシージャ 1

- ENABLE_OLS_POLICYプロシージャ 1

- ENABLE_SYNTAX_CHECKINGオプティマイザ・ヒント 1

- 伴意

- 無効なステータス 1

- 伴意ルール 1

- 伴意

- 変更 1

- 失敗の状態にある場合の削除 1

- 不完全ステータス 1 , 2

- 無効なステータス 1

- SEM_RULES_INDEX_DATASETSビュー 1

- SEM_RULES_INDEX_INFOビュー 1

- ESCAPE_CLOB_TERMプロシージャ 1

- ESCAPE_CLOB_VALUEプロシージャ 1

- ESCAPE_RDF_TERMプロシージャ 1

- ESCAPE_RDF_VALUEプロシージャ 1

- 例

- Java (Oracle Technology Network) 1

- PL/SQL 1

- EXPORT_ENTAILMENT_STATSプロシージャ 1

- EXPORT_MODEL_STATSプロシージャ 1

- EXPORT_NETWORK_STATSプロシージャ 1

- EXPORT_RDFVIEW_MODELプロシージャ 1

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

- 外部ドキュメント

- 索引付け 1

- 外部表

- 作成 1

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

- RDFCTX_POLICIESビュー 1

- エクストラクタ

- 情報

- ポリシー 1

F

- 失敗の状態

- ルールベースまたは伴意 1

- フェデレーテッド問合せ 1 2

- フィルタ

- SEM_MATCHの属性 1 2

- FINAL_VALUE_HASH

- SEM_MATCHの問合せオプション 1

- FINAL_VALUE_NL

- SEM_MATCHの問合せオプション 1

- ファンクション

- ユーザー定義 1

G

- GATE (General Architecture for Text Engineering)

- Java実装のサンプル 1

- 使用 1

- GATHER_STATSプロシージャ 1

- General Architecture for Text Engineering (GATE)

- Java実装のサンプル 1

- 使用 1

- ジオメトリ・リテラル 1

- GET_CHANGE_TRACKING_INFOプロシージャ 1

- GET_INC_INF_INFOプロシージャ 1

- GET_MODEL_IDファンクション 1

- GET_MODEL_NAMEファンクション 1

- GET_TRIPLE_IDファンクション 1

- GETV$DATETIMETZVAL関数 1

- GETV$DATETZVAL関数 1

- GETV$NUMERICVAL関数 1

- GETV$STRINGVAL関数 1

- GETV$TIMETZVAL関数 1

- グローバル接頭辞(BASEキーワード) 1

- GRAPH_MATCH_UNNAMED=T

- SEM_MATCHの問合せオプション 1

- グラフ

- SEM_MATCHの属性 1

H

- HINT0

- SEM_MATCHの問合せオプション 1

- HTTP_METHOD=POST_PAR

- SEM_MATCHの問合せオプション 1

I

- IMPORT_ENTAILMENT_STATSプロシージャ 1

- IMPORT_MODEL_STATSプロシージャ 1

- IMPORT_NETWORK_STATSプロシージャ 1

- 増分推論

- 無効化 1

- 有効 1

- 増分推論

- 情報の取得 1

- index_status

- SEM_MATCHの属性 1 2

- inf_ext_user_func_nameパラメータ 1

- 推論

- ユーザー定義 1

- 情報エクストラクタ 1

- inverseOfキーワード

- セマンティク索引の強制的使用を目的とした 1

- IS_TRIPLE関数 1

J

- Javaの例

- GATEリスナー 1

- OTN RDFセマンティク・グラフのページ 1

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

- 結合プッシュ・ダウン 1

- JSON形式のサポート 1

L

- リテラル

- データ型 1

- LOAD_INTO_STAGING_TABLEプロシージャ 1

- セマンティク・データのロード

- バルク 1、2

- LOOKUP_ENTAILMENTプロシージャ 1

M

- MAINT_VPD_METADATAプロシージャ 1

- MAINTAIN_TRIPLESプロシージャ 1

- 一致パターン 1

- mdsys.SemContent索引タイプ 1

- MERGE_MODELSプロシージャ 1

- メタデータ

- セマンティック 1

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

- セマンティク・データのメソッド 1

- モデルID

- 取得 1

- モデル名

- 取得 1

- モデル

- 変更 1

- 作成 1

- 削除 1

- データベースのサポートの無効化 1

- データベースのサポートの有効化 1

- マージ 1

- 名前変更 1

- SEM_MODELSデータ型 1

- SEMI_entailment-nameビュー 1

- SEMM_model-nameビュー 1

- 名前の交換 1

- 仮想 1

N

- named_graphs

- SEM_MATCHの属性 1

- 名前付きグラフ・ベースの推論

- グローバル 1

- ローカル 1

- 名前付きグラフ

- サポート 1

- ネットワーク索引

- 情報のリフレッシュ 1

- SEM_NETWORK_INDEX_INFOビュー 1

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

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

- N-Quad形式 1

- N-QUADSデータ形式 1

- N-Triple形式 1

O

- OBIEE

- XMLデータソースとしてのSPARQL Gatewayの使用 1

- オブジェクト 1

- ODCIAggregateインタフェース

- ユーザー定義の集計(RDFセマンティク・グラフ) 1

- ogcf

- boundary関数 1

- buffer関数 1

- convexHull関数 1

- difference関数 1

- distance関数 1

- envelope関数 1

- getSRID関数 1

- intersection関数 1

- relate関数 1

- sfContains関数 1

- sfCrosses関数 1

- sfDisjoint関数 1

- sfEquals関数 1

- sfIntersects関数 1

- sfOverlaps関数 1

- sfTouches関数 1

- sfWithin関数 1

- symDifference関数 1

- union関数 1

- OLTP圧縮 1

- OLTP索引の圧縮 1

- options

- SEM_MATCHの属性 1

- Oracle Advanced Compression

- OLTP圧縮 1

- Oracle Business Intelligence Enterprise Edition (OBIEE)

- XMLデータソースとしてのSPARQL Gatewayの使用 1

- Oracle Label Security (OLS)

- ポリシーの適用 1、2

- ポリシーの無効化 1

- ポリシーの有効化 1

- ポリシーの削除 1 2

- モデルに関連付けられたラベルのリセット 1

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

- トリプルの主語や目的語の位置で使用される場合があるリソースへの機密性ラベルの設定 1

- 述語への機密性ラベルの設定 1

- ルールベースに属するルールに対する機密性ラベルの設定 1

- RDFSスキーマ要素への機密性ラベルの設定 1

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

- RDFデータでの使用 1

- Oracle Spatial and Graph

- RDFおよびOWLの機能の前提条件ソフトウェア 1

- orageo

- area関数 1

- buffer関数 1

- centroid関数 1

- convexHull関数 1

- difference関数 1

- distance関数 1

- intersection関数 1

- length関数 1

- mbr関数 1

- nearestNeighbor関数 1

- relate関数 1

- union関数 1

- withinDistance関数 1

- xor関数 1

- OTNページ

- RDFセマンティク・グラフ 1

- owl

- sameAs

- SEMCL_entailment-nameビュー 1

- OWL

- SEM_DISTANCE補助演算子を使用した問合せ 1

- SEM_RELATED演算子を使用した問合せ 1

- SameAs

- 推論の最適化 1

- OWL2ELルールベース 1

- OWL 2 ELサポート 1

- OWL2RLルールベース 1

- OWL 2 RLサポート 1

P

- パラレル推論 1

- パーティショニング

- RDFおよびOWL向けに有効化 1

- PelletInfGraphクラス

- RDF Semantic Graph support for Apache Jenaでの非推奨サポート 1

- PRIVILEGE_ON_APP_TABLESプロシージャ 1

- PROCAVFH=Fオプション 1

- PROCSVFH=Fオプション 1

- プロパティ 1

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

- プロパティ・パス

- RDF Semantic Graph support for Apache Jenaでの最適化された処理 1

- PURGE_UNUSED_VALUESプロシージャ 1

Q

- 検索の品質 1

- 問合せ

- SEM_DISTANCE補助演算子の使用 1

- SEM_MATCHテーブル・ファンクションの使用 1

- SEM_RELATED演算子の使用 1

R

- RDF_VALUE$表 1

- RDF$ET_TAB表 1

- RDFa

- prepareBulkでのサポート(RDF Semantic Graph support for Apache Jena) 1

- RDFCTX_INDEX_EXCEPTIONSビュー 1

- RDFCTX_POLICIESビュー 1

- RDFOLS_SECURE_RESOURCEビュー 1

- RDFルールベース

- RDFSルールベースのサブセット 1

- RDFセマンティク・グラフ

- 概要 1

- RDFセマンティク・グラフのサポート

- 削除 1

- RDF Semantic Graph support for Apache Jena

- SPARQL問合せでサポートされるファンクション 1

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

- 処理の最適化またはプロパティ・パス 1

- 問合せの例 1

- prepareBulkでのRDFaのサポート 1

- SEM_MATCHおよびRDF Semantic Graph support for Apache Jenaの問合せの比較 1

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

- SPARQLサービスの設定 1

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

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

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

- RDF Semantic Graph support for OpenRDF Sesame

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

- パフォーマンスに関する推奨事項 1

- 問合せの例 1

- SEM_MATCHおよびRDF Semantic Graph support for OpenRDF Sesameの問合せの比較 1

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

- SPARQLエンドポイントの設定 1

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

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

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

- RDFS伴意ルール 1

- RDFSルールベース

- RDFS伴意ルールの実装 1

- RDFビュー

- 作成 1

- 削除 1

- エクスポート 1

- RDFVPD_MODELSビュー 1

- RDFVPD_POLICIESビュー 1

- RDFVPD_POLICY_CONSTRAINTSビュー 1

- RDFVPD_PREDICATE_MDATAビュー 1

- RDFVPD_RESOURCE_RELビュー 1

- REFRESH_SEM_NETWORK_INDEX_INFOプロシージャ 1

- RDFとしてのリレーショナル・データ 1

- REMOVE_DUPLICATESプロシージャ 1

- REMOVE_OLS_POLICYプロシージャ 1

- REMOVE_POLICY_FROM_APP_TABプロシージャ 1

- REMOVE_VPD_POLICYプロシージャ 1

- RDFセマンティク・グラフの削除 1

- RENAME_ENTAILMENTプロシージャ 1

- RENAME_MODELプロシージャ 1

- REPLACE=Tオプション 1

- RESET_MODEL_LABELSプロシージャ 1

- Resource Description Framework

- 関連項目: RDFセマンティク・グラフ

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

- resultsPerPageパラメータ 1

- ルールベース

- SEM_MATCHの属性 1

- 失敗の状態にある場合の削除 1

- SEM_RULEBASE_INFOビュー 1

- SEM_RULEBASESデータ型 1

- SEMR_rulebase-nameビュー 1

- ルール 1

- ルール索引

- 関連項目: 伴意

S

- sameAs

- 推論の最適化(OWL) 1

- sameTerm組込み関数 1

- sdo_rdf_internal.convert_old_rdf_dataプロシージャ 1

- SDO_RDF_TERM_LISTデータ型 1

- SDO_RDF_TERMデータ型 1

- sdordfwm_rm.sqlスクリプト 1

- sdordfwm.sqlスクリプト 1

- 検索

- 品質 1

- セキュリティ上の考慮点 1

- SEM_ALIASデータ型 1 , 2

- SEM_ALIASESデータ型 1 , 2

- SEM_APISパッケージ

- ADD_DATATYPE_INDEX 1

- ADD_SEM_INDEX 1

- ALTER_DATATYPE_INDEX 1

- ALTER_ENTAILMENT 1

- ALTER_MODEL 1

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

- 伴意での変更 1

- ALTER_SEM_INDEX_ON_MODEL 1

- ANALYZE_ENTAILMENT 1

- ANALYZE_MODEL 1

- BULK_LOAD_FROM_STAGING_TABLE 1

- CLEANUP_FAILED 1

- COMPOSE_RDF_TERM 1

- CREATE_ENTAILMENT 1

- CREATE_RDFVIEW_MODEL 1

- CREATE_RULEBASE 1

- CREATE_SEM_MODEL 1

- CREATE_SEM_NETWORK 1

- CREATE_SOURCE_EXTERNAL_TABLE 1

- CREATE_VIRTUAL_MODEL 1

- DELETE_ENTAILMENT_STATS 1

- DELETE_MODEL_STATS 1

- DISABLE_CHANGE_TRACKING 1

- DISABLE_INC_INFERENCE 1

- DROP_DATATYPE_INDEX 1

- DROP_ENTAILMENT 1

- DROP_RDFVIEW_MODEL 1

- DROP_RULEBASE 1

- DROP_SEM_INDEX 1

- DROP_SEM_MODEL 1

- DROP_SEM_NETWORK 1

- DROP_USER_INFERENCE_OBJS 1

- DROP_VIRTUAL_MODEL 1

- ENABLE_CHANGE_TRACKING 1

- ENABLE_INC_INFERENCE 1

- ESCAPE_CLOB_TERM 1

- ESCAPE_CLOB_VALUE 1

- ESCAPE_RDF_TERM 1

- ESCAPE_RDF_VALUE 1

- EXPORT_ENTAILMENT_STATS 1

- EXPORT_MODEL_STATS 1

- EXPORT_RDFVIEW_MODEL 1

- GET_CHANGE_TRACKING_INFO 1

- GET_INC_INF_INFO 1

- GET_MODEL_ID 1

- GET_MODEL_NAME 1

- GET_TRIPLE_ID 1

- GETV$DATETIMETZVAL 1

- GETV$DATETZVAL 1

- GETV$NUMERICVAL 1

- GETV$STRINGVAL 1

- GETV$TIMETZVAL 1

- IMPORT_ENTAILMENT_STATS 1

- IMPORT_MODEL_STATS 1

- LOAD_INTO_STAGING_TABLE 1

- LOOKUP_ENTAILMENT 1

- MERGE_MODELS 1

- PRIVILEGE_ON_APP_TABLES 1

- PURGE_UNUSED_VALUES 1

- リファレンス情報 1

- REFRESH_SEM_NETWORK_INDEX_INFO 1

- REMOVE_DUPLICATES 1

- RENAME_ENTAILMENT 1

- RENAME_MODEL 1

- SET_ENTAILMENT_STATS 1

- SET_MODEL_STATS 1

- SWAP_NAMES 1

- TRIPLE 1

- UNESCAPE_CLOB_TERM 1

- UNESCAPE_CLOB_VALUE 1

- UNESCAPE_RDF_TERM 1

- UNESCAPE_RDF_VALUE 1

- VALIDATE_ENTAILMENT 1

- VALIDATE_MODEL 1

- VALUE_NAME_PREFIX 1

- SEM_CONTAINS_COUNT補助演算子

- 構文 1

- SEM_CONTAINS_SELECT補助演算子

- 構文 1

- 問合せでの使用 1

- SEM_CONTAINS演算子

- 構文 1

- SEM_DISTANCE補助演算子 1

- SEM_DTYPE_INDEX_INFOビュー 1

- SEM_GRAPHSデータ型 1

- SEM_INDEXTYPE索引タイプ 1

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

- SEM_MODEL$ビュー

- 仮想モデル・エントリ 1

- SEM_MODELSデータ型 1

- SEM_NETWORK_INDEX_INFOビュー 1

- SEM_OLSパッケージ

- APPLY_POLICY_TO_APP_TAB 1

- REMOVE_POLICY_FROM_APP_TAB 1

- SEM_PERFパッケージ

- DELETE_NETWORK_STATS 1

- EXPORT_NETWORK_STATS 1

- GATHER_STATS 1

- IMPORT_NETWORK_STATS 1

- SEM_RDFCTXパッケージ

- ADD_DEPENDENT_POLICY 1

- CREATE_POLICY 1

- DROP_POLICY 1

- MAINTAIN_TRIPLES 1

- リファレンス情報 1

- SET_DEFAULT_POLICY 1

- SET_EXTRACTOR_PARAM 1

- SEM_RDFSAパッケージ

- ADD_VPD_CONSTRAINT 1

- APPLY_OLS_POLICY 1

- APPLY_VPD_POLICY 1

- CREATE_VPD_POLICY 1

- DELETE_VPD_CONSTRAINT 1

- DISABLE_OLS_POLICY 1

- DROP_VPD_POLICY 1

- ENABLE_OLS_POLICY 1

- MAINT_VPD_METADATA 1

- リファレンス情報 1 , 2

- REMOVE_OLS_POLICY 1

- REMOVE_VPD_POLICY 1

- RESET_MODEL_LABELS 1

- SET_PREDICATE_LABEL 1

- SET_RDFS_LABEL 1

- SET_RESOURCE_LABEL 1

- SET_RULE_LABEL 1

- SEM_RELATED演算子 1

- SEM_RULEBASE_INFOビュー 1

- SEM_RULEBASESデータ型 1

- SEM_RULES_INDEX_DATASETSビュー 1

- SEM_RULES_INDEX_INFOビュー 1

- SEM_VMODEL_DATASETSビュー 1

- SEM_VMODEL_INFOビュー 1

- セマンティク・データ

- 空白ノード 1

- コンストラクタ 1

- データ型 1

- デモ・ファイル 1

- 例(Java) 1

- 例(PL/SQL) 1

- データベース内 1

- メタデータ 1

- メタデータ表およびビュー 1

- メソッド 1

- モデル化 1

- オブジェクト 1

- プロパティ 1

- SEM_MATCHテーブル・ファンクションを使用した問合せ 1

- セキュリティ上の考慮点 1

- 文 1

- 使用するための手順 1

- 主語 1

- セマンティク索引

- 作成(MDSYS.SEM_INDEXTYPE) 1

- ドキュメントの索引付け 1

- ドキュメントでの使用 1

- セマンティク索引

- RDFCTX_INDEX_EXCEPTIONSビュー 1

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

- 追加 1

- モデルでの変更 1

- 削除 1

- 使用 1

- セマンティク・テクノロジのサポート

- リリース11.1へのダウングレード 1

- 有効 1

- リリース11.1からのアップグレード 1

- SEMCL_entailment-nameビュー 1

- SemContent

- mdsys.SemContent索引タイプ 1

- SEMI_entailment-nameビュー 1

- SEMM_model-nameビュー 1

- SEMR_rulebase-nameビュー 1

- semrelod.sqlスクリプト 1

- semrelod111.sqlスクリプト 1

- semremov.sqlスクリプト 1

- SERVICE_CLOB=f

- SEM_MATCHの問合せオプション 1

- SERVICE_ESCAPE=f

- SEM_MATCHの問合せオプション 1

- SERVICE_JPDWN=t

- SEM_MATCHの問合せオプション 1

- SERVICE_PROXY

- SEM_MATCHの問合せオプション 1

- SET_DEFAULT_POLICYプロシージャ 1

- SET_ENTAILMENT_STATSプロシージャ 1

- SET_EXTRACTOR_PARAMプロシージャ 1

- SET_MODEL_STATSプロシージャ 1

- SET_PREDICATE_LABELプロシージャ 1

- SET_RDFS_LABELプロシージャ 1

- SET_RESOURCE_LABELプロシージャ 1

- SET_RULE_LABELプロシージャ 1

- Simple Knowledge Organization System (SKOS)

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

- サポート 1

- SKOS (Simple Knowledge Organization System)

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

- サポート 1

- SNOMED CT (Systematized Nomenclature of Medicine - Clinical Terms)

- サポート 1

- SPARQL

- サービスの構成 1 , 2 , 3

- 問合せ処理の最適化 1

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

- RDF Semantic Graph support for Apache Jenaのサービスの設定 1

- RDF Semantic Graph support for OpenRDF Sesameのサービスの設定 1

- SPARQLエンドポイント

- HTTP基本認証によるアクセス 1

- SPARQL Gateway

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

- 機能および利点の概要 1

- インストールおよび構成 1

- Java API 1

- SPARQL問合せのベスト・エフォートの指定 1

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

- SPARQL問合せのタイムアウト値の指定 1

- OBIEEへのXMLデータソースとしての使用 1

- セマンティク・データでの使用 1

- SPARQL SERVICE

- フェデレーテッド問合せ 1

- 結合プッシュ・ダウン 1

- SILENTキーワード 1

- プロキシ・サーバーの使用 1

- Spatial and Graph

- RDFおよびOWLの機能の前提条件ソフトウェア 1

- 空間のサポート

- ogcf

- boundary関数 1

- buffer関数 1

- convexHull関数 1

- difference関数 1

- distance関数 1

- envelope関数 1

- getSRID関数 1

- intersection関数 1

- relate関数 1

- sfContains関数 1

- sfCrosses関数 1

- sfDisjoint関数 1

- sfEquals関数 1

- sfIntersects関数 1

- sfOverlaps関数 1

- sfTouches関数 1

- sfWithin関数 1

- symDifference関数 1

- union関数 1

- orageo

- area関数 1

- buffer関数 1

- centroid関数 1

- convexHull関数 1

- difference関数 1

- distance関数 1

- intersection関数 1

- length関数 1

- mbr関数 1

- nearestNeighbor関数 1

- relate関数 1

- union関数 1

- withinDistance関数 1

- xor関数 1

- ステージング表

- データのロード 1

- データのロード 1

- セマンティク・データのバルク・ロードのためのステージング表 1

- 文

- RDF_VALUE$表 1

- 統計

- RDFおよびOWLに関する統計の収集 1

- STRICT_AGG_CARD=T

- SEM_MATCHの問合せオプション 1

- 主語 1

- サブプロパティ・チェーン 1

- SWAP_NAMESプロシージャ 1

- Systematized Nomenclature of Medicine - Clinical Terms (SNOMED CT)

- サポート 1

T

- タイムアウト値

- SPARQL問合せの指定 1

- TriGデータ形式 1

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

- トリプル

- 挿入のためのコンストラクタ 1

- 重複チェック 1

- IS_TRIPLE関数 1

U

- UNESCAPE_CLOB_TERMプロシージャ 1

- UNESCAPE_CLOB_VALUEプロシージャ 1

- UNESCAPE_RDF_TERMプロシージャ 1

- UNESCAPE_RDF_VALUEプロシージャ 1

- RDFセマンティク・グラフ・サポートの削除 1

- 未使用値

- セマンティク・ネットワークからのパージ 1

- アップグレード

- リリース11.1からのセマンティク・テクノロジ・サポート 1

- URI接頭辞

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

- URIPREFIXキーワード 1

- ユーザー定義の集計 1

- ユーザー定義関数 1

- ユーザー定義の推論 1

- ユーザー定義の推論関数 1

- ユーザー定義の問合せ 1

V

- VALIDATE_ENTAILMENTプロシージャ 1

- VALIDATE_MODELプロシージャ 1

- VALUE_NAME_PREFIXファンクション 1

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

- ビュー

- RDF

- 作成 1

- 削除 1

- エクスポート 1

- 仮想モデル

- SEM_MODEL$ビュー・エントリ 1

- SEM_VMODEL_DATASETSビュー 1

- SEM_VMODEL_INFOビュー 1

- RDF Semantic Graph support for Apache Jenaでのサポート 1

- RDF Semantic Graph support for OpenRDF Sesameでのサポート 1

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

- 制約の追加 1

- ポリシーの適用 1

- ポリシーの作成 1

- 制約の削除 1

- ポリシーの削除 1

- メタデータの保持 1

- ポリシーの削除 1

- RDFデータでの使用 1

- 仮想プライベート・データベース(VPD) 1 , 2 , 3 , 4 , 5

W

- Workspace Manager

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

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

- ワークスペースのマージおよびリフレッシュ 1

- RDFデータに対するサポートの削除 1

- RDFデータに関する制限事項および考慮事項 1

- バージョン対応モデルに関する制限事項 1

- 使用フローの例 1

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

- ワークスペース

- マージとリフレッシュ 1

X

- XSLTファイル

- SPARQL Gateway用のデフォルトのカスタマイズ 1

Oracleの法律上の注意点

コピーライト

Copyright © 1994-2017, Oracle and/or its affiliates. All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

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

保証免責

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

制限付権利について

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

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 Corporationおよびその関連会社は一切の責任を負いかねます。

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

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

第三者のコンテンツ、製品、サービスに対する免責事項

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

Pre-General Availability (一般提供前)版のドキュメントについて

このドキュメントがPre-General Availability (一般提供前)版の場合:

このドキュメントはPre-General Availability (一般提供前)版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のPre-General Availability (一般提供前)版のドキュメントについて

このドキュメントが非公開のPre-General Availability (一般提供前)版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のPre-General Availability Trial Agreement (Pre-GAトライアル契約)のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle Partner Network Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

ドキュメントのアクセシビリティ

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

Oracle Supportへのアクセス

サポートをご契約のお客様には、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)を参照してください。