SPARQL 1.1:如何使用replace函数?

SPARQL 1.1:如何使用replace函数?,replace,sparql,sesame,Replace,Sparql,Sesame,如何在SPARQL 1.1中使用replace函数,尤其是在更新命令中 例如,如果我有许多三元组?s?p?o,其中?o是一个字符串,并且对于所有三元组,其中?o包含字符串“gotit”,我想在“gotit”替换为“haveit”的位置插入一个额外的三元组,我该怎么做?我正在努力实现这一目标,这就是芝麻2.6.0 我尝试过这种天真的方法: INSERT { ?s ?p replace(?o,"gotit","haveit","i") . } WHERE { ?s ?p ?o . FILTER(re

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

例如,如果我有许多三元组?s?p?o,其中?o是一个字符串,并且对于所有三元组,其中?o包含字符串“gotit”,我想在“gotit”替换为“haveit”的位置插入一个额外的三元组,我该怎么做?我正在努力实现这一目标,这就是芝麻2.6.0

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

INSERT { ?s ?p replace(?o,"gotit","haveit","i") . }
WHERE { ?s ?p ?o . FILTER(regex(?o,"gotit","i")) }
但这导致了语法错误

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

SELECT ?s ?p (replace(?o,"gotit","haveit","i") as ?r) WHERE { .... }
遗憾的是,SPARQL文档没有包含如何使用此函数的示例


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

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


如果您只是执行
SELECT?s?p?o WHERE{s?p?name.FILTER(regex(?name,“gotit”,“i”))}
查询是否返回行?

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

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

INSERT 
{
  ?s ?p ?o2 .
}
WHERE 
{ 
  ?s ?p ?o .
  FILTER(REGEX(?o, "gotit", "i"))
  BIND(REPLACE(?o, "gotit", "haveit", "i") AS ?o2)
}
BIND
将表达式的结果指定给新变量,以便您可以在查询/更新中的其他位置使用该值


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

的一节,感谢您再次保证它应该像我想象的那样工作!regex查询确实工作得很好。我将在设法升级到较新版本的Sesame后立即报告。我现在使用Sesame版本2.6.5进行了测试,结果表明,当查询工作时,insert命令不工作,并产生语法错误。下面RobV建议的使用BIND的方法确实适用于Sesame 2.6.5。感谢您指出使用?name而不是?o.的错误。。我试图简化此处的实际查询,但忘记将?名称更改为?o。我在我的SESAME安装中尝试了使用BIND进行查询,但它也给了我一个语法错误。。。我必须弄清楚最新版本是否支持这一点!我刚刚测试了这个,它在Sesame版本2.6.5和OWLIM Lite存储库中运行良好。