SPARQL用于直接数据库百科资源或wikiPageRedirects

SPARQL用于直接数据库百科资源或wikiPageRedirects,sparql,dbpedia,Sparql,Dbpedia,我正在尝试按国家名称从dbpedia查询数据。我希望它能找到这个国家的资源,或者通过维基页面重定向找到它。以下是一个工作版本: PREFIX res: <http://dbpedia.org/resource/> PREFIX ont: <http://dbpedia.org/ontology/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?country ?capital ?la

我正在尝试按国家名称从dbpedia查询数据。我希望它能找到这个国家的资源,或者通过维基页面重定向找到它。以下是一个工作版本:

PREFIX res: <http://dbpedia.org/resource/>
PREFIX ont: <http://dbpedia.org/ontology/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?country ?capital ?label 
WHERE {
    { res:Dominion_of_Canada ont:capital ?capital .
    ?capital rdfs:label ?label }
UNION
    { res:Dominion_of_Canada ont:wikiPageRedirects ?country .
    ?country ont:capital ?capital .
    ?capital rdfs:label ?label }

FILTER (lang(?label) = "en") 
} 
和以往一样,速度也很重要。如果资源存在,那么最好跳过wikiPageRedirects上的搜索。

这是怎么回事

PREFIX dbr: <http://dbpedia.org/resource/>

select dbr:France ?capital ?label where {
  {dbr:France a dbpedia-owl:Country.
   dbr:France dbpedia-owl:capital ?capital .
   ?capital rdfs:label ?label .
  }

 union {dbr:France dbpedia-owl:wikiPageRedirects ?redirectPage.
        ?redirectPage dbpedia-owl:capital ?capital.
        ?capital rdfs:label ?label .     
 }
}
前缀dbr:
选择dbr:France?capital?标签位置{
{dbr:France一只dbpedia猫头鹰:国家。
dbr:法国dbpedia猫头鹰:首都?首都。
?大写RDF:标签?标签。
}
union{dbr:France dbpedia owl:wikiPageRedirects?redirectPage。
?重定向页面dbpedia owl:capital?capital。
?大写RDF:标签?标签。
}
}

检查资源是否“存在”有点模糊,因为虹膜只是常量数据。问题是DBpedia是否包含关于特定资源的任何三元组。在您的例子中,您想知道它是否重定向到其他对象,或者它是否有自己的属性。格式为dbpedia:France dbpedia owl:wikiPageRedirects*?country的属性路径可能是最好的方法。如果没有重定向链接,则?国家dbpedia:France,如果有,则?国家为重定向的值。“检查”的唯一方法是寻找那些三元组。我想这意味着你最终会得到这样的结果(类似于我对的回答):

选择?国家?国歌?作者{
#--真正“检查”资源的唯一方法
#--“exists”不是重定向,而是通过检查
#--是否有重定向链接。如果没有,
#--然后呢?国家是dbpedia猫头鹰:法国,就像你想要的
#--如果是的话,那么你就想跟着他们。
dbpedia:France dbpedia owl:wikiPageRedirects*?国家。
#--我在这里使用anthem和author是因为
#--看起来没有可靠的信息
#--关于首都。
?国家公园猫头鹰:国歌?国歌。
?国歌dbpprop:作者?作者。
}

答案有用吗?谢谢你,约书亚。查询的该部分已在运行。我在上面的主要问题中添加了更多的细节。我没有看到任何查询…,但通常更容易将代码作为问题的更新发布。“我希望它使用res:France作为变量?如果该资源存在,国家。”关于“如果该资源存在”的部分没有很好的定义。URI
res:France
存在,它只是一个常量值,就像一个数字或字符串存在一样。不过,我想你的意思是(如果我误解了,请纠正我),如果res:France具有您要查找的属性,那么您希望使用它,但如果没有,请使用res:France重定向到的页面。我想我最初链接的问题可能会有帮助。呵呵,你回答得很快!我的编辑现在完成了。我希望这更清楚。此时,我并不关心是否存在任何质量问题——只是找到我正在寻找的实际dbpedia资源。上面的查询是有效的,但我想知道我是否可以用这种方式计算出?资本和?标签行。嗨,阿里。我澄清了这个问题。这是一个问题,如果资源存在,是否可以通过将资源分配给一个变量来计算出?country部分。该死!这就做到了,并且大大简化了查询。*代表什么?(你是对的-另一个答案是类似的,尽管我不知道它是如何工作的)@Bonjiro The
*
是SPARQL 1.1中支持的一个。如果有一条从a到b的路径包含零次或多次出现的
p
,则模式
a p*b
匹配。如果路径if的长度为零,则意味着a和b必须相同。例如,
x hasChild*?y
会将
?y
绑定到
x
和所有
x
的后代。非常好,这非常有用。非常感谢你,约书亚!
PREFIX dbr: <http://dbpedia.org/resource/>

select dbr:France ?capital ?label where {
  {dbr:France a dbpedia-owl:Country.
   dbr:France dbpedia-owl:capital ?capital .
   ?capital rdfs:label ?label .
  }

 union {dbr:France dbpedia-owl:wikiPageRedirects ?redirectPage.
        ?redirectPage dbpedia-owl:capital ?capital.
        ?capital rdfs:label ?label .     
 }
}