询问 SPARQL 资源是否存在

Ask if SPARQL resource exists

检查 SPARQL 资源是否存在的好方法是什么? 我正在寻找等同于触发 HTTP GET 请求的方法,例如http://dbpedia.org/resource/Game_of_Thrones 并检查 HTTP 状态代码,但我想使用 SPARQL 查询来完成。

我想到了这样的事情:

ASK {<http://dbpedia.org/resource/Game_of_Thrones> a <http://dbpedia.org/resource/>} 

我确定有一个很好的方法可以做到这一点,但我找不到它。

注意:我不想检查特定三元组是否存在。我只想知道资源是否存在。

SPARQL 是一种 RDF 查询语言。 RDF 三元组由主语、谓语和宾语组成。

您只需要使用 UNION 作为析取来检查 URI 是否存在于这些位置中。

ASK {
    VALUES (?r) { (dbr:Game_of_Thrones) }
        { ?r ?p ?o }
        UNION
        { ?s ?r ?o }
        UNION
        { ?s ?p ?r }
    } 

虽然 SPARQL 规范 doesn't 允许谓词位置 [],但 DBpedia(即服务于 DBpedia 端点的 Virtuoso 服务器)理解这一点:

ASK {
    VALUES (?r) { (dbr:Game_of_Thrones) }
        { ?r [] [] }
        UNION
        { [] ?r [] }
        UNION
        { [] [] ?r }
    } 

我找到了另一种检查给定字符串是否存在 dbpedia 资源的方法。下面查询的第一部分将检查 dbpedia 中是否存在字符串 "Bob Marly" 的资源。第二部分将检查字符串 "Bob Marly" 是否将页面重定向到任何其他页面。您需要将每个字符串的第一个字母大写才能获得正确的结果。

我认为这种方式更好,因为即使您犯了一些小的拼写错误,您也会知道资源是否存在,而且您也不必用下划线替换空格(并不是说这有什么大不了的)。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?s WHERE {
  {
    ?s rdfs:label "Bob Marly"@en ;
       a owl:Thing .       
  }
  UNION
  {
    ?altName rdfs:label "Bob Marly"@en ;
             dbo:wikiPageRedirects ?s .
  }
}

参考:http://www.snee.com/bobdc.blog/2011/05/using-sparql-to-find-the-right.html

还有一种方法可以实现上述目的:

SELECT ?subject ?label

WHERE { 
?subject rdfs:label ?label 

FILTER (langMatches(lang(?label), "EN")) .
FILTER ( ?label = "Two"@en )

} LIMIT 100