为什么SPARQL查询超时,以及如何优化该查询?

为什么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" }

我有一个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" }
  }
本质上,我正在寻找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