Sparql 乐观锁定或条件更新

Sparql 乐观锁定或条件更新,sparql,Sparql,我希望实现中提到的“乐观锁定” 我有以下数据 :foo :hasProp 'bar'; :hasVersion '3'^^xsd:nonNegativeInteger . 会话查询此数据并将信息保存在内存中。 然后它想发布一个更新 我只希望更新成功,当传递的版本为“3”时,这意味着自会话读取:foo以来未发生更新 当传递的版本为!=3但在其他情况下成功并将:hasVersion更新为'4'^^xsd:nonNegativeInteger,例如:hasProp更新为baz “失

我希望实现中提到的“乐观锁定”

我有以下数据

:foo 
    :hasProp 'bar';
    :hasVersion '3'^^xsd:nonNegativeInteger
.
会话查询此数据并将信息保存在内存中。 然后它想发布一个更新

我只希望更新成功,当传递的版本为“3”时,这意味着自会话读取
:foo
以来未发生更新

当传递的版本为
!=3
但在其他情况下成功并将
:hasVersion
更新为
'4'^^xsd:nonNegativeInteger
,例如
:hasProp
更新为
baz

“失败”只是指没有数据匹配,即您可以使用
过滤器。对于其余部分,只需插入
和删除相应的数据即可:

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)
}
前缀:
前缀xsd:
插入{
s:hasProp“baz”。
?s:hasVersion“4”^^xsd:nonNegativeInteger
}
删除{
?s:hasProp“bar”。
?s:hasVersion?v
}
在哪里{
?s:hasVersion?v
过滤器(?v=“3”^^xsd:nonNegativeInteger)
}

您希望过滤器为
?v=3
,以避免更新(版本4),除非当前版本为3。如前所述,查询将更新(版本4)除3.Ehm之外的任何其他版本。你说得对。我误解了这个问题。谢谢。@RobVI还认为,重要的是要注意并记住SPARQL与SQL不同,它没有锁定、事务或各种相关特性。一般来说,每个三元组(有时,每个四元组)都被原子化处理。未来的发展可能会允许将每个命名图视为存储中的原子(并且可能是可锁定的)实体,类似于SQL中的表。SQL的行级锁定在概念上类似于SPARQL对每个三元组的锁定,每个三元组包含一个位于
?s
?o
位置的给定实体。@TallTed感谢您的提示。我希望将单个更新查询作为事务处理。你认为情况并非如此。我目前正在试验支持事务的Stardog,但我对其他系统的信息也感兴趣。SPARQL更新的每个SPARQL查询都应该在SPARQL协议调用时自动进行。本地API可能不同,但可能提供某种程度的并发性或事务控制。@AndyS感谢您的确认