8.7 SPARQL更新の実行モデル

この項では、Oracle RDF Graph Adapter for Eclipse RDF4JのSPARQL更新の実行モデルについて説明します。

Eclipse RDF4J用のアダプタにより、一連のSQL DML文を実行することでSPARQL更新操作が実装されます。デフォルトでは、これらのSQL実行を管理するロジックはクライアントで実行され、JDBCを使用してそれらのSQL文がデータベース・サーバーに送信されます。ただし、システム・プロパティoracle.rdf4j.adapter.sparqlInClientを値Fに設定した場合は、かわりにデータベース・サーバーでSEM_APIS.UPDATE_RDF_GRAPHストアド・プロシージャが1回呼び出されてSPARQL更新操作が実行されます。SEM_APIS.UPDATE_RDF_GRAPHを使用すると、データベースのラウンドトリップが減少し、クライアントとデータベース・サーバーの間の待機時間が長い場合はパフォーマンスが向上する可能性があります。SPARQL更新操作を実行するには、OracleSailRepositoryConnectionのインスタンスのprepareUpdate関数からUpdateオブジェクトを取得します。

ノート:

OracleSailRepositoryConnectionインスタンスが必要です。OracleSailStoreから作成されたプレーンなSailRepositoryインスタンスでは、更新が正しく実行されません。

次の例は、RDF4J APIを使用してOracle RDFグラフを更新する方法を示します。

String updString =
   "PREFIX people: <http://www.example.org/people/>\n"+
   "PREFIX    ont: <http://www.example.org/ontology/>\n"+        
   "INSERT DATA { GRAPH <urn:g1> { \n"+        
   "                people:Sue a ont:Person; \n"+        
   "                             ont:name \"Sue\" . } }";      
   Update upd = conn.prepareUpdate(QueryLanguage.SPARQL, updString);      
   upd.execute();

8.7.1 SPARQL更新のトランザクション管理

RDF4J APIを介して実行されるSPARQL更新操作は、標準のRDF4Jトランザクション管理規則に従います。SPARQL更新は、デフォルトで自動的にコミットされます。ただし、明示的なトランザクションがbeginを使用してSailRepositoryConnectionで開始された場合、アクティブなトランザクションがcommitを使用して明示的にコミットされるまで、後続のSPARQL更新操作はコミットされません。未コミット状態の更新操作は、rollbackを使用してロールバックできます。

8.7.2 他の機能をサポートするためのSPARQL構文への追加

SPARQL問合せの場合と同様に、Oracle RDF Graph Adapter for Eclipse RDF4JではSPARQL更新を実行するためのオプションを渡すことができます。SEM_APIS.UPDATE_RDF_GRAPH_オプションを含むOracle固有の名前空間を使用してSPARQL名前空間接頭辞の構文をオーバーロードすることで、これらの機能を実装できます。これらのオプションは、クライアントベースのSPARQL更新実行とSEM_APIS.UPDATE_RDF_GRAPHベースの実行の両方に適用されます。

8.7.2.1 UPDATE_RDF_GRAPHオプション

SPARQL更新実行にオプションを渡すには、次の形式でPREFIX宣言を含めます:
PREFIX ORACLE_SEM_UM_NS: <http://oracle.com/semtech#option>
前述のPREFIXoptionは、更新の実行時に使用されるUPDATE_RDF_GRAPHオプション(またはカンマで区切られた複数のオプション)を反映します。

使用可能なオプションの詳細は、SEM_APIS.UPDATE_RDF_GRAPHを参照してください。このPREFIXでは、UPDATE_RDF_GRAPHのオプション引数に有効としてリストされている任意の有効なキーワードまたはキーワード値ペアを使用できます。

次の問合せ例では、ORACLE_SEM_UM_NS接頭辞を使用して、更新の並列度2を指定します。

PREFIX ORACLE_SEM_UM_NS: <http://oracle.com/semtech#parallel(2)>
PREFIX ex: <http://www.example.org/>
INSERT {GRAPH ex:g1 {ex:a ex:reachable ?y}}
WHERE {ex:a ex:p1* ?y}

8.7.2.2 UPDATE_RDF_GRAPH照合オプション

SPARQL更新実行に照合オプションを渡すには、次の形式でPREFIX宣言を含めます:

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

optionは、SPARQL更新の実行中に使用されるUPDATE_RDF_GRAPH照合オプション(またはカンマで区切られた複数の照合オプション)を反映します。

使用可能なオプションの詳細は、SEM_APIS.UPDATE_RDF_GRAPHを参照してください。このPREFIXでは、UPDATE_RDF_GRAPH match_options引数に有効としてリストされている任意の有効なキーワードまたはキーワード値ペアを使用できます。

次の例では、ORACLE_SEM_SM_NS接頭辞を使用して、最大の無制限のプロパティ・パス深度5を指定します。

PREFIX ORACLE_SEM_SM_NS: <http://oracle.com/semtech#all_max_pp_depth(5)>
PREFIX ex: <http://www.example.org/>
INSERT {GRAPH ex:g1 {ex:a ex:reachable ?y}}
WHERE {ex:a ex:p1* ?y}

8.7.3 SPARQL更新のサポートで特に留意する点

更新操作での無制限のプロパティ・パス

前の項で説明したように、Oracle RDF Graph Adapter for Eclipse RDF4Jは、無制限のSPARQLプロパティ・パス演算子+および*の評価を最大10回の繰返しに制限します。このデフォルト設定は、WHERE句でプロパティ・パスを使用するSPARQL更新操作に影響します。最大反復回数の設定は、all_max_pp_depth(n)オプションを使用して制御できます。nは、+または*と一致する場合に許可される最大反復回数です。値をゼロに指定すると、最大反復回数は無制限になります。

次の例では、SPARQL更新実行の間に、完全に無制限の検索のための照合オプションとしてall_max_pp_depth(0)を使用します。

PREFIX ORACLE_SEM_SM_NS: <http://oracle.com/semtech#all_max_pp_depth(0)>
PREFIX ex: <http://www.example.org/>
INSERT { GRAPH ex:g1 { ex:a ex:reachable ?y}}
WHERE { ex:a ex:p1* ?y}

SPARQLデータセットの指定

Oracle RDF Graph Adapter for Eclipse RDF4Jでは、SPARQL更新文字列の外部でデータセットを指定できません。OperationおよびそのサブインタフェースでのsetDatasetメソッドによるデータセット指定はサポートされていません。かわりに、WITHUSINGおよびUSING NAMED SPARQL句を使用して、SPARQL更新文字列自体でデータセットを指定します。

バインド値

SPARQL更新操作では、バインド値はサポートされていません。

ロングRDFリテラル

前の項で説明したように、長さが4000バイトを超えるラージRDFリテラル値は、一部のSPARQL問合せ関数ではサポートされていません。この制限は、ロング・リテラル・データに対してこれらの関数のいずれかを使用するSPARQL更新操作に影響します。詳細は、SEM_MATCH使用時の特別な考慮事項を参照してください。

更新タイムアウト

OperationおよびそのサブインタフェースでのsetMaxExecutionTimeメソッドによる更新タイムアウトはサポートされていません。