Sparql bound()不起作用

时间:2013-04-10 18:08:26

标签: if-statement bind sparql

我是Sparql的新手。我有一个查询来获取不同主题的属性(比如父和父G)。

我尝试过使用

PREFIX ac: <http://ac.com/ns/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX rdf: <htp://www.w3.org/1999/02/22-rdf-syntax-ns#>

CONSTRUCT 
{
  ?item dcterms:isPartOf ?parent .
  ?parent dcterms:isPartOf ?parentG .
  ?item ac:scopedItem ?scopedItem .
}
WHERE 
{
  BIND ( <http://ac.com/content/Test1> as ?item )  .
  ?item dcterms:isPartOf ?parent .
  ?parent dcterms:isPartOf ?parentG .
  OPTIONAL 
  {
    OPTIONAL {?parent ac:htmlAdv ?advert .}
    BIND ( IF (BOUND (?advert), ?parent, ?parentG )  as ?scopedItem  ) .
  }
}

如果?advert未与?parent绑定,我希望使用?parentG并将其设为?scopedItem。这不起作用。我们正在使用Sparql 1.1

1 个答案:

答案 0 :(得分:0)

您的问题是范围界定,SPARQL是自下而上评估的,所以在BIND语句中?parent?parentG都不在范围内,因此无论如何无论?advert是否受约束,你都不会返回任何内容。

您需要将BIND语句移出查询中的一个级别,然后才能正常运行:

PREFIX ac: <http://ac.com/ns/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX rdf: <htp://www.w3.org/1999/02/22-rdf-syntax-ns#>

CONSTRUCT 
{
  ?item dcterms:isPartOf ?parent .
  ?parent dcterms:isPartOf ?parentG .
  ?item ac:scopedItem ?scopedItem .
}
WHERE 
{
  BIND ( <http://ac.com/content/Test1> as ?item )  .
  ?item dcterms:isPartOf ?parent .
  ?parent dcterms:isPartOf ?parentG .
  OPTIONAL 
  {
    ?parent ac:htmlAdv ?advert .
  }
  BIND ( IF (BOUND (?advert), ?parent, ?parentG )  as ?scopedItem  ) .
}

注意这也使得不必使用两个OPTIONAL子句