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

Oracle Databaseセマンティク・データ・ストアへのアクセスのデフォルト制御は、モデル・レベルであり、モデルの所有者は、RDFM_<model_name>という名前のビューで適切な権限を付与することによって、他のユーザーにそのモデルでの選択、削除および挿入の権限を付与することができます。ただし、厳密なセキュリティ要件を持つアプリケーションの場合は、Oracle DatabaseのOracle Label Securityオプションを使用して、ファイングレイン・アクセス制御メカニズムを実施できます。

RDFデータのOracle Label Security (OLS)によって、RDFモデルに格納された個々のトリプルに機密性ラベルを関連付けることができます。問合せごとに、それらのラベルとユーザーのセッション・ラベルを比較することで、特定のトリプルに対するアクセス権限が付与されます。このトリプルレベル・セキュリティ・オプションによって、Oracle Databaseによるラベル・セキュリティのネイティブ・サポートに加え、RDF固有の機能のThinレイヤーが提供されます。

OLSの使用方法の詳細は、『Oracle Label Security管理者ガイド』を参照してください。

6.1 トリプルレベル・セキュリティ

トリプルレベル・セキュリティ・オプションによって、Oracle Databaseによるラベル・セキュリティのネイティブ・サポートに加え、RDF固有の機能のThinレイヤーが提供されます。

トリプルレベル・セキュリティを使用するには、SEM_RDFSA.APPLY_OLS_POLICYプロシージャの実行時に、rdfsa_optionsパラメータ値としてSEM_RDFSA.TRIPLE_LEVEL_ONLYを指定します。たとえば、次のようにします。

EXECUTE sem_rdfsa.apply_ols_policy('defense', SEM_RDFSA.TRIPLE_LEVEL_ONLY, network_owner=>'FGAC_ADMIN', network_name=>'OLS_NET');

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',
  null, null, ‘FGAC_ADMIN’, 'OLS_NET'));

前述の例のフィルタ処理は、ネイティブOLSソフトウェアによって実行されるセキュリティ・チェックに追加して発生します。

トリプルが挿入された後に、セマンティク・モデルのアプリケーション表のCTXT1列を使用してラベル情報を表示および更新できます(ラベルを変更するためのWRITEUPおよびWRITEDOWN権限を持っていることが前提です)。

トリプルレベル・セキュリティで推論またはバルク・ロードを実行できるユーザーの制限はなく、推論またはバルク・ロードされたトリプルは、すべてユーザーのセッション行ラベルで挿入されます。SA_UTLパッケージを使用してセッション・ラベルを変更できることに注意してください。(SA_UTLの詳細は、Oracle Label Security管理者ガイドを参照してください。)

6.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つあります。

この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,'',network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET');

ここで、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', network_owner=>'FGAC_ADMIN', network_name=>'OLS_NET');

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', network_owner=>'FGAC_ADMIN', network_name=>'OLS_NET');

これらのすべてのアクションを実行すると、推論グラフは様々なラベルがタグ付けされたトリプルで構成される可能性があります。

ラダーベース推論(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',
  network_owner=>'FGAC_ADMIN',
  network_name=>'OLS_NET'
);

パラメータols_ladder_inf_lbl_seqでは、ラベル順序が指定されます。この順序は、数値ラベルのスペース区切りリストとして提供されます。LBIを使用する場合は、弱い方のラベルが強い方のラベルより前に配置されるように、ラベル順序を配置することをお薦めします。これは、推論されたグラフのサイズを減らすことになります。(ラベルが互いに優位ではない場合、それらはどのような順序でも指定できます。)

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

この項では、セマンティク・データにOLSトリプルレベル・セキュリティを適用する方法を説明する拡張例を示します。OLSが構成済で、有効であることが前提です。この例は非常に単純化されており、推奨のプラクティスで使用しているユーザー名およびパスワードをそのまま使用しないでください。

特に指定がないかぎり、このステップはSYSDBAとして接続中に実行します。

  1. いくつかの必要な設定ステップを実行します。

    1. 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;
      
    2. SYSDBAとして、セキュリティ管理者を作成し、権限を付与します。

      CREATE USER fgac_admin identified by <password-for-fgac_admin>; 
      GRANT connect, unlimited tablespace,resource to fgac_admin;
      
      -- Needed to administer OLS on a shared schema-private network
      GRANT execute on MDSYS.SEM_RDFSA to fgac_admin;
      GRANT exempt access policy to fgac_admin;
      
      -- Needed to administer an OLS policy
      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;
      
    3. SYSTEMとして接続し、共有権限を持つセキュリティ管理者が所有するスキーマプライベート・セマンティク・ネットワークを作成します。

      CONNECT system/<password-for-system>;
      EXECUTE sem_apis.create_sem_network('tbs_3',network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET');
      EXECUTE sem_apis.grant_network_sharing_privs('FGAC_ADMIN');
      
    4. セキュリティ管理者として接続し、ユーザーa、bおよびcのネットワーク共有を設定します。

      CONNECT fgac_admin/<password-for- fgac_admin>;
      EXECUTE sem_apis.enable_network_sharing(network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET');
      EXECUTE sem_apis.grant_network_access_privs(network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET', network_user=>'A');
      EXECUTE sem_apis.grant_network_access_privs(network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET', network_user=>'B');
      EXECUTE sem_apis.grant_network_access_privs(network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET', network_user=>'C');
      
    5. セキュリティ管理者として接続し、defenseという名前のポリシーを作成します。

      CONNECT fgac_admin/<password-for-fgac_admin>;
      EXECUTE SA_SYSDBA.CREATE_POLICY('defense','ctxt1');
      
    6. 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');
      
    7. 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');
      
    8. ラベルおよび権限を割り当てます。

      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. セマンティク・モデルを作成します。

    1. モデルを作成し、他の何人かのユーザーとそれを共有します。

      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' ,network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET');
      GRANT select on fgac_admin.ols_net#rdfm_project to B;
      GRANT select on fgac_admin.ols_net#rdfm_project to C;
      GRANT select, insert, update, delete on project_tpl to B, C;
      
    2. バルク・ロードAPIを実行できることを確認します。

      GRANT insert on project_tpl to fgac_admin;
      
  3. RDFのOLSポリシーを適用します。

    CONNECT fgac_admin/<password-for-fgac_admin>
    BEGIN
      sem_rdfsa.apply_ols_policy('defense', sem_rdfsa.TRIPLE_LEVEL_ONLY,network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET');
    END;
    /
    
    /

    この時点で、アプリケーション表にCTXT1という名前の別の列があることに注目してください。

    CONNECT a/<password-for-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
    connect a/<password-for-a> 
    INSERT INTO project_tpl(triple) values      (sdo_rdf_triple_s('project','<urn:A>','<urn:hasManager>','<urn:B>','FGAC_ADMIN','OLS_NET')); 
    INSERT INTO project_tpl(triple) values      (sdo_rdf_triple_s('project','<urn:B>','<urn:hasManager>','<urn:C>','FGAC_ADMIN','OLS_NET'));
    INSERT INTO project_tpl(triple) values       (sdo_rdf_triple_s('project','<urn:A>','<urn:expenseReportAmount>','"100"','FGAC_ADMIN','OLS_NET'));
    INSERT INTO project_tpl(triple) values       (sdo_rdf_triple_s('project','<urn:expenseReportAmount>','rdfs:subPropertyOf','<urn:projExp>','FGAC_ADMIN','OLS_NET'));
    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 fgac_admin;
    
    -- 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' ,network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET');
    
    -- 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 fgac_admin.ols_net#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) fromfgac_admin.ols_net#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"','FGAC_ADMIN','OLS_NET'));
    INSERT INTO a.project_tpl(triple) values      (sdo_rdf_triple_s('project','<urn:proj1>','<urn:hasBudget>','"10000"','FGAC_ADMIN','OLS_NET'));
    INSERT INTO a.project_tpl(triple) values      (sdo_rdf_triple_s('project:<urn:proj2>','<urn:proj2>','<urn:hasBudget>','"20000"','FGAC_ADMIN','OLS_NET'));
    INSERT INTO a.project_tpl(triple) values      (sdo_rdf_triple_s('project:<urn:proj2>','<urn:proj2>','<urn:dependsOn>','<urn:proj1>','FGAC_ADMIN','OLS_NET'));
    COMMIT;
    
  5. デフォルト・ラベルを使用して、異なるユーザーとしてデータを問い合せます。

    -- Now as user A, B, C, execute the following query 
    select lpad(nvl(g, ' '), 20) || ' ' || s || ' ' || p || ' ' || o from table(sem_match('select * where { graph ?g { ?s ?p ?o }}',
    sem_models('project'),
    null,
    null,
    null,
    null,
    'GRAPH_MATCH_UNNAMED=T',
    null,
    null,
    'FGAC_ADMIN',
    'OLS_NET'))
        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. 異なるラベルを使用して、ユーザーCとして同じデータを問い合せます。
    exec sa_utl.set_label('defense',char_to_label('defense','SE'));
    exec sa_utl.set_row_label('defense',char_to_label('defense','SE'));
    

    前のステップで使用された同じ問合せでは、ラベルがSEに設定された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('select * where { graph ?g { ?s ?p ?o }}',
    sem_models('project'),
    null,
    null,
    null,
    null,
    'MIN_LABEL=SE POLICY_NAME=DEFENSE GRAPH_MATCH_UNNAMED=T',
    null,
    null,
    'FGAC_ADMIN',
    'OLS_NET'))
    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, 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',network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET');

-- Grant select on the model view to users B and C
grant select on fgac_admin.ols_net#rdfm_test to B,C;

-- 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',network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET');

-- 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',network_owner=>'FGAC_ADMIN',network_name=>'OLS_NET');

-- Add a triple as User A
INSERT INTO test_tpl(triple) values
(sdo_rdf_triple_s('test','<urn:A>','<urn:p>','<urn:B>','FGAC_ADMIN','OLS_NET'));
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>','FGAC_ADMIN','OLS_NET'));
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 fgac_admin.ols_net#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 fgac_admin.ols_net#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 fgac_admin.ols_net#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 fgac_admin.ols_net#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 =
             sem_apis.res2vid('FGAC_ADMIN.OLS_NET#RDF_VALUE$','<urn:A>');
 
1 row deleted.