2017-08-29 3 views
1

は、私は私は、次のデータオプティミスティック・ロックまたは条件付きの更新

:foo 
    :hasProp 'bar'; 
    :hasVersion '3'^^xsd:nonNegativeInteger 
. 

Aセッションは、このデータを照会し、メモリ内の情報を保持しているOptimistic vs. Pessimistic locking

で述べたように「楽観的ロック」のような何かを達成したいです。 それから、更新プログラムを発行します。

渡されたバージョンが '3'の場合、更新が成功するだけです。つまり、セッションの読み取り後に更新が発生していないことを意味します(:foo)。

渡されたバージョンが!= 3ときに失敗した更新クエリを作成する方法はありますが、それ以外:hasVersion'4'^^xsd:nonNegativeIntegerへとbazに例:hasPropのために成功し、アップデート?

+0

私はそれを注意してSPARQLは、SQLとは異なり、ロック、また取引、また様々な関連機能何を持っていないことを覚えておくことは重要だと思います。一般に、各トリプル(または時には各クワッド)は原子的に扱われます。将来の進化により、各名前付きグラフは、SQL内のテーブルと同様に、ストア内のアトミック(潜在的にロック可能な)エンティティとして扱われる可能性があります。 SQLの行レベルロックは概念的に、 '?s'または'?o'の位置に指定されたエンティティを含むすべてのトリプルに対してSPARQLロックのように見えます。 – TallTed

+0

ヒントのために@TallTedに感謝します。私は、単一の更新クエリがトランザクションとして扱われることを期待していました。あなたはそうではないと思います。私は現在トランザクションをサポートするStardogを試していますが、他のシステムに関する情報にも興味があります。 –

+2

SPARQL更新のための各SPARQLクエリは、SPARQLプロトコルによって呼び出されたときに原子的に発生する必要があります。ローカルAPIは異なるかもしれませんが、多少の並行性やトランザクション制御を提供する可能性があります。 – AndyS

答えて

1

「失敗」とは、単にデータが一致しないことを意味します。つまり、FILTERを使用できます。残り、ちょうどINSERTDELETE対応するデータの場合:

PREFIX : <YOUR_NAMESPACE_HERE> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

INSERT { 
    ?s :hasProp "baz" . 
    ?s :hasVersion "4"^^xsd:nonNegativeInteger 
} 
DELETE { 
    ?s :hasProp "bar" . 
    ?s :hasVersion ?v 
} 
WHERE{ 
    ?s :hasVersion ?v 
    FILTER(?v = "3"^^xsd:nonNegativeInteger) 
} 
+2

を確認していただきありがとうございます。現在のバージョンが3.でない限り、更新を避けるためにフィルタを '?v = 3'にしたい場合は、クエリは(バージョン4に)バージョン3以外。 –

+0

エーム、はい。あなたが正しい。私はその質問を誤解した。ありがとうございました。 @RobVにも – AKSW

関連する問題