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グラフのインライン・コメントで指定することができます。
親トピック: ネイティブRDFデータと仮想RDB2RDFデータの組合せ