SPARQL联合查询未返回所有解决方案

时间:2017-10-21 11:03:37

标签: sparql dbpedia federated-queries

这是this question的演变。

基本上我无法从远程端点获取SPARQL查询的所有解决方案。我已阅读第2.4节here,因为它似乎描述了与我的情况几乎相同的情况。

我的想法是,我想根据本地RDF图中的信息从DBPedia中过滤我的结果。查询在这里:

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

SELECT *
WHERE {
  ?p ns1:displayName ?name .
  SERVICE <http://dbpedia.org/sparql> {
    ?s rdfs:label ?name .
    ?s rdf:type foaf:Person .
  }
}

我得到的唯一结果是dbpedia:John_McCain(for?s)。我认为这是因为约翰麦凯恩是第一场比赛中唯一一场比赛#x;结果,但我无法弄清楚如何让查询返回所有匹配项。例如,如果我添加一个过滤器,如:

SERVICE <http://dbpedia.org/sparql> {
  ?s rdfs:label ?name .
  ?s rdf:type foaf:Person .
  FILTER(?name = "John McCain"@en || ?name = "Jamie Oliver"@en)
}

然后它正确返回BOTH dbpedia:Jamie_Oliver和dbpedia:John_McCain。除了我特意将它添加到像这样的过滤器之外,还有许多像Jamie Oliver这样的其他比赛没有通过。

有人可以解释提取剩余比赛的方法吗?感谢。

1 个答案:

答案 0 :(得分:2)

看起来这个问题的原因是SERVICE块试图从DBPedia中提取所有foaf:Persons,然后根据我的本地Stardog db过滤它们。由于查询DBPedia时有10,000个结果限制,因此只能找到在10,000个任意人员集合中发生的匹配。为了解决这个问题,我编写了一个脚本,将包含每个字符串名称的FILTER块放在我的Stardog数据库中,并将其附加到SERVICE块以远程过滤,从而避免达到10,000个结果限制。它看起来像这样:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX ns1: <http://www.semanticweb.org/caeleanb/ontologies/twittermap#>

CONSTRUCT{
  ?s rdf:type ns1:Person ;
    ns1:Politician .
}
WHERE {
    ?s rdfs:label ?name .
    ?s rdf:type dbo:Politician .
    FILTER(?name IN ("John McCain"@en, ...)
}