10.4 ネイティブRDFデータと仮想RDB2RDFデータの組合せ

SERVICEキーワードを使用して、ネイティブ・トリプル・データと仮想RDB2RDFトリプル・データ(RDFビュー・グラフからの)を、1つのSEM_MATCH問合せで組み合せることができます。

SERVICEキーワード(「グラフ・パターン: SPARQL 1.1のフェデレーテッド問合せのサポート」を参照)は、ローカル(仮想)のRDFデータを示す特別なSERVICE URLの使用を通じてオーバーロードされます。特別なSERVICE URLを表すために次の接頭辞が使用されます。

  • ネイティブRDFグラフ - oram: <http://xmlns.oracle.com/models/>

  • ネイティブRDFグラフ・コレクション - oravm: <http://xmlns.oracle.com/virtual_models/>

  • RDB2RDFモデル - orardbm: <http://xmlns.oracle.com/rdb_models/>

例10-5 複数のデータセットの問合せ

例10-5は複数のデータセットを問い合せます。この問合せでは、最初のトリプル・パターン{ ?x rdf:type :Person }は通常どおりRDFグラフm1に対応しますが、{ ?x :name ?name }はローカルRDFグラフm2に対応し、{ ?x emp:JOB ?job }はローカルRDB2RDFモデルempdb_modelに対応します。

SELECT * FROM TABLE (SEM_MATCH(
'PREFIX    : <http://people.org/> 
 PREFIX emp: <http://empdb/TESTUSER.EMP#> 
 SELECT ?x ?name ?job 
 WHERE {
   ?x rdf:type :Person .   
   OPTIONAL { SERVICE oram:m2 { ?x :name ?name } }   
   OPTIONAL { SERVICE orardbm:empdb_model { ?x emp:JOB ?job } } 
 }',
 SEM_MODELS('m1'), NULL, NULL, NULL, NULL, ' ', NULL, NULL, 'RDFUSER', 'NET1'));

オーバーロードされたSERVICEの使用は、SEM_MATCHのmodels引数に指定された1つのRDFグラフのみで許可されます。オーバーロードされたSERVICE問合せでは、複数のRDFグラフまたは入力としてのルールベースは許可されません。このような組合せには、複数のRDFグラフまたは推論グラフ(あるいはその両方)を含むRDFグラフ・コレクションを使用する必要があります。また、SEM_MATCHのindex_status引数は、modelsパラメータに入力として渡されたRDFグラフ・コレクションに含まれる推論グラフのみをチェックします。つまり、オーバーロードされたSERVICEコールで参照される推論グラフのステータスはチェックされません。

例10-6は、2つのデータセットを問い合せます。「例: 直接マッピングによるRDFビュー・グラフの使用」empdb_modelと、peopleという名前のネイティブRDFグラフです。

例10-6 スキーマプライベート・ネットワークでの仮想RDB2RDFデータとネイティブRDFデータの問合せ

-- Create native model people --
 EXECUTE SEM_APIS.CREATE_RDF_GRAPH('people', NULL, NULL, network_owner=>'rdfuser', network_name=>'net1');
 
BEGIN
  SEM_APIS.UPDATE_RDF_GRAPH('people',
   'PREFIX peop: <http://people.org/> 
    INSERT DATA {
       <http://empdb/TESTUSER.EMP/EMPNO=1> peop:age 35 .
       <http://empdb/TESTUSER.EMP/EMPNO=2> peop:age 39 .
       <http://empdb/TESTUSER.EMP/EMPNO=3> peop:age 30 .
       <http://empdb/TESTUSER.EMP/EMPNO=4> peop:age 42 .
    } ');
END;
/
COMMIT;
 
-- Querying multiple datasets --
SELECT emp, age
  FROM TABLE(SEM_MATCH(
    'PREFIX dept: <http://empdb/TESTUSER.DEPT#>
     PREFIX emp: <http://empdb/TESTUSER.EMP#>
     PREFIX peop: <http://people.org/>
     SELECT ?emp ?age WHERE {
       ?emp peop:age ?age
       SERVICE orardbm:empdb_model { ?emp emp:ref-DEPTNO ?dept . ?dept dept:LOC "Boston" }
    }',
    SEM_Models('people'),
    NULL,
    NULL,
    NULL, NULL, NULL, NULL, NULL, 'RDFUSER', 'NET1'));

問合せの出力は次のようになります。

EMP                                                AGE
-------------------------------------------------- --------------------------------------------------
http://empdb/TESTUSER.EMP/EMPNO=1                   35
http://empdb/TESTUSER.EMP/EMPNO=3                   30

10.4.1 オーバーロードしたサービスによるネストされたループのプッシュダウン

シナリオによっては、ネストしたループのサービスを使用することで、パフォーマンスが向上することがあります。スキーマプライベート・ネットワークの複数のデータセットに対する問合せの例を考えてみます。問合せでは、35歳の人がいるすべての部門のプロパティが検索されます。

–- Query example for a schema-private network.

SELECT emp, dept, p, o
  FROM TABLE(SEM_MATCH(
    'PREFIX dept: <http://empdb/TESTUSER.DEPT#>     
     PREFIX emp: <http://empdb/TESTUSER.EMP#>
     PREFIX peop: <http://people.org/>
     SELECT * WHERE{
       ?emp peop:age 35
       SERVICE orardbm:empdb_model{ ?emp emp:ref-DEPTNO ?dept . ?dept ?p ?o }
     }',
     SEM_Models('people'),
     NULL,
     NULL,
     NULL, NULL, NULL, NULL, NULL, 'RDFUSER', 'NET1'));

この問合せの出力は次のようになります。

EMP                                DEPT                                P                                                 O
---------------------------------- ----------------------------------- ------------------------------------------------  --------------------------
http://empdb/TESTUSER.EMP/EMPNO=1   http://empdb/TESTUSER.DEPT/DEPTNO=1  http://empdb/TESTUSER.DEPT#DEPTNO                1
http://empdb/TESTUSER.EMP/EMPNO=1   http://empdb/TESTUSER.DEPT/DEPTNO=1  http://empdb/TESTUSER.DEPT#DNAME                 Sales
http://empdb/TESTUSER.EMP/EMPNO=1   http://empdb/TESTUSER.DEPT/DEPTNO=1  http://empdb/TESTUSER.DEPT#LOC                   Boston
http://empdb/TESTUSER.EMP/EMPNO=1   http://empdb/TESTUSER.DEPT/DEPTNO=1  http://www.w3.org/1999/02/22-rdf-syntax-ns#type  http://empdb/TESTUSER.DEPT

指定したグラフ・パターンに一致するすべての結果を取得するには、最初にトリプル・パターン{ ?emp peop:age 35 }がRDFグラフpeopleと照合され、次にトリプル・パターン{ ?emp emp:ref-DEPTNO ?d . ?d dept:DNAME ?dept }がRDFグラフempdb_modelと照合され、最後に結果が結合されます。ここで、RDFグラフpeopleには35歳の人が1人しかいないものの、部に関する情報を含むトリプルは100,000個あるとします。明らかに、すべての結果を抽出する方法は最も効率的とはいえず、問合せのパフォーマンスも悪いと考えられます。これは、問合せの残りの部分と結合する前に、大量の結果を処理する必要があるためです。

この例では、ネストしたループのサービスでパフォーマンスが向上する可能性があります。ヒントOVERLOADED_NL=Tが使用されると、問合せの最初の部分で得られる結果が計算され、SERVICEパターンが、ルート・トリプル・パターンから得られる?emp値ごとに1回ずつ、ネストしたループで順番に実行されます。実行のたびに、SERVICEパターンの主語値?empが、ルート・トリプル・パターンの定数に置き換えられます。これにより、結合条件が効率的にSERVICE句へプッシュ・ダウンされます。

次の例では、先の問合せに対してヒントOVERLOADED_NL=Tが使用されています。

SELECT emp, dept, p, o
  FROM TABLE(SEM_MATCH(
    'PREFIX dept: <http://empdb/TESTUSER.DEPT#>     
     PREFIX emp: <http://empdb/TESTUSER.EMP#>
     PREFIX peop: <http://people.org/>
     SELECT * WHERE{
       ?emp peop:age 35
       SERVICE orardbm:empdb_model { ?emp emp:ref-DEPTNO ?dept . ?dept ?p ?o }
     }',
     SEM_Models('people'),
     NULL,
     NULL,
     NULL, NULL,' OVERLOADED_NL=T ', NULL, NULL, 'RDFUSER', 'NET1'));

ヒントOVERLOADED_NL=Tは、SEM_MATCHオプションや、与えられたSERVICEグラフのインライン・コメントで指定することができます。