如何在SPARQL 1.1中使用replace函数,尤其是在更新命令中?
例如,如果我有多个三元组?s?p?o其中?o是一个字符串,对于所有三元组,其中包含字符串“gotit”我想插入一个额外的三元组,其中“gotit”是取而代之的是“hasit”,我怎么能这样做?我试图实现这个是芝麻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文档不包含如何使用此函数的示例。
是否有可能使用函数创建新值而不仅仅测试现有值,如果是,是如何?
答案 0 :(得分:14)
您不能像您尝试过的那样直接在INSERT
子句中使用表达式。此外,您使用第一个三元模式绑定?name
,然后在?o
中对FILTER
进行过滤,这不会给您任何结果(对未绑定变量进行过滤将不会给您带来任何结果对于大多数过滤器表达式)。
相反,您需要在BIND
子句中使用WHERE
来使INSERT
子句中的新版本值可用,如下所示:
INSERT
{
?s ?p ?o2 .
}
WHERE
{
?s ?p ?o .
FILTER(REGEX(?o, "gotit", "i"))
BIND(REPLACE(?o, "gotit", "haveit", "i") AS ?o2)
}
BIND
将表达式的结果分配给新变量,以便您可以在查询/更新中的其他位置使用该值。
您感兴趣的SPARQL规范的相关部分是Assignment
部分答案 1 :(得分:5)
根据spec,replace
的使用看起来是正确的。我相信REPLACE
刚刚被添加到规范的最后一个版本中 - 也许Sesame还不支持它?
如果您只是SELECT ?s ?p ?o WHERE { ?s ?p ?name . FILTER(regex(?name,"gotit","i")) }
,您的查询会返回行吗?