在构造查询中使用bind concat

时间:2016-03-22 22:44:23

标签: sparql

我有以下查询

CONSTRUCT{
   ?entity a something;
    a label ?label .
} 
WHERE
{
   ?entity a something;
   a label ?label .
 BIND(CONCAT(STR( ?label ), " | SOME ADDITIONAL TEXT I WOULD LIKE TO APPEND MANUALLY") ) AS ?label ) .
}

我只是想用?label连接一些文本,但是在运行查询时我收到以下错误:

BIND clause alias '?label' was previously used

我只想返回?label的单个实例,因此,我在构造子句中定义了它。

1 个答案:

答案 0 :(得分:5)

错误消息似乎准确无误,但这只是您使用此查询获得的许多内容中的第一个。通常要求查看一些SPARQL学习资源,以至少了解基于三重图形模式匹配的基础知识,以及一些提示,以便查找。 CONSTRUCT并不是一个糟糕的起点,以下几乎应该按照我的想法去做:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
CONSTRUCT{
   ?entity rdfs:label ?label .
} 
WHERE
{
  ?entity a ex:something ;
      rdfs:label ?oldlabel .
  BIND(CONCAT(STR( ?oldlabel ), " | SOME ADDITIONAL TEXT I WOULD LIKE TO APPEND MANUALLY") ) AS ?label ) .
}

这个查询有很多不同之处,所以看看它是否准确地做了你想要的。一个提示是使用'。'之间的语法差异。和';'分离三重模式。另一个是每个子句定义一个URL,在示例中使用qname,或者以'?'为前缀的变量。 “标签”或“某事”均无效。

我说“差不多”因为CONSTRUCT只返回一组三元组。要修改我认为是意图的标签,您需要使用SPARQL Update,即:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ex: <http://example.org/example#>
DELETE {
   ?entity rdfs:label ?oldlabel .
}
INSERT{
   ?entity rdfs:label ?label .
} 
WHERE
{
  ?entity a ex:something .
  ?entity rdfs:label ?oldlabel .
  BIND(CONCAT(STR( ?oldlabel ), " | SOME ADDITIONAL TEXT I WOULD LIKE TO APPEND MANUALLY")  AS ?label ) .
}

注意三重模式如何找到?oldlabel的匹配并删除它们,而是插入新绑定的?标签。此查询假定定义了一个默认图表,其中包含原始数据和更新目标。如果不是,则需要使用WITH或GRAPH指定图形。 (还包括使用'。'和';'分隔三重模式之间的句法差异的另一个提示。)