Oracle RDF Graph Serverを使って、マニュアルに記載されているAutonomous Databaseの制限を回避しようと試みました。こちらの記事で行っている作業です。マニュアルに載っている家系の情報から、子および孫を検索するSPARQLの文をSQLに変換します。そして、そのSQLとバインド変数を使って子および孫を検索する、というものです。
以下のように、対応できた作業と出来なかった作業があります。
- 追加したルールセットを含めたEntailmentが作成できない
- SPARQLのルールベース指定は仮想モデルで対応する
行った作業について記録しておきます。
Autonomous DatabaseでのOracle Graphの制限についての記載は以下です。
Using Oracle Autonomous Database on Shared Exadata Infrastructure13 Using Oracle Graph with Autonomous Database
Oracle Graph Limitations with Autonomous Database
To ensure the security and performance of your database, some Oracle Graph features are restricted:
- SPARQL editor for SQL Developer desktop is not supported
- SEM_MATCH (SPARQL in SQL API), SEM_APIS.UPDATE_MODEL and SEM_APIS.SPARQL_to_SQL are not supported
- Adapter for Eclipse RDF4J is not supported
- Adapter for Apache Jena is not supported
The recommended architecture for using RDF Graphs with Autonomous Database is deployment of Oracle RDF Server and Query UI from OCI Marketplace to run SPARQL queries and other RDF data management operations.
追加したルールセットを含めたEntailmentが作成できない
RDF Graph ServerのDataのページより、Regular modelsとしてFAMILYを作成します。
作成したモデルFAMILYをOpenし、SPARQLのUpdateを実行します。
最初にスキーマを定義するスクリプトを実行します。
続いてインスタンスを登録するスクリプトを実行します。
新規にルールベースを作成します。Rulebasesで右クリックをしメニューを表示させ、Createを実行します。
Rulebaseとしてfamily_rbを入力し、OKをクリックします。これでfamily_rbというルールベースが作成されます。
Rulebasesを開き、新たに作成されたFAMILY_RBを選択します。右クリックでメニューを表示させ、Openを実行します。
Rule Editorが開くので以下を入力し、OKをクリックします。
Antecedents: (?x :parentOf ?y) (?y :parentOf ?z)
Filter: 指定なし
Consequents: (?x :grandParentOf ?z)
Aliases: SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/'))
Entailmentを作成します。
Entailments上で右クリックをしてメニューを表示させます。Createを実行します。
最初にGeneralな情報としてEntailment(の名前)にrdfs_rix_familyを入力します。NextをクリックしてModelsの指定に移動します。
RulebasesよりFAMILY_RBを選択します。
下にスクロールして、RDFSを選択します。NextをクリックしてSummaryへ移ります。
以下のエラーが発生します。
これまでのGUIでの操作は、API呼び出しとしては以下と等価です。
begin
sem_apis.create_entailment(
index_name_in => 'rdfs_rix_family'
, models_in => SEM_Models('FAMILY')
, rulebases_in => SEM_Rulebases('RDFS','FAMILY_RB')
, network_owner=>'APEXDEV'
, network_name=>'NET1'
);
end;
/
どちらでも同じエラーが発生します。Autonomous Databaseではデータベース内でJavaは実行出来ないようになっています。そのため、これはマニュアルに制限事項と明記されていませんが、製品の制限です。
Entailment自体は作成されます。RDFS_RIX_FAMILYをOpenして確認すると、STATUSはFAILEDになっています。
SPARQLのルールベース指定は仮想モデルで対応する
例えばSEM_MATCH関数を使った以下のSQLがあります。
Oracle RDF Graph Serverが提供しているSPARQL Queryを実行する画面は以下です。
SEM_MATCH関数の引数rulebasesにあたる、適用するルールベースの指定が画面から見つかりません。
これは仮想モデル(Virtual Model)を作成することで対応できます。
Autonomous Databaseではカスタムのルールベースを含んだEntailmentの作成ができないので、こちらの記事にある手順でRDFネットワークをData Pumpを使ってインポートしました。インポートしたデータではなぜか作成済みのモデルがRegular Modelsに表示されません。そのため、SEM_APIS.CREATE_VIRTUAL_MODELを呼び出して仮想モデルを作成します。
仮想モデルの名前をVFAMILY、ルールベースかEntailmentのどちらかにより適用される推論ルールを指定します。以下ではEntailmentとしてRDFS_RIX_FAMILYを指定しています。
begin
sem_apis.create_virtual_model(
vm_name => 'VFAMILY'
, models => sem_models('FAMILY')
, rulebases => null
, options => 'REPLACE=T'
, entailments => sem_entailments('RDFS_RIX_FAMILY')
, network_owner => 'APEXDEV'
, network_name => 'NET1'
);
end;
/
Regular modelsからモデルが参照できれば、GUIから仮想モデルの作成が可能です。その場合の手順は以下になります。
Virtual Modelsを選択し右クリックでメニューを表示させ、Createを実行します。
ルールベースとしてFAMILY_RBと(スクリーンショットには表示されていませんが、下にスクロールして)RDFSを選択します。Nextをクリックします。
SPARQLをSQLに変換する
Oracle RDF Graph ServerでSPARQL QueryをSQLに変換します。仮想モデルVFAMILYをオープンします。以下の、子供を一覧するSPARQL問い合わせを実行します。
パラメータが指定されていない - Missing IN or OUT parameter at index:: 1 - とエラーが発生しますが、SPARQLがSQLに変換されていれば良いので、無視します。
Query cacheを開き、実行したSPARQL文のCache Detailsを参照します。
孫を検索するSPARQL文は以下になります。こちらも同様の手順でSQLに変換できます。
この後は、RDFグラフの問合せにバインド変数を使用するの記事と同じ手順により、Oracle APEXのアプリケーションにSQLを組み込むことができました。
仮想モデルVFAMILYとOracle RDF Graph Serverを使って変換したSQLを使うように更新した、Oracle APEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/rdf-query-with-bind-variable2.sql
以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。