SPARQL 联邦查询不返回所有解决方案
SPARQL Federated Query Not Returning All Solutions
这是 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(对于 ?s)。我认为这是因为 John McCain 是前 'x' 个结果中唯一的匹配项,但我不知道如何查询 return 所有匹配项。例如,如果我添加如下过滤器:
SERVICE <http://dbpedia.org/sparql> {
?s rdfs:label ?name .
?s rdf:type foaf:Person .
FILTER(?name = "John McCain"@en || ?name = "Jamie Oliver"@en)
}
然后它正确 returns dbpedia:Jamie_Oliver 和 dbpedia:John_McCain。除非我专门将其添加到像这样的过滤器中,否则还有许多像 Jamie Oliver 这样的其他匹配项不会通过。
谁能解释一下提取剩余匹配项的方法?谢谢
看起来这个问题的原因是服务块试图从 DBPedia 中提取所有 foaf:Persons,然后根据我本地的 Stardog 数据库过滤它们。由于在查询 DBPedia 时有 10,000 个结果限制,因此只会找到出现在 10,000 个任意 Persons 集合中的匹配项。为了解决这个问题,我编写了一个脚本,将包含我的 Stardog 数据库中每个字符串名称的 FILTER 块放在一起,并将其附加到 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, ...)
}
这是 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(对于 ?s)。我认为这是因为 John McCain 是前 'x' 个结果中唯一的匹配项,但我不知道如何查询 return 所有匹配项。例如,如果我添加如下过滤器:
SERVICE <http://dbpedia.org/sparql> {
?s rdfs:label ?name .
?s rdf:type foaf:Person .
FILTER(?name = "John McCain"@en || ?name = "Jamie Oliver"@en)
}
然后它正确 returns dbpedia:Jamie_Oliver 和 dbpedia:John_McCain。除非我专门将其添加到像这样的过滤器中,否则还有许多像 Jamie Oliver 这样的其他匹配项不会通过。
谁能解释一下提取剩余匹配项的方法?谢谢
看起来这个问题的原因是服务块试图从 DBPedia 中提取所有 foaf:Persons,然后根据我本地的 Stardog 数据库过滤它们。由于在查询 DBPedia 时有 10,000 个结果限制,因此只会找到出现在 10,000 个任意 Persons 集合中的匹配项。为了解决这个问题,我编写了一个脚本,将包含我的 Stardog 数据库中每个字符串名称的 FILTER 块放在一起,并将其附加到 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, ...)
}