2

我是 Sparql 的新手,我有一个查询要从不同的主题(比如 parent 和 parentG)获取属性。

我试过使用

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

4

1 回答 1

1

您的问题是范围界定之一,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不需要使用两个子句

于 2013-04-10T18:14:06.017 回答