9.3 SPARQLのルールベースの推論

RDFグラフの推論の拡張アーキテクチャを使用すると、SPARQLのルールベースの推論を追加できます。

新しいRDFトリプルを推論するための照合条件を指定することで、SPARQL問合せ言語の能力を十分に利用できます。通常の推論の制約とは異なり、このプロセスを使用して作成された推論トリプルには、推論タスク開始前のRDFネットワークにはもともと存在していなかった新しいRDF用語が含まれる場合もあります。

SPARQLの更新のINSERT文を使用して、独自のルールを定義できます。

9.3.1 SPARQLルールの格納

自分の表のVARCHARまたはCLOB型の任意の列に、任意の数の自分のルールを照合オプションおよび更新オプションとともに格納できます。照合オプションと更新オプションは、それぞれSEM_APIS.UPDATE_RDF_GRAPHで使用されるmatch_optionsoptionsと同じです。これらは、SPARQLの更新操作を最適化するヒントに使用されますが、NULLにしてもかまいません。

これらのルールはすべて、SEM_APIS.CREATE_SPARQL_INFERRED_GRAPH APIによる推論時にRDFトリプル・ストアに適用されます。

ユーザー・ルールは、INSERT WHERE (またはINSERT DATA)文として表すことができます。たとえば、次のようにします。

PREFIX ex: <http://my.org/>
INSERT { ?x a ex:Employee }
WHERE  { ?x ex:hours ?hrs FILTER (?hrs >= 40) }

任意ルールの性質上、推論が推移閉包に到達するという保証はありません。したがって、反復の最大数を指定する必要があります。また、RDF推論のベースになっている開世界仮定に、ユーザー・ルールが違反する可能性があります。閉世界仮定(つまりNOT EXISTS)に依存するSPARQL機能を使用すると、推測グラフの結果の一貫性が失われる場合があります。そのため、可能であれば使用を避けてください。

9.3.2 SPARQL推論グラフを作成するためのサンプル・データの設定

SPARQL推測グラフの作成および問合せのワークフローの例で説明する例を実行するには、次のステップに従ってデータベースを準備する必要があります:
  1. DBA権限があるSYSTEMユーザー(またはAutonomous AI DatabaseサーバーレスではADMINユーザー)としてOracle AI Databaseに接続します。
    CONNECT system/<password-for-system-user>
  2. データベース・ユーザーを作成して、RDFネットワークを作成および所有します。
    create user RDFUSER identified by <password_for_rdfuser>;
  3. 必要な権限を新しいデータベース・ユーザーに付与します。
    GRANT CONNECT, RESOURCE, CREATE VIEW, UNLIMITED TABLESPACE TO rdfuser;
  4. rdfuserとしてデータベースに接続します。
    CONNECT rdfuser/<password-for-rdf-user>;
  5. NET1という名前のスキーマ・プライベートRDFネットワークを作成します。
    EXEC SEM_APIS.CREATE_RDF_NETWORK(tablespace_name =>'tbs_3', network_owner=>'RDFUSER', network_name=>'NET1');
  6. RDFネットワークNET1にRDFグラフm1を作成します。
    EXEC SEM_APIS.CREATE_RDF_GRAPH('m1', null, null, network_owner=>'RDFUSER',network_name=>'NET1');
  7. RDFグラフにRDFトリプルを挿入します。
    BEGIN
      SEM_APIS.UPDATE_RDF_GRAPH('m1',
      'PREFIX ex: <http://my.org/>
    	INSERT DATA {
    	  ex:adam ex:hours 20 .
    	  ex:bill ex:hours 25 .
    	  ex:carl ex:hours 30 .
    	  ex:drew ex:hours 35 .
    	  ex:eric ex:hours 40 .
    	}',
      network_owner=>'rdfuser', network_name=>'net1');
    END;
    /
    COMMIT;

9.3.3 SPARQL推論グラフの作成および問合せのワークフローの例

この例では、SPARQLルールの格納、格納済ルールを適用したSPARQL推論グラフの作成、グラフの問合せ、そして最後に推論グラフの削除の各ステップについて説明します。
開始する前に、SPARQL推測グラフを作成するためのサンプル・データの設定の説明に従ってサンプル・データを設定します。
  1. 次のステップに示すように、SPARQLルールを格納します:
    1. SPARQLルールを格納する表を作成します。
      SQL> CREATE TABLE sparql_tab(rule varchar2(4000));
      Table created.
    2. INSERT文を使用してSPARQLルールを定義します。
      SQL> INSERT INTO sparql_tab values ('PREFIX ex: <http://my.org/>
        2  	 INSERT {  ?x a ex:Employee  }
        3  	 WHERE	{  ?x ex:hours ?hrs FILTER (?hrs >= 40)  }');
      
      1 row created.
      
      SQL> INSERT INTO sparql_tab values ('PREFIX ex: <http://my.org/>
        2  	 INSERT {  ?x a ex:Consultant  }
        3  	 WHERE	{  ?x ex:hours ?hrs FILTER (?hrs <= 20)  }');
      
      1 row created.
      
      SQL> INSERT INTO sparql_tab values ('PREFIX ex: <http://my.org/>
        2  	 INSERT {  ?x a ex:PartTimer  }
        3  	 WHERE	{  ?x ex:hours ?hrs FILTER (?hrs > 20 && ?hrs < 40)  }');
      
      1 row created.
      
      SQL> INSERT INTO sparql_tab values ('PREFIX ex: <http://my.org/>
        2  	 INSERT {  ?x ex:similarPartTimerAs ?y	}
        3  	 WHERE	{  ?x a ex:PartTimer ; ex:hours ?xhrs .
        4  		   ?y a ex:PartTimer ; ex:hours ?yhrs .
        5  		   FILTER ( (?x != ?y) && (ABS(?xhrs - ?yhrs) <= 5))  }');
      
      1 row created.
      
      SQL> COMMIT;
      Commit complete

      詳細は、SPARQLルールの格納も参照してください。

  2. SEM_APIS.CREATE_SPARQL_INFERRED_GRAPHプロシージャをコールして、SPARQL推論グラフX1を作成します。
    SQL> EXEC SEM_APIS.CREATE_SPARQL_INFERRED_GRAPH('X1',sem_models('M1'),'rdfuser','sparql_tab','Rule', null, null, 3, network_owner=>'rdfuser',network_name=>'NET1');
    
    PL/SQL procedure successfully completed.
  3. 他の標準推論グラフを問い合せるのと同様に、SPARQL推論グラフを問い合せます。
    たとえば、次の例では、推論トリプルのみを使用してRDFグラフ・コレクションを作成します。
    SQL> EXEC SEM_APIS.CREATE_RDF_GRAPH_COLLECTION('VM_X1_ONLY',inferred_graphs=>SEM_Entailments('X1'),network_owner=>'rdfuser',network_name=>'NET1');
    
    PL/SQL procedure successfully completed.

    SEM_MATCH問合せを使用して、推測グラフの内容を確認できます。

    SQL> SELECT s$rdfterm, p$rdfterm, o$rdfterm FROM TABLE(
      2  SEM_MATCH('
      3  SELECT * WHERE {
      4  	?s ?p ?o  }
      5  ', sem_models('VM_X1_ONLY'),null,null,null,null,' PLUS_RDFT=VC ',network_owner=>'rdfuser',network_name=>'NET1'))
      6  ORDER BY 1,2,3;

    次に、前述のSEM_MATCH問合せの出力を示します。

    S$RDFTERM                      P$RDFTERM                                          O$RDFTERM                                                                     
    ------------------------------ -------------------------------------------------- ------------------------------                                                
    <http://my.org/adam>           <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>  <http://my.org/Consultant>                                                    
    <http://my.org/bill>           <http://my.org/similarPartTimerAs>                 <http://my.org/carl>                                                          
    <http://my.org/bill>           <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>  <http://my.org/PartTimer>                                                     
    <http://my.org/carl>           <http://my.org/similarPartTimerAs>                 <http://my.org/bill>                                                          
    <http://my.org/carl>           <http://my.org/similarPartTimerAs>                 <http://my.org/drew>                                                          
    <http://my.org/carl>           <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>  <http://my.org/PartTimer>                                                     
    <http://my.org/drew>           <http://my.org/similarPartTimerAs>                 <http://my.org/carl>                                                          
    <http://my.org/drew>           <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>  <http://my.org/PartTimer>                                                     
    <http://my.org/eric>           <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>  <http://my.org/Employee>                                                      
    
    9 rows selected.
  4. オプションで、SEM_APIS.DROP_INFERRED_GRAPHをコールして、SPARQL推測グラフを削除します。
    SQL> EXEC SEM_APIS.DROP_INFERRED_GRAPH('X1', network_owner=>'RDFUSER',network_name=>'NET1');
    
    PL/SQL procedure successfully completed.