我是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
答案 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
子句