SPARQL 1.1:如何使用replace函数?

Joh*_*hsm 12 sesame replace sparql

如何在SPARQL 1.1中使用replace函数,尤其是在更新命令中?

例如,如果我有多个三元组?s?p?o其中?o是一个字符串,对于所有三元组,其中包含字符串"gotit"我想插入一个额外的三元组,其中"gotit"被替换为" "我怎么能这样做?我试图实现这是芝麻2.6.0.

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

INSERT { ?s ?p replace(?o,"gotit","haveit","i") . }
WHERE { ?s ?p ?o . FILTER(regex(?o,"gotit","i")) }
Run Code Online (Sandbox Code Playgroud)

但这导致语法错误.

我也无法在查询的结果列表中使用replace,如下所示:

SELECT ?s ?p (replace(?o,"gotit","haveit","i") as ?r) WHERE { .... }
Run Code Online (Sandbox Code Playgroud)

遗憾的是,SPARQL文档不包含如何使用此函数的示例.

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

Rob*_*obV 14

您不能INSERT像在尝试的那样直接在子句中使用表达式.还要绑定?name与第一三重模式,但然后过滤上?oFILTER其不会给你的结果(滤波上的未绑定变量会给你没有结果对大多数滤波器表达式).

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

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

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

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


Ale*_*ler 5

replace根据规范看起来正确使用看起来正确.我相信REPLACE最近刚刚添加到规范的最后一个版本 - 也许芝麻只是不支持它呢?

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