【问题标题】:How to generate uniform bindings for rename operation如何为重命名操作生成统一绑定
【发布时间】:2014-04-10 20:44:34
【问题描述】:

我有一个数据集,其中我试图用另一个人替换符合某些条件的个人。在提供的最小示例中,我希望将 x-data://old 替换为 x-data://new

示例输入数据集:

<x-data://new> <x-dom://betterThan>  <x-data://old> .
<x-data://o0>  <x-data://p>          <x-data://old> .
<x-data://old> <x-data://p>          <x-data://o1> .

所需输出数据集示例:

<x-data://new> <x-dom://betterThan>  <x-data://new> .
<x-data://o0>  <x-data://p>          <x-data://new> .
<x-data://new> <x-data://p>          <x-data://o1> .

我试图通过以下查询来做到这一点:

DELETE {
  ?s ?p ?o .
}
INSERT {
  ?ns ?p ?no .
}
WHERE
  { { SELECT  ?new ?old
      WHERE
        {
          ?new <x-dom://betterThan> ?old    .
          FILTER( !sameTerm( ?new, ?old ) ) .
        }
      LIMIT   1
    }
      { ?old ?p ?o
        BIND(?old AS ?s)
        BIND(?new AS ?ns)
        BIND(?o AS ?no)
      }
    UNION
      { ?s ?p ?old
        BIND(?old AS ?o)
        BIND(?s AS ?ns)
        BIND(?new AS ?no)
      }
  }

但是,此查询不会在图表中插入任何三元组。它确实删除了人们期望的所有三元组。根据 Jena Dev 列表上的 Andy Seaborne 的说法(当我错误地将其标记为错误时):

?new 此时不在范围内 - 它不会从 子查询更高。从逻辑上讲,每个块都是独立执行的 并将结果合并到树中。 {SELECT} 被执行, UNION 是单独执行的,然后结果加入。

所以 ?ns 没有定义,因此 "?ns ?np ?no" 上的 INSERT 不是 合法的三元组并被跳过 (c.f. CONSTRUCT)。

尝试将 WHERE 部分作为 SELECT * 查询执行以查看更多信息。

这是有道理的,执行建议的 SELECT 查询是说明性的:

-----------------------------------------------------------------------------------------------------------------------------
| new            | old            | p                    | o              | s              | ns             | no            |
=============================================================================================================================
| <x-data://new> | <x-data://old> | <x-data://p>         | <x-data://o1>  | <x-data://old> |                | <x-data://o1> |
| <x-data://new> | <x-data://old> | <x-dom://betterThan> | <x-data://old> | <x-data://new> | <x-data://new> |               |
| <x-data://new> | <x-data://old> | <x-data://p>         | <x-data://old> | <x-data://o0>  | <x-data://o0>  |               |
----------------------------------------------------------------------------------------------------------------------------

鉴于此,我想重新构造上面的查询以提供所需的替换转换。尽管这听起来像是一个常见的用例,但我还没有成功找到用于替换操作的现有查询。

2014 年 7 月 11 日编辑

This Answer to the same question几乎可以满足这一点,但需要重组为DELETE-INSERT查询的形式。

【问题讨论】:

  • 在子select 中匹配?new?old 的目的是什么?只是将自己限制在一个结果上吗?例如,你为什么不能只使用?new :betterThan ?old . { … } union { … }
  • Andy 在this answers.semanticweb.com question 上的回答提到您可以组合多个操作。我想知道是否可以在这里应用具有这种技术的东西……
  • 好的,但是如果有不止一个:betterThan 三倍,你怎么知道你得到了你想要的?目前您的子选择中没有订购条件或任何内容……
  • 你确定吗?如果您有3 &gt; 2 . 2 &gt; 1(其中&gt;:betterThan)并且您首先选择2 &gt; 1,那么不要将2 &gt; 1 替换为2 &gt; 2,然后您可以简单地无休止地迭代2 &gt; 2 ?
  • 作为一个很可能表现不佳的选项,您能否将另外两个查询也作为子选择执行,从而加入您使用第一个子选择选择的 ?old?new ?

标签: rdf sparql jena arq


【解决方案1】:

这是对this answers.semanticweb.com answer 的修改,可能对您有用。我们的想法是触摸图中的每个三次,并在它们可用时为其获取一个新的主题和新的对象,否则保持它们不变。它确实具有触摸图表中的每个三元组、删除它并插入更新版本或相同内容的不幸副作用,因此您正在做一些不必要的工作。我想你可以通过在每个可选中绑定一个布尔值来解决这个问题(例如,bind(true as ?replacedSubject),然后添加一个检查filter ( ?replacedSubject || ?replacedObject )的最外层过滤器。然后你只匹配那些需要主题或对象的三元组替换,你就不会做无用的工作了。

delete {  ?s ?p  ?o }
insert { ?ss ?p ?oo }
where {
  ?s ?p ?o 

  optional {
    select ?s (sample(?new) as ?news) where {
      ?new <x-dom://betterThan> ?s 
      filter( !sameTerm( ?new, ?s ) )
    }
    group by ?s
  }

  optional {
    select ?o (sample(?new) as ?newo) where {
      ?new <x-dom://betterThan> ?o 
      filter( !sameTerm( ?new, ?o ) )
    }
    group by ?o
  }

  bind( coalesce(?news,?s) as ?ss )
  bind( coalesce(?newo,?o) as ?oo )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2017-03-08
    • 2020-01-29
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多