如何将外部SPARQL端点的字符串标签与本地本体中的字符串标签相匹配?

时间:2017-10-20 19:46:32

标签: sparql dbpedia federated-queries

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。 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

我可以用其他名字重复这个技巧,我知道这些名字应该与我的本体论相匹配,例如#34; Jamie Oliver&#34;和唐纳德特朗普&#34;但出于某种原因,在查询的一般版本中出现的唯一名称是John McCain。任何人都可以向我解释这个吗?我确定我不了解SERVICE块的某些部分,但我尝试了很多不同的配置,无法让这个查询正常工作。谢谢你的帮助。

0 个答案:

没有答案
相关问题