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

SPARQL联合查询未返回所有解决方案,sparql,dbpedia,federated-queries,Sparql,Dbpedia,Federated Queries,这是一种进化 基本上,我很难从远程端点获取SPARQL查询的所有解决方案。我通读了第2.4节,因为它似乎描述了一种与我几乎相同的情况 其想法是,我想根据本地RDF图中的信息从DBPedia筛选结果。查询如下: PREFIX ns1: <http://www.semanticweb.org/caeleanb/ontologies/twittermap#> PREFIX dbo: <http://dbpedia.org/ontology/> SEL

这是一种进化

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

其想法是,我想根据本地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 .
  }
}
前缀ns1:
前缀dbo:
挑选*
在哪里{
?p ns1:显示名称?名称。
服务{
?s rdfs:标签?名称。
?s rdf:类型foaf:人员。
}
}
我得到的唯一结果是dbpedia:John_McCain(for?s)。我认为这是因为John McCain是第一个“x”结果中唯一的匹配项,但我不知道如何让查询返回所有匹配项。例如,如果我添加一个过滤器,如:

SERVICE <http://dbpedia.org/sparql> {
  ?s rdfs:label ?name .
  ?s rdf:type foaf:Person .
  FILTER(?name = "John McCain"@en || ?name = "Jamie Oliver"@en)
}
服务{
?s rdfs:标签?名称。
?s rdf:类型foaf:人员。
过滤器(?name=“John McCain”@en | |?name=“Jamie Oliver”@en)
}
然后它正确地返回dbpedia:Jamie_Oliver和dbpedia:John_McCain。还有几十种像杰米·奥利弗这样的匹配,除非我专门将其添加到这样的过滤器中,否则无法通过


有人能解释提取其余匹配项的方法吗?谢谢。

这个问题的原因似乎是服务块试图从DBPedia中提取所有foaf:Persons,然后根据我的本地Stardog数据库对其进行过滤。由于查询DBPedia时有10000个结果限制,因此只会找到10000个任意人员集合中出现的匹配项。为了解决这个问题,我编写了一个脚本,将包含Stardog db中每个字符串名称的筛选器块组合在一起,并将其附加到服务块以进行远程筛选,从而避免达到10000个结果限制。它看起来像这样:

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, ...)
}
前缀rdf:
前缀dbo:
前缀dbr:
前缀foaf:
前缀rdfs:
前缀dbo:
前缀ns1:
构造{
?s rdf:ns1型:人;
ns1:政治家。
}
在哪里{
?s rdfs:标签?名称。
?s rdf:类型dbo:政治家。
过滤器(?名称输入(“约翰·麦凯恩”@en,…)
}

假设首先计算
服务
子句,您就无能为力了,因为公共DBpedia端点的默认限制是单个查询返回10000个结果。我很确定,您的三重存储的联邦查询引擎不会考虑这一点。顺便说一句,知道w总是很有趣的使用的是三重存储。我使用的是Stardog。但是该死:/所以基本上我从DBPedia收到10000个结果,这只足够匹配John McCain?当我使用过滤器时,我将大小减少到10000以下,以便可以看到更多匹配?我猜用于联邦查询的SPARQL标准假设retur没有技术限制ned resultset在指定语义时-这确实有意义。对,我想这只是偶然的机会,John McCain在前10000个匹配结果中。@AKSW嗯,我刚刚编写了一个脚本来创建一个包含我想要匹配的所有字符串的过滤器(比如过滤器(?name=“name1”|?name=“name2”…),但我得到了一个HTTP 500(内部服务器错误)当我尝试执行查询时。我的筛选器的长度有限制吗?哦,是的,对Virtuoso的HTTP GET请求的长度有限制。据我所知,它是查询字符串的
10000字节
长度。对于较长的查询,您必须使用POST请求,只有两个小注释:1。)使用更简洁的海龟语法2。)使用
的rdf:type dbo:political就足够了。
因为
dbo:political
dbo:Person
的一个子类,它是
foaf:Person
@Evan的一个等价类,还有一个小评论:知道
a
可能是性能杀手。如果您使用的是
(或类似的值),那么您可能不需要这些
a
。@StanislavKralin,对不起,我对SPARQL非常陌生,我不确定如何进行替换。我相信我理解VALUES块允许基于允许值表进行多维过滤,但是我是否仍然需要指定类似这样的内容:
WHERE{s?p?o}
VALUES(?p?o){(rdf:type dbo:political)}
在结果从DBPedia返回后,通过rdf:type进行过滤,这会提高性能吗?@Evan,
VALUES
是提供内联数据的更规范的形式,但我不认为
VALUES(?name){(“John McCain”@en)(“John McGain”@en)}
FILTER(?name IN)更有效(“约翰·麦凯恩”@en,“约翰·麦根”@en,…)
。但我的意思是,如果没有
?s rdf:type dbo:political
,您的查询可能会更高效,尽管可能会出现一些不相关的结果…@StanislavKralin啊,我明白了。我很感激这个提示,但我认为我必须在我的用例中保留查询的这一部分。幸运的是,我不需要太担心性能,因为use I将提前运行几个类似的
CONSTRUCT
查询,以检索Stardog db的三元组,该数据库基本上被视为静态数据。