13

如何使用 SPARQL 1.1 中的替换功能,尤其是在更新命令中?

例如,如果我有多个三元组 ?s ?p ?o 其中 ?o 是一个字符串,并且对于所有 ?o 包含字符串“gotit”的三元组,我想插入一个额外的三元组,其中“gotit”被替换为“拥有它”,我怎么能这样做?我正在努力实现这一目标是 Sesame 2.6.0。

我尝试了这种天真的方法:

INSERT { ?s ?p replace(?o,"gotit","haveit","i") . }
WHERE { ?s ?p ?o . FILTER(regex(?o,"gotit","i")) }

但这导致了语法错误。

我也未能在查询的结果列表中使用替换,如下所示:

SELECT ?s ?p (replace(?o,"gotit","haveit","i") as ?r) WHERE { .... }

遗憾的是,SPARQL 文档没有包含如何使用此功能的示例。

是否有可能使用函数来创建新值而不仅仅是测试现有值,如果可以,如何?

4

2 回答 2

16

你不能INSERT像你试图做的那样直接在你的子句中使用表达式。此外,您正在绑定?name第一个三元组模式,但随后?oFILTER其中进行过滤不会给您任何结果(对未绑定的变量进行过滤将不会为大多数过滤器表达式提供任何结果)。

相反,您需要在子句中使用 aBINDWHERE使新版本的值在INSERT子句中可用,如下所示:

INSERT 
{
  ?s ?p ?o2 .
}
WHERE 
{ 
  ?s ?p ?o .
  FILTER(REGEX(?o, "gotit", "i"))
  BIND(REPLACE(?o, "gotit", "haveit", "i") AS ?o2)
}

BIND将表达式的结果分配给新变量,以便您可以在查询/更新的其他地方使用该值。

您感兴趣的 SPARQL 规范的相关部分是分配部分

于 2012-05-23T15:32:51.770 回答
6

根据规范使用replace看起来正确的方法。我相信最近才被添加到规范的最后一个版本中——也许芝麻还不支持它?REPLACE

如果您只是这样做SELECT ?s ?p ?o WHERE { ?s ?p ?name . FILTER(regex(?name,"gotit","i")) },您的查询是否返回行?

于 2012-05-22T19:58:57.853 回答