プライマリ・コンテンツに移動
Oracle® Spatial and Graph RDFセマンティック・グラフ開発者ガイド
12cリリース1 (12.1)
B72469-07
目次へ移動
目次
索引へ移動
索引

前
次

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モデルの主な特性について説明し、例をいくつか示します。この章の内容は次のとおりです。

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 伴意(ルール索引)の物理的なバージョニング

図6-1の説明が続きます
「図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_NETWORKcascadeオプション

次のモデルレベルの機能は、バージョン対応RDFモデルではサポートされません。

バージョン対応の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;