【问题标题】:SPARQL Update not workingSPARQL 更新不起作用
【发布时间】:2013-10-19 13:34:52
【问题描述】:

我正在尝试对以给定资源作为主题的属性的值进行简单更新。

这是我的查询:

WITH  <http://127.0.0.1:3000/dendro_graph>  
DELETE {   <http://127.0.0.1:3000/project/datanotes/records/teste/filho%20do%20teste>   <http://purl.org/dc/elements/1.1/creator>  ?o0 .

} 
INSERT 
{ 
  <http://127.0.0.1:3000/project/datanotes/records/teste/filho%20do%20teste>    <http://purl.org/dc/elements/1.1/creator>    "creator1"  .

} 
WHERE {   <http://127.0.0.1:3000/project/datanotes/records/teste/filho%20do%20teste>   <http://purl.org/dc/elements/1.1/creator>  ?o0 .

} 

这样的结果是执行了delete,但是insert没有执行;我最终销毁了该属性的所有实例,但没有添加新值。

如果我删除 WHERE 子句,我会得到重复的三元组,因为似乎 DELETE 没有执行。

我做错了什么?

编辑:

此代码产生重复项:

WITH  <http://127.0.0.1:3000/dendro_graph>  
DELETE 
{ 
<http://127.0.0.1:3000/project/datanotes/records/teste/filho%20do%20teste>   <http://purl.org/dc/elements/1.1/creator>  ?o0 .

} 
INSERT 
{ 
  <http://127.0.0.1:3000/project/datanotes/records/teste/filho%20do%20teste>    <http://purl.org/dc/elements/1.1/creator>    "creator1"  .

} 

【问题讨论】:

  • 您使用的是哪个 SPARQL 引擎和哪个版本?
  • 当您说“没有 WHERE 子句”时,我假设您的意思是“WHERE {}”,否则是语法错误。当使用“WHERE {}”时,?o0 没有被绑定,所以没有任何内容被删除。
  • 嗨,安迪,我正在使用 Virtuoso 版本:06.01.3127。当你说 ?o0 没有绑定时,你的意思是 DELETE 子句中的 ?o0 和 WHERE 子句之间没有对应关系?如果是这种情况,我怎样才能删除所有指定了主语和谓语的三元组,比如`127.0.0.1:3000/project/datanotes/records/teste/…> purl.org/dc/elements/1.1/creator> ?o0 .´,但是我不知道对象然后执行插入?谢谢
  • 我已经准备放弃这个,运行两个查询,但这真的很糟糕......它对数据库的负担更大,如果删除和插入之间出现错误,它会不一致...
  • 检查我编辑的答案以获取不带 WHERE 子句的代码,该子句会生成重复项。

标签: sparql


【解决方案1】:

没有 WHERE 子句的查询不是合法的 SPARQL 表达式,应该会导致语法错误。如果您正在使用的引擎接受这一点,那么这是该引擎中的错误。

乍一看,前面的操作同上,你说删除但不插入:据我所知,SPARQL 表达式是正确的,如果你说插入部分没有被执行,那就意味着你在执行它的引擎中发现了一个错误。我建议您直接与开发人员联系。

【讨论】:

  • 截至今天,我使用最稳定的 Virtuoso 开源版本(版本:07.00.3203 构建:2013 年 10 月 20 日)测试了相同的查询,并验证并运行。结果是:修改 127.0.0.1:3000/dendro_graph>,删除 0 个(或更少)并插入 1 个(或更少)三元组——完成。老实说,我正要放弃所有这些 SPARQL 的东西。在纸面上看起来很棒,但我已经使用 OrientDB 破坏了整个项目,而这个项目也是如此。
  • 我会尝试联系邮件列表中的开发人员,但必须确保它没有在最新版本中修复。
【解决方案2】:

这是我用来让它工作的解决方法(最后感谢上帝)。看来您可以使用分号 ; 在单个操作中指定要在图形上执行的多个操作。

我最终指定了 DELETE 语句,然后指定了 UPDATE 一个

查看此代码示例:SPARQL Update example for updating more than one triple in a single query

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    相关资源
    最近更新 更多