1
PREFIX ex: <http://www.semanticweb.org/caeleanb/ontologies/twittermap#>
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name (STR(?name) AS ?strip_name) ?name2
WHERE {
  ?p ex:displayName ?name2 .
  SERVICE <http://dbpedia.org/sparql> {
    { ?s rdfs:label ?name .
      ?s rdf:type foaf:Person . }
    UNION
    { ?x rdfs:label ?name .
      ?x dbo:wikiPageRedirects ?s . }

  }
  FILTER(STR(?name) = ?name2) .
}

这是我发送到我的 Stardog SPARQL 端点(本地托管)的 SPARQL 查询。我知道缺少一堆前缀,但我保证这不是前缀问题,Stardog 保留了其余的前缀。

该查询应该foaf:Person在我自己的本体中找到与显示名称资源共享标签字符串的所有 s。UNION 的原因是试图捕获所有重定向到 Person 的页面(但如果该部分看起来搞砸了,请告诉我)。

基本上问题是上面的查询给了我这样的输出:

name              strip_name    name2
John McCain (en) | John McCain | John McCain
John McCain (de) | John McCain | John McCain
John McCain (es) | John McCain | John McCain
...

但约翰麦凯恩不是占位符,他是唯一一个出现的人,只是用一堆不同的语言。但是,我希望会出现更多,因为我可以运行以下查询:

PREFIX ex: <http://www.semanticweb.org/caeleanb/ontologies/twittermap#>
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name (STR(?name) AS ?strip_name) ?name2
WHERE {
  ?p ex:displayName ?name2 .
  SERVICE <http://dbpedia.org/sparql> {
    { ?s rdfs:label ?name .
      ?s rdf:type foaf:Person . 
      FILTER(?name="Bill Nye"@en)}
    UNION
    { ?x rdfs:label ?name .
      ?x dbo:wikiPageRedirects ?s . 
    FILTER(?name="Bill Nye"@en)}

  }
  FILTER(STR(?name) = ?name2) .
}

并获得如下输出:

name           strip_name  name2
Bill Nye (en) | Bill Nye | Bill Nye

我可以用我知道应该在我的本体中匹配的其他名称重复这个技巧,例如“Jamie Oliver”和“Donald Trump”,但由于某种原因,出现在一般查询版本中的唯一名称是 John McCain。谁能给我解释一下?我确定我不理解 SERVICE 块的某些部分,但我尝试了很多不同的配置,但无法让这个查询正常工作。谢谢你的帮助。

4

0 回答 0