ベスト・プラクティス

追加の問合せオプション
JOIN_METHODオプション
SPARQL 1.1フェデレーテッド問合せのSERVICE句
データ・サンプリング
問合せのヒント

追加の問合せオプション

RDFグラフ機能では、追加の問合せオプションを指定できます。その機能は、SPARQLのネームスペース接頭辞構文を使用し、問合せオプションを含むOracle固有のネームスペースを参照することで実装されます。ネームスペースは、PREFIX ORACLE_SEM_FS_NSという形式で定義します。

追加の問合せオプションをSPARQL問合せに渡すには、次の形式で行を追加します。

PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#option>

optionは、SPARQL問合せの実行に適用される問合せ設定(問合せオプションが複数の場合にはカンマで区切ります)を表します。次に例を示します。

PREFIX ORACLE_SEM_FS_NS:
<http://oracle.com/semtech#TIMEOUT=3,DOP=4,ORDERED>
SELECT * WHERE {?subject ?property ?object }

次の問合せオプションがサポートされています。

  • ASSERTED_ONLYを指定すると、表明されたトリプル/クワッドのみが問い合せられます。

  • BATCH=nには、バインディングの同時取得を実行するバッチのサイズ(n)を指定します。Oracle NoSQL DatabaseからRDFデータを取得するとき、デフォルトの1,000より大きいバッチ・サイズ、たとえば5,000または10,000などを指定すると、パフォーマンスが向上する場合があります。

  • BEST_EFFORT_QUERY=T。TIMEOUT=nオプションとともに指定すると、SPARQL問合せでn秒間に発見されたすべての一致が返されます。

  • DOP=nには、問合せの並列度(n)を指定します。デフォルト値は1です。マルチコアまたはマルチCPUのプロセッサを使用し、DOP値を変えてみると(4または8)、パフォーマンスが向上する場合があります。DOP設定は、問合せ並列処理のレベルが低いと想定して、まずCPUコアの数から始めるとよいでしょう。どの問合せもCPUリソースを独占しないように、同時リクエストが増えるときにはDOP設定を小さくする必要があります。

  • INCLUDE=RULEBASE_ID=nには、SPARQL問合せに応答するときに使用するルールベースIDを指定します。この問合せオプションは、SPARQLサービス・エンドポイントで定義されているルールベース構成より優先されます。

  • INF_ONLYを指定すると、推論されたトリプル/クワッドのみが問い合せられます。

  • JENA_EXECUTORを指定すると、RDFグラフ機能に対するSPARQL問合せの実行が無効になり、Apache Jenaネイティブ問合せの実行機能が使用されます。

  • JOIN_METHOD={nl, hash}には、SPARQL問合せの問合せパターンの結合方法を指定し、ネステッド・ループ結合(nl)またはハッシュ結合(hash)を使用できます。詳細は、「JOIN_METHODオプション」を参照してください。

  • ORDEREDは、SPARQL問合せの問合せパターンを、指定したとおりの順序で実行することを指定します。

  • TIMEOUT=n (問合せタイムアウト)には、問合せが停止されるまでの実行時間を秒単位で指定します。SPARQL問合せから生成された問合せを基礎として実行すると多くの一致結果を返すことができ、副問合せや割当てなどの機能を使用できますが、いずれもかなりの時間がかかることがあります。TIMEOUTとBEST_EFFORT_QUERY=tのオプションを使用すると、問合せの処理時間が長すぎると思われる場合にそれを回避できます。

JOIN_METHODオプション

SPARQL問合せは、1つ(または複数)の問合せパターン、論理積、論理和、およびオプションのトリプル・パターンで構成されます。RDFグラフ機能は、SPARQL問合せのトリプル・パターンを処理し、その部分結果に対する結合処理を実行して問合せ結果を取得します。RDFグラフ機能は、受け取ったSPARQL問合せを自動的に分析し、2つの問合せ行ソース(外側と内側、左または右)間で効率的な結合操作を使用して実行プランを決定します。問合せ行ソースは、問合せパターンまたは他の結合操作からの中間結果で構成されます。

ただし、RDFグラフ機能を使用してSPARQL問合せ実行で使用する結合操作を指定するJOIN_METHODオプションを使用できます。たとえば、次のような問合せを考えてみます。

PREFIX ORACLE_SEM_FS_NS:<http://oracle.com/semtech#JOIN_METHOD=NL>
SELECT ?subject ?object ?grandkid 
WHERE {
?subject <u:parentOf>  ?object   .
?object  <u:parentOf>  ?grandkid .
}

この場合、使用する結合方法はネステッド・ループ結合に設定されます。この問合せの最初(外側)の問合せ部分(この例では問合せパターン?subject u:parentOf> ?object)が、Oracle NoSQL Databaseに対して実行されます。結果からの?objectの各バインディングが2番目(内側)の問合せパターン(この例では?object <u:parentOf> ?grandkid)にプッシュされ、今度はそれがOracle NoSQL Databaseに対して実行されます。ネステッド・ループ結合の操作を実行できるのは、内側の行ソースが問合せパターンである場合のみです。

使用する結合方法がhash joinに設定されている場合は、この問合せの外側の行ソースと内側の行ソースがどちらもOracle NoSQL Databaseに対して実行されます。外側の行ソースからの結果(ビルド表とも呼ばれる)はすべて、?objectのバインディングを基準にしてハッシュ表構造に格納されます。これは外側と内側の行ソースで共通の変数だからです。次に、内側の行ソースからの?objectの各バインディング(プローブ表とも呼ばれる)がハッシュされ、ハッシュ・データ構造と照合されます。

SPARQL 1.1フェデレーテッド問合せのSERVICE句

SPARQL 1.1フェデレーテッド問合せを記述するときには、SERVICE句内部の副問合せで、返される行に制限を設定できます。これを利用すると、ローカル・リポジトリとリモートSPARQLエンドポイントとの間で転送されるデータの量を効果的に制限できます。

たとえば、次の問合せではSERVICE句の副問合せで制限を100に指定しています。

PREFIX : <http://example.com/>
SELECT ?s ?o 
WHERE 
{ 
?s :name "CA" 
SERVICE <http://REMOTE_SPARQL_ENDPOINT_HERE>
{ 
select ?s ?o 
{?s :info ?o} 
limit 100 
} 
}

データ・サンプリング

問合せオプティマイザに十分な統計があることが、問合せで良好なパフォーマンスを得るためには必須です。一般的には、問合せの実行中に使用するRDFグラフ機能の基本的な統計を収集する必要があります。Oracle NoSQL Databaseでは、この統計はデータ・サンプリングを維持することによって生成されます。

データ・サンプリングは、Oracle NoSQL Databaseに格納されているRDFグラフ(またはデータセット)からのトリプルの代表的なサブセットとして定義され、特定の時点で生成されます。このサブセットのサイズは、データ全体のサイズとサンプリング・レートによって決まります。データ・サンプリングは、RDFデータ・ファイルがOracle NoSQL Databaseにロードされるとき、またはOracle NoSQL Databaseから削除されるときに自動的に実行されます。デフォルトでは、データ・サンプリング・レートは0.003 (つまり1000のうち3)です。デフォルトのサンプリング・レートは、データベース・サイズによっては適切でない場合があります。きわめて大きいデータセットで管理可能なサンプル・データの数を増やすときには、サンプリング・レートを小さくするとパフォーマンスが向上する場合があります。たとえば、トリプルが数十億の場合にはサンプリング・レートを0.0001に、数兆の場合にはサンプリング・レートを0.00001に設定するとパフォーマンスが向上することがあります。

データ・サンプリング・サービスは、メソッド分析のRDFグラフ機能OracleGraphNoSqlおよびDatasetGraphNoSqlクラスによって提供されます。このメソッドは基本的に、グラフ(またはデータセット)からすべてのデータを取得し、データ・サンプリングとして使用される代表的なサブセットを生成します。 ユーザーはsamplingRateを指定してデータ・サンプリングのサイズを選択できます。この操作を実行すると、既存のデータ・サンプリングは削除されます。分析の使用方法の詳細は、APIリファレンス情報(Javadoc)を参照してください。

次の例は、グラフのデータを分析し、0.005 (5/1000)のサンプリング・レートでサンプリング・サブセットを生成します。

public static void main(String[] args) throws Exception
{
String szStoreName  = args[0];
String szHostName   = args[1];
String szHostPort   = args[2]; 
    
System.out.println("Create Oracle NoSQL connection");
OracleNoSqlConnection conn 
                = OracleNoSqlConnection.createInstance(szStoreName,
                                                       szHostName, 
                                                       szHostPort);
    
System.out.println("Create named graph");
OracleGraphNoSql graph = new OracleGraphNoSql(conn);
    
System.out.println("Clear graph");
graph.clearRepository();
    
    
System.out.println("Load data from file into a NoSQL database");
    
DatasetGraphNoSql.load("family.rdf", Lang.RDFXML, conn, 
                           "http://example.com"); // base URI
    
System.out.println(“Analyze data”);
long sizeSamp = graph.analyze(0.005); // 5 out of 1000
    
System.out.println("sampling size is " + sizeSamp);
    
graph.close();
conn.dispose();
} 

問合せのヒント

RDFグラフ機能では、SPARQL問合せに問合せ最適化のヒントを含めることができます。その機能は、SPARQLのネームスペース接頭辞構文を使用し、ヒントを含むOracle固有のネームスペースを参照することで実装されます。ネームスペースは、PREFIX ORACLE_SEM_HT_NSという形式で定義します。

問合せのヒントをSPARQL問合せに渡すには、次の形式で行を追加します。

PREFIX ORACLE_SEM_HT_NS: <http://oracle.com/semtech#hint>

ここで、hintはRDFグラフ機能でサポートされるヒントを表します。

問合せのヒントは、RDFグラフ機能でSPARQL問合せの実行に使用される実行プランを生成する際のヘルパーになります。実行プランは、RDFグラフ機能によって問合せパターンを処理する方法を決定します。これには、次の条件が含まれます。

  1. 基本実行パターンで問合せパターンを実行する順序。

  2. 問合せ実行を完了するために問合せパターンを結合する方法。

  3. 2つの問合せパターンまたは事前計算の結果から取得された結果をマージするための結合方法(ネステッド・ループ結合またはハッシュ結合)。

実行プランは、post-fix表記を使用して記述されます。この表記法では、結合操作(HJまたはNLJ)の前にそのオペランド(他の結合操作または問合せパターンの結果)を追加します。結合操作のオペランドが指定される順序は、問合せの実行に関係します。結合操作で実行される操作の数が、その操作のサイズに密接に関係するためです。これが、問合せ実行のパフォーマンスに影響します。

プランにおける問合せパターンは、QP< ID>と表されます。ここでIDは、指定されたSPARQL問合せにおける問合せパターンの位置を表します。また、各結合操作とそれを表すオペランドは、括弧で囲む必要があります。

たとえば、お互いを知っている人の名前のペアをすべて取得する次のSPARQL問合せについて考えます。

PREFIX ORACLE_SEM_HT_NS: <http://oracle.com/semtech#plan=
                                          ((qp2%20qp3%20NLJ)%20qp1%20HJ)>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>" +

SELECT ?name1 ?name2 " +
WHERE { 
graph <http://example.org/graph> { 
?person1 foaf:knows ?person2     .         #QP1
?person1 foaf:name ?name1       .         #QP2
?person2 foaf:name ?name2         .        #QP3
} 

最初に、?person1 foaf:name ?name1?person1 foaf:knows ?person2との間でネステッド・ループ結合操作を実行し、次にその結果と3番目の問合せパターンである?person2 foaf:name ?name2との間でハッシュ結合を実行する実行プランを指定するとします。このプランは、post-fix表記を使用して次のように定義できます。

(
( 
( ?person1 foaf:name ?name1 )
( ?person1 foaf:name ?name2 )
 NLJ )
 
( ?person1 foaf:knows ?person2 )
HJ )

この実行プランをRDFグラフ機能に指定するには、hint PLAN=encoded_planという問合せを使用します。ここでencoded_planは、ハッシュ結合とネステッド・ループ結合の操作を使用してSPARQL問合せに含められる問合せパターンをすべて実行する実行プランのURLエンコード形式です。問合せのヒントを適用できるのは、単一のBGPを使用するSPARQL問合せのみです。

プランがUTF-8でエンコードされていない場合、SPARQL問合せですべての問合せパターンを含まない場合、または構文的に正しくない場合、このヒントは無視され、RDFグラフ機能はデフォルトの問合せ最適化および実行を続行します。問合せと結合操作の詳細は、「JOIN_METHODオプション」を参照してください。