为什么SPARQL查询超时,以及如何优化该查询?
我有一个SPARQL查询,我通过Wikidata的端点运行它为什么SPARQL查询超时,以及如何优化该查询?,sparql,wikidata,Sparql,Wikidata,我有一个SPARQL查询,我通过Wikidata的端点运行它 SELECT ?bLabel ?b ?hLabel ?a ?cLabel WHERE { wd:Q11462 ?a ?b. wd:Q11095 ?a ?b. ?c ?a ?b. ?h wikibase:directClaim ?a . SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
SELECT ?bLabel ?b ?hLabel ?a ?cLabel
WHERE
{
wd:Q11462 ?a ?b.
wd:Q11095 ?a ?b.
?c ?a ?b.
?h wikibase:directClaim ?a .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
本质上,我正在寻找wd:Q11462和wd:Q11095共享的关系,看看还有什么可以共享这种关系。它达到了60秒的时间限制
但是,如果我分两部分运行多个查询:
首先,获得共享关系
SELECT ?bLabel ?b ?hLabel ?a
WHERE
{
wd:Q11462 ?a ?b.
wd:Q11095 ?a ?b.
?h wikibase:directClaim ?a .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
然后,对于每个获得的关系,运行一个查询,查找与它们共享该关系的其他内容
"""
SELECT ?cLabel
WHERE
{
?c wdt:P131 wd:Q3586.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
"""
整个查询只运行2.5秒
由于受到限制,我希望只需一个查询就能达到相同的速度。我该怎么办?这里有一种使用子查询的方法。这需要六秒钟:
SELECT ?cLabel
WITH {
SELECT ?bLabel ?b ?hLabel ?a
WHERE {
wd:Q11462 ?a ?b.
wd:Q11095 ?a ?b.
?h wikibase:directClaim ?a .
}
} as %results
WHERE {
INCLUDE %results.
?c wdt:P131 wd:Q3586.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
考虑到您观察到的明显差异,以及子查询在概念上与连续运行多个查询的方法有多接近,子查询是自然的扩展。一个通常有用的更通用的技巧是用手动查询标签来替换标签服务
在切换到一些语句较少的项目后,我说服了查询服务。我不能完全理解该输出,但据我所知,是标签服务将其丢弃(底部表格中的第5行):
它似乎试图在此时填充20000多个项目的标签。除了不在第一次查询中使用它之外,SPARQL还提供了添加关于理想操作序列的提示的功能,这在这里可能很有用。我认为应该是
?c?a?b
,但您的分析似乎很准确。当我删除该服务时,它显著提高了速度。谢谢
9 com.bigdata.bop.BOp.bopId
CONTROLLER com.bigdata.bop.BOp.evaluationContext
false com.bigdata.bop.PipelineOp.pipelined
true com.bigdata.bop.PipelineOp.sharedState
ServiceNode com.bigdata.bop.controller.ServiceCallJoin.serviceNode
wdq com.bigdata.bop.controller.ServiceCallJoin.namespace
1596209250127 com.bigdata.bop.controller.ServiceCallJoin.timestamp
[b, h, c] com.bigdata.bop.join.HashJoinAnnotations.joinVars
null com.bigdata.bop.join.JoinAnnotations.constraints