2017-08-29 84 views
1

我想爲Optimistic vs. Pessimistic locking樂觀鎖或有條件更新

提到我有以下數據

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

一個會話查詢這些數據,並保存在內存中的信息來實現類似「樂觀鎖定」。 然後它想要發佈更新。

當傳遞的版本是'3'時,我只想要更新成功,這意味着自從會話已讀:foo以來沒有發生更新。

有沒有一種方法,使當通過的版本是!= 3失敗更新查詢否則成功和更新:hasVersion'4'^^xsd:nonNegativeInteger和例如:hasPropbaz

+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

您希望過濾器爲'?v = 3',以避免更新(版本4),除非當前版本爲3.如書面所示,查詢將更新(版本4)任何其他版本除外3. –

+0

Ehm,是的。你是對的。我誤解了這個問題。謝謝。還對@RobV – AKSW