2021年12月9日木曜日

Oracle RDF Graph ServerをAutonomous Databaseで使用する(3) - SQL変換

 Oracle RDF Graph Serverを使って、マニュアルに記載されているAutonomous Databaseの制限を回避しようと試みました。こちらの記事で行っている作業です。マニュアルに載っている家系の情報から、子および孫を検索するSPARQLの文をSQLに変換します。そして、そのSQLとバインド変数を使って子および孫を検索する、というものです。

以下のように、対応できた作業と出来なかった作業があります。

  1. 追加したルールセットを含めたEntailmentが作成できない
  2. SPARQLのルールベース指定は仮想モデルで対応する

行った作業について記録しておきます。

Autonomous DatabaseでのOracle Graphの制限についての記載は以下です。

Using Oracle Autonomous Database on Shared Exadata Infrastructure

13 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を作成します。


作成したモデルFAMILYOpenし、SPARQLUpdateを実行します。

最初にスキーマを定義するスクリプトを実行します。


続いてインスタンスを登録するスクリプトを実行します。




以上でモデルの準備はできました。

新規にルールベースを作成します。Rulebasesで右クリックをしメニューを表示させ、Createを実行します。


Rulebaseとしてfamily_rbを入力し、OKをクリックします。これでfamily_rbというルールベースが作成されます。


Rulebasesを開き、新たに作成されたFAMILY_RBを選択します。右クリックでメニューを表示させ、Openを実行します。


FAMILY_RBRulesを選択し、Createをクリックします。


Rule Editorが開くので以下を入力し、OKをクリックします。

Name: grandparent_rule
Antecedents: (?x :parentOf ?y) (?y :parentOf ?z)
Filter: 指定なし
Consequents: (?x :grandParentOf ?z)
Aliases: SEM_ALIASES(SEM_ALIAS('','http://www.example.org/family/'))


ルールベースFAMILY_RBにルールgrandparent_ruleが作成されました。

Entailmentを作成します。

Entailments上で右クリックをしてメニューを表示させます。Createを実行します。


最初にGeneralな情報としてEntailment(の名前)にrdfs_rix_familyを入力します。NextをクリックしてModelsの指定に移動します。


モデルとしてFAMILYを選択します。SelectedONにし、NextをクリックしてRulebasesへ移動します。


RulebasesよりFAMILY_RBを選択します。


下にスクロールして、RDFSを選択します。NextをクリックしてSummaryへ移ります。


Summaryの画面でOKをクリックします。


以下のエラーが発生します。

ORA-13199: JAVAVM is not installed


これまでの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_FAMILYOpenして確認すると、STATUSFAILEDになっています。


あくまでAutonomous Databaseの制限なので、オンプレのOracle DatabaseなどであればGUIよりEntailmentを作成できるでしょう。また、カスタムのルールセットを含まない場合(この例ではFAMILY_RBを含まない)は、Entailmentの作成は成功します。


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


ダイアログが開くので、作成するVirtual model(の名前)としてVFAMILYを入力します。Nextをクリックします。


モデルの指定を行います。本来であれば、ここでモデルFAMILYを選択し、Nextをクリックします。


ルールベースとしてFAMILY_RBと(スクリーンショットには表示されていませんが、下にスクロールして)RDFSを選択します。Nextをクリックします。


確認の画面が表示されるので、OKをクリックすると仮想モデルVFAMILYが作成されます。



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


Cache DetailsよりSQLを参照します。このSQLはデータベースで直接実行できます。


孫を検索する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のアプリケーション作成の参考になれば幸いです。