我有一个SPARQL联合查询,其中我加入了来自wikidata和dbpedia的数据。当我运行前两个查询时,需要合理的时间。然而,当我添加第三次服务时,需要花费太多的时间。在第三个查询中,我从前两个查询中获取实体,并通过查看它们是否是‘打击乐器’的子类来筛选它们。
以下是我的查询(关于中东地区返回打击乐器的查询):
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX ps: <http://www.wikidata.org/prop/statement/>
PREFIX pq: <http://www.wikidata.org/prop/qualifier/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX bd: <http://www.bigdata.com/rdf#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX dbp: <http://dbpedia.org/property/>
SELECT DISTINCT
?instrument
(?countryDbpediaID)
(?country as ?wikidataID)
(?countryLabel as ?origin)
WHERE {
SERVICE <https://query.wikidata.org/sparql>
{
SELECT DISTINCT ?country ?countryLabel
WHERE {
?country wdt:P361 wd:Q7204 .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
}
SERVICE <https://dbpedia.org/sparql>
{
SELECT DISTINCT ?intermediateEntityDbpediaID
?intermediateEntityWikidataUri
?intermediateEntityWikidataID
?countryDbpediaID ?description
FROM <http://dbpedia.org>
WHERE { ?countryDbpediaID owl:sameAs ?country;
rdfs:label ?label ;
foaf:depiction ?image;
rdfs:comment ?description .
?intermediateEntityDbpediaID dbp:origin ?countryDbpediaID;
rdfs:label ?intermediateEntityLabel ;
owl:sameAs ?intermediateEntityWikidataUri .
FILTER (LANG(?label) = "en")
FILTER (LANG(?intermediateEntityLabel) = "en")
FILTER (STRSTARTS(STR(?intermediateEntityWikidataUri), STR('http://www.wikidata.org')))
FILTER (LANG(?description) = "en")
BIND(REPLACE(STR(?intermediateEntityWikidataUri),"http://www.wikidata.org/entity/","","i") AS ?intermediateEntityWikidataID)
}
}
SERVICE <https://query.wikidata.org/sparql>
{
SELECT DISTINCT ?instrument
WHERE {
?instrument wdt:P279 wd:Q133163 .
FILTER (?instrument in (URI(?intermediateEntityWikidataUri)))
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
}
}我发现了这个相关的问题,但它并没有帮助我:SPARQL Speed up federated query
有任何方法来优化这个查询吗?
发布于 2022-05-16 23:07:28
这里的三个联邦查询没有任何共享连接变量。从它们返回的唯一变量(在子查询的SELECT DISTINCT子句中)都是不相交的。这意味着计算正在执行两个笛卡尔联接。
这三个子查询分别返回21、504和0结果。因此,我认为最终结果将是零行返回。但是,查询引擎可能正在采取一种非常不理想的路径,以达到这个答案和超时。
更新:
考虑到像?intermediateEntityWikidataUri这样的变量的反复使用,我怀疑这些变量被用来连接跨联邦子查询的数据。但正如所写的,查询无法做到这一点。例如,考虑到SPARQL的自下而上语义,如果不将该变量绑定在同一范围内,就不能在第三个查询的筛选器中使用?intermediateEntityWikidataUri。
不管查询中还有什么,这是:
SERVICE <https://query.wikidata.org/sparql>
{
SELECT DISTINCT ?instrument
WHERE {
?instrument wdt:P279 wd:Q133163 .
FILTER (?instrument in (URI(?intermediateEntityWikidataUri)))
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
}将导致零结果,因为筛选器表达式是使用一个未绑定变量(它将过滤掉所有结果)计算的。
https://stackoverflow.com/questions/72263478
复制相似问题