Sparql 如何加速这个联合查询?

Sparql 如何加速这个联合查询?,sparql,wikidata,Sparql,Wikidata,我有一个查询,它带来了一个dbo:Writer并且在DBpedia和Wikidata中声明了不同出生日期的人。我最初写它是为了独立运行,但现在我运行的是Wikidata。这相当慢,有趣的是,当我不使用Wikidata endpoint withSERVICE(我在这里可以负担得起)调用时,它会变得更慢。我很想知道为什么会这样。但我的主要问题是,如何优化它?以下是查询: PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX rdfs:

我有一个查询,它带来了一个
dbo:Writer
并且在DBpedia和Wikidata中声明了不同出生日期的人。我最初写它是为了独立运行,但现在我运行的是Wikidata。这相当慢,有趣的是,当我不使用Wikidata endpoint with
SERVICE
(我在这里可以负担得起)调用时,它会变得更慢。我很想知道为什么会这样。但我的主要问题是,如何优化它?以下是查询:

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>

SELECT DISTINCT ?personDBP ?personWD ?personWDLabel ?BirthDateDBP ?BirthDateWD

WHERE {


   SERVICE <http://dbpedia.org/sparql> {
      ?personDBP a dbo:Writer ;
      dbo:birthDate ?BirthDate_DBP;
      owl:sameAs ?personWD .
      FILTER REGEX (?personWD, "wikidata.org")
      BIND (xsd:date(?BirthDate_DBP) AS ?BirthDateDBP)
   }

    SERVICE <https://query.wikidata.org/sparql>  {
      ?personWD wdt:P569 ?BirthDate_WD .
      BIND (xsd:date(?BirthDate_WD) AS ?BirthDateWD)  
    }

FILTER (?BirthDateDBP != ?BirthDateWD)

SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }

}

ORDER BY DESC(?BirthDateDBP)

LIMIT 50
前缀owl:
前缀rdfs:
前缀dbo:
前缀dbp:
选择DISTINCT?personDBP?personWD?personWDLabel?BirthDateDBP?BirthDateWD
在哪里{
服务{
?个人dbo:作者;
dbo:出生日期?出生日期\u DBP;
猫头鹰:sameAs?personWD。
过滤正则表达式(?personWD,“wikidata.org”)
绑定(xsd:date(?BirthDate_DBP)为BirthDateDBP)
}
服务{
?个人wdt:P569?出生日期。
绑定(xsd:date(?BirthDate_WD)为BirthDateWD)
}
过滤器(?BirthDateDBP!=?BirthDateWD)
服务wikibase:label{bd:serviceParam wikibase:language“[AUTO_language],en.”
}
按描述排序(?BirthDateDBP)
限制50

这一切都取决于联邦查询引擎。我的意思是,显然有多种方法来计算结果,最明显的是从两个服务中获取所有数据并进行连接。显然,如果两个服务的结果集都很大,即它必须获取大量数据,更糟糕的是,在没有能力使用优化的数据结构(甚至数据库索引等)的情况下对这些数据进行连接,这可能会很昂贵。另一种方法可能是只计算查询的一部分和“管道”中间绑定到另一个请求中,即我们将负载带到另一个服务。长话短说,这都取决于实现,SPARQL标准没有在任何方向限制实现-它只需要在最后返回正确的结果-我知道这并不奇怪。关于你的问题,您可以尝试Blazegraph查询提示:啊,在我忘记之前-DBpedia公共端点的默认限制是每个查询10000个结果,因此,您的查询无论如何都是不完整的。您只能通过服务内的子查询运行此“分页”,但不幸的是,不能通过单个SPARQL查询运行。这一切都取决于联邦查询引擎。我的意思是,显然有多种方法来计算结果,最明显的是从两个服务中获取所有数据并进行连接。显然,如果两个服务的结果集都很大,即它必须获取大量数据,更糟糕的是,在没有能力使用优化的数据结构(甚至数据库索引等)的情况下对这些数据进行连接,这可能会很昂贵。另一种方法可能是只计算查询的一部分和“管道”中间绑定到另一个请求中,即我们将负载带到另一个服务。长话短说,这都取决于实现,SPARQL标准没有在任何方向限制实现-它只需要在最后返回正确的结果-我知道这并不奇怪。关于你的问题,您可以尝试Blazegraph查询提示:啊,在我忘记之前-DBpedia公共端点的默认限制是每个查询10000个结果,因此,您的查询无论如何都是不完整的。您只能通过服务内部的子查询运行此“分页”,但不幸的是,不能通过单个SPARQL查询运行。