【问题标题】:SPARQL 1.1: how to use the replace function?SPARQL 1.1:如何使用替换功能?
【发布时间】:2012-05-29 08:43:06
【问题描述】:

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

例如,如果我有多个三元组 ?s ?p ?o ,其中 ?o 是一个字符串,并且对于所有 ?o 包含字符串“gotit”的三元组,我想在“gotit”所在的位置插入一个额外的三元组替换为“haveit”,我该怎么做?我正在努力实现这一目标是 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 文档没有包含如何使用此功能的示例。

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

【问题讨论】:

    标签: replace sparql sesame


    【解决方案1】:

    您不能像您尝试的那样直接在INSERT 子句中使用表达式。此外,您将?name 与第一个三元组模式绑定,然后在FILTER 中对?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 规范的相关部分是 Assignment 上的部分

    【讨论】:

    • 感谢您指出使用 ?name 而不是 ?o 的错误。我试图简化此处的实际查询,但忘记将 ?name 更改为 ?o。我尝试在我的 SESAME 安装中使用 BIND 进行查询,但它也给了我一个语法错误......我必须弄清楚最新版本是否支持它!
    • 我刚刚对此进行了测试,它在 Sesame 版本 2.6.5 和 OWLIM-Lite 存储库中运行良好。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的保证,它应该像我想象的那样工作!正则表达式查询确实工作得很好。一旦我设法升级到较新版本的 Sesame,我会在这里报告。
    • 我现在用 Sesame 版本 2.6.5 进行了测试,结果发现,虽然查询工作,但插入命令不起作用并产生语法错误。下面 RobV 建议的使用 BIND 的方法确实适用于 Sesame 2.6.5。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多