【发布时间】: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 > 2 . 2 > 1(其中>是:betterThan)并且您首先选择2 > 1,那么不要将2 > 1替换为2 > 2,然后您可以简单地无休止地迭代2 > 2? -
作为一个很可能表现不佳的选项,您能否将另外两个查询也作为子选择执行,从而加入您使用第一个子选择选择的
?old和?new?