Oracle Databaseセマンティク・データ・ストアに格納されているRDFデータは、Oracle Database 11g Workspace Managerを使用してバージョン対応にすることができます。Workspace Managerを使用すると、データ変更操作によって新しいバージョンのRDFデータを作成する一方で、古いデータのコピーを保持できます。Workspace Managerの使用方法およびリファレンス情報については、『Oracle Database Workspace Manager開発者ガイド』を参照してください。
セマンティク・データ・ストアのバージョニングの単位はモデルで、ユーザー・スキーマに存在するアプリケーション表に順番に関連付けられます。バージョン対応RDFモデルを管理するには、従来のWorkspace Managerインタフェースが使用されます。(ただし、仮想モデルに参加するモデルではバージョン対応を使用できません。仮想モデルの詳細は、1.3.8項を参照してください。)
データベースに最初のバージョン対応RDFモデルを作成すると、すべてのRDFモデルのデータが保持される基礎となるトリプル・ストアで索引が再作成されます。したがって、最初のバージョン対応RDFモデルを作成するために必要な時間は、これらのモデルの既存のデータ量に応じて異なります。
この章では、バージョン対応RDFモデルの主な特性について説明し、例をいくつか示します。この章の内容は次のとおりです。
RDFデータに対するWorkspace Managerサポートは、デフォルトではデータベースにインストールされません。そのため、データベースでセマンティク・テクノロジ・サポートを有効にした後に(A.1項「セマンティク・テクノロジ・サポートの有効化」を参照)、sdordfwm.sql
という名前のスクリプトを実行する必要があります。データベースに対してsdordfwm.sql
を1回のみ実行する必要があります。このスクリプトを実行するには、データベースにSYSDBAとして接続し、使用しているオペレーティング・システムに応じて次の文を入力します。
Linuxの場合: SQL> @$ORACLE_HOME/md/admin/sdordfwm.sql
Windowsの場合: SQL> @%ORACLE_HOME%\md\admin\sdordfwm.sql
Workspace ManagerサポートがRDFデータに対して有効であるかどうかを調べる場合は、次の問合せを入力して、戻された値がINSTALLED
であるかどうかを確認します。
SELECT value FROM mdsys.rdf_parameter WHERE namespace = 'COMPONENT' and attribute = 'RDFOWM';
RDFデータに対するWorkspace Managerサポートを有効にした後に、特定の状況ではそのサポートを削除する必要がある場合があります。たとえば、データベースでセマンティク・テクノロジ・サポートをダウングレードまたは削除する前に、RDFデータに対するWorkspace Managerサポートを削除する必要があります。(セマンティク・テクノロジ・サポートのダウングレードおよび削除の詳細は、付録A「セマンティク・テクノロジ・サポートの有効化、ダウングレードまたは削除」を参照してください。)
RDFデータに対するWorkspace Managerサポートを削除するには、次の手順を実行します。
SYSDBA権限を持つSYSユーザーとしてデータベースに接続します(SYS AS SYSDBAを使用し、SYSアカウントのパスワードを求められたら入力します)。
Linuxの場合: @$ORACLE_HOME/md/admin/sdordfwm_rm.sql
Windowsの場合: @%ORACLE_HOME%\md\admin\sdordfwm_rm.sql
sdordfwm_rm.sql
スクリプトが正常に完了したら、データベースでセマンティク・テクノロジ・サポートをダウングレードまたは削除できます。
RDFモデルをバージョン対応にするには、そこで必要な伴意(ルール索引)を作成し(SEM_APIS.CREATE_ENTAILMENTプロシージャを使用)、その関連するアプリケーション表をバージョン対応にする必要があります。たとえば、contracts
という名前のRDFモデルがCONTRACTS_RDF_DATAという名前のアプリケーション表に関連付けられている場合は、次の例に示すようにバージョンの有効化を実行できます。
begin dbms_wm.enableVersioning (table_name => 'contracts_rdf_data'); end; /
アプリケーション表は主キーを持つ必要があり、HISTORYまたはVALID TIMEオプションを指定できません。
アプリケーション表に格納されるデータおよびセマンティク・データ・ストア内の対応するRDFデータは、論理的にバージョニングされます。バージョン対応アプリケーション表上の標準データ操作(挿入、更新、削除)では、セマンティク・データ・ストア内の影響を受けたアプリケーション表の行および対応するRDFトリプルのバージョン情報が保持されます。SEM_MATCH演算子を使用してRDFデータにアクセスする問合せは、結果セットを構築する場合に、アクティブ・ワークスペースの状態および関連するバージョンのデータを考慮します。
RDFデータを取り扱う場合、頻繁にリフレッシュされるワークスペースおよび複数の親ワークスペースは使用できません。ただし、他のワークスペース操作(新しいワークスペースの作成、セーブポイントの作成、アクセス・モードの設定およびワークスペースのリフレッシュとマージなど)については、予想どおりに進行します。
アプリケーション表の行でWorkspace Managerロックを使用すると、同時ワークスペースでのデータ操作の競合を回避できます。このような場合の競合は、ロックされた行の主キーに基づいて検出され、サブグラフまたはノード上のロックなど、RDFデータで意味のあるロックに直接変換されない場合があります。(バージョン対応RDFデータを含むベスト・プラクティスについては、6.4項を参照してください。)
RDFモデルを使用すると、システム定義およびユーザー定義のルールベースを使用して、推論によって1つ以上の伴意を作成できます。このようなモデルをバージョン対応にすると、推論データを格納する関連伴意もバージョン対応になります。
ただし、論理的にバージョニングされるRDFモデルとは異なり、伴意は物理的にバージョニングされます。したがって、RDFモデルにマージされない変更を持つワークスペースは、伴意のプライベート・バージョンを保持する場合があります(親ワークスペースに対応する伴意にすでに存在する場合がある推論されたトリプルがすべて複製されます)。図6-1に、ワークスペースW1およびW2 (LIVEワークスペースの子ワークスペース)に対して索引のプライベート・コピーが保持される、物理的にバージョニングされた伴意を示します。
有効な伴意を持つ親ワークスペースから作成されたワークスペースは、対応するモデルでいくつかのワークスペース固有のデータ操作が発生するまで、伴意とその親を共有します。ワークスペース内の最初のデータ操作によって、伴意のプライベート・コピーが作成され、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としてマークされます。
バージョン対応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ビューに関する項を参照してください。
この技術を使用して検出されたすべての競合については、競合するデータ変更に対して補正データ操作を実行することで解決できます。
特定のいくつかのセマンティク・テクノロジ機能は、RDFデータ用のWorkspace Managerとは互換性がありません。
次のネットワークレベルの機能は、バージョン対応RDFモデルを含むセマンティク・ネットワーク上ではサポートされません。
RDFデータ用のOracle Label Security (OLS)
RDFデータ用の仮想プライベート・データベース(VPD)
ドキュメントのセマンティク索引付け
SEM_APIS.DROP_SEM_NETWORKとcascade
オプション
次のモデルレベルの機能は、バージョン対応RDFモデルではサポートされません。
例6-1では、異なるワークスペースで伴意をどのように処理できるかを示します。この例では、コメントで個々の操作を説明します。
バージョン対応RDFモデルに関する次の制限事項および考慮事項に注意してください(これらは例6-1に反映されています)。
バージョン対応RDFモデルを含む伴意に対しては、増分推論はサポートされていません。
すでに作成された伴意はSEM_APIS.CREATE_ENTAILMENTをコールすることでVALIDにできますが、RDFモデルに関連するアプリケーション表をバージョン対応にした場合は新しい伴意を作成できません。
SEM_MATCHのパターン引数は、古い(中カッコでない)構文を使用する必要があります。
バージョン対応モデルに関連するSEM_APIS.CREATE_ENTAILMENTの起動では、次のオプションを使用する必要があります('EPT=1
'(またはユーザー定義ルールが使用される場合はoptions => 'USER_RULES=T,EPT=1
'))。
例6-1 セマンティク・モデルのバージョニング
set pagesize 10000 -- 1. Enabling Workspace Manager Support for RDF Data conn / as sysdba @?/md/admin/sdordfwm.sql set echo on column x format a10 column y format a10 column owner format a10 column index_name format a12 column index_view_name format a18 column status format a10 -- create sem network and a test user exec sem_apis.create_sem_network('SYSAUX'); grant connect,resource,unlimited tablespace to rdfuser identified by rdfuser; -- 2. Create table and model: then Insert triples (that will lead to some inferred triples, when entailed) conn rdfuser/rdfuser CREATE TABLE emp_rdf_data(id number,triple sdo_rdf_triple_s); ALTER TABLE emp_rdf_data add CONSTRAINT emp_rdf_data_PK PRIMARY KEY (ID); EXEC SEM_APIS.CREATE_SEM_MODEL('emp0','emp_rdf_data','triple'); insert into emp_rdf_data values (0.1, sdo_rdf_triple_s('emp0','<Man>','rdfs:subClassOf','<Person>')); insert into emp_rdf_data values (0.2, sdo_rdf_triple_s('emp0','<Woman>','rdfs:subClassOf','<Person>')); insert into emp_rdf_data values (1, sdo_rdf_triple_s('emp0','<John>','rdf:type','<Man>')); -- 3. Create entailments: one with user-def rules only and the other with OWL exec sdo_rdf_inference.create_rulebase('family_rb'); insert into mdsys.rdfr_family_rb values ( 'R1', '(?x rdf:type <Man>)', NULL, '(?x rdf:type <Male>)', NULL); insert into mdsys.rdfr_family_rb values ( 'R2', '(?x rdf:type <Woman>)', NULL, '(?x rdf:type <Female>)', NULL); begin sem_apis.create_entailment( index_name_in => 'emp0_u_idx', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('family_rb'), options => 'USER_RULES=T,EPT=1'); end; / begin sem_apis.create_entailment( index_name_in => 'emp0_idx', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('owlprime'), options => 'EPT=1'); end; / select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 4. Activate versioning and re-try the queries EXEC dbms_wm.enableVersioning (table_name => 'emp_rdf_data'); select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 4a. [fail] try to create a post-versioning entailment for testing begin sem_apis.create_entailment( index_name_in => 'emp0_idx_2', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('owl2rl'), options => 'EPT=1'); end; / -- 5. Create Workspace and move into that workspace exec dbms_wm.createworkspace('W1'); exec dbms_wm.gotoWorkspace('W1'); -- 5a. [fail] in this workspace, try to create a post-versioning entailment for testing begin sem_apis.create_entailment( index_name_in => 'emp0_idx_3', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('rdfs'), options => 'EPT=1'); end; / -- 6. Workspace inherits the entailment from LIVE workspace (no physical copy yet) select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 7. Insert some triples => causes LIVE entailments to be copied to this workspace and marked INVALID here insert into emp_rdf_data values (2.1, sdo_rdf_triple_s('emp0','<Mary>','rdf:type','<Woman>')); commit; select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 8. Go back to LIVE workspace to confirm that the LIVE entailments are still VALID disconnect connect rdfuser/rdfuser select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 9. Back to new workspace: make its entailments VALID exec dbms_wm.gotoWorkspace('W1'); begin sem_apis.create_entailment( index_name_in => 'emp0_u_idx', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('family_rb'), options => 'USER_RULES=T,EPT=1'); end; / begin sem_apis.create_entailment( index_name_in => 'emp0_idx', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('owlprime'), options => 'EPT=1'); end; / select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 10. Go back to LIVE workspace to confirm that the entailments there are still VALID disconnect connect rdfuser/rdfuser select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 11. Insert a new row into LIVE model => causes LIVE entailments to become INVALID insert into emp_rdf_data values (3, sdo_rdf_triple_s('emp0','<Gary>','rdf:type','<Man>')); commit; select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 12. Back to new workspace: confirm that its entailment is still VALID exec dbms_wm.gotoWorkspace('W1'); select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 13. Back to LIVE workspace: make the entailments VALID again disconnect connect rdfuser/rdfuser begin sem_apis.create_entailment( index_name_in => 'emp0_u_idx', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('family_rb'), options => 'USER_RULES=T,EPT=1'); end; / begin sem_apis.create_entailment( index_name_in => 'emp0_idx', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('owlprime'), options => 'EPT=1'); end; / select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 14. Insert a new row into LIVE model => causes LIVE entailments to become INCOMPLETE insert into emp_rdf_data values (4, sdo_rdf_triple_s('emp0','<Lory>','rdf:type','<Man>')); commit; select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 15. make the entailments in LIVE workspace VALID again begin sem_apis.create_entailment( index_name_in => 'emp0_u_idx', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('family_rb'), options => 'USER_RULES=T,EPT=1'); end; / begin sem_apis.create_entailment( index_name_in => 'emp0_idx', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('owlprime'), options => 'EPT=1'); end; / select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 16. merge workspace: this should make the LIVE entailments INVALID conn rdfuser/rdfuser exec dbms_wm.mergeWorkspace('W1'); select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- 17. remove workspace exec dbms_wm.removeWorkspace('W1'); -- 18. disable versioning, refresh the INVALID entailments to make them VALID, and then query exec dbms_wm.disableVersioning('emp_rdf_data'); select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; begin sem_apis.create_entailment( index_name_in => 'emp0_u_idx', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('family_rb'), options => 'USER_RULES=T,EPT=1'); end; / begin sem_apis.create_entailment( index_name_in => 'emp0_idx', models_in => SDO_RDF_Models('emp0'), rulebases_in => SDO_RDF_Rulebases('owlprime'), options => 'EPT=1'); end; / select * from mdsys.rdf_rules_index_info; select count(*) from mdsys.rdfi_emp0_u_idx; select x,y from TABLE(SEM_MATCH('(?x rdf:type ?y)',sem_models('emp0'),sem_rulebases('family_rb'),null,null)) order by 1,2; select count(*) from mdsys.rdfi_emp0_idx; select x from TABLE(SEM_MATCH('(?x rdf:type <Person>)',sem_models('emp0'),sem_rulebases('OWLPRIME'),null,null)) order by 1; -- cleanup exec sem_apis.drop_entailment('EMP0_IDX'); exec sem_apis.drop_entailment('EMP0_U_IDX'); exec sem_apis.drop_sem_model('EMP0'); exec sem_apis.drop_rulebase('FAMILY_RB'); drop table emp_rdf_data; conn / as sysdba drop user rdfuser cascade;