2017-08-29 55 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