SPARQL插入/删除

时间:2018-12-19 02:25:42

标签: insert sparql

我需要一些帮助来编写更新查询。

DELETE {
      ?contactInfo vivo:freeTextValue5 ?o .
}
INSERT { 
      ?contactInfo vivo:freeTextValue5 "new_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}
WHERE {
      ?contactInfo vivo:freeTextValue5 "old_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}

能否让我知道此“更新”查询出了什么问题?

1 个答案:

答案 0 :(得分:0)

猜测,您的问题是此更新添加了一个新的三元组,但没有删除旧的三元组。

原因是您的DELETE子句包含一个未绑定变量:?o。这是不允许的-或至少发生的事情是SPARQL引擎会简单地忽略具有未绑定变量的模式。因此,您的DELETE实际上不会删除任何三元组。变量?o需要绑定到WHERE子句中的值。

解决此问题的一种方法是仅将?o替换为特定值:

DELETE {
      ?contactInfo vivo:freeTextValue5 "old_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}
INSERT { 
      ?contactInfo vivo:freeTextValue5 "new_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}
WHERE {
      ?contactInfo vivo:freeTextValue5 "old_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}

通常,您可以使用VALUES子句将?o绑定到一个值,如下所示:

DELETE {
      ?contactInfo vivo:freeTextValue5 ?o.
}
INSERT { 
      ?contactInfo vivo:freeTextValue5 "new_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}
WHERE {
      VALUES ?o { "old_url"^^<http://www.w3.org/2001/XMLSchema#string> }
      ?contactInfo vivo:freeTextValue5 ?o.

}

这也许是更好的方法,因为它可以更轻松地将更新扩展为?o的不同值。