如何避免维基数据上的 SPARQL 查询超时?

How can I avoid timeout on a SPARQL query on Wikidata?

我正在尝试提取 Wikidata 上一个类别的所有项目,它们各自的页面标题为英文。只要类别不包含很多项目,它就可以正常工作,如下所示:

SELECT ?work ?workLabel
WHERE
{
  ?work wdt:P31/wdt:P279* wd:Q734454.
  ?work rdfs:label ?workLabel .
  FILTER ( LANGMATCHES ( LANG ( ?workLabel ), "en" ) ) 
}
ORDER BY ?work

但是一旦我使用包含更多项目的类别,例如 Q2188189,就会超时(达到查询超时限制)。参见 This example

我试过使用 LIMITOFFSET 子句,但这并没有改变结果。

我也曾尝试插入这样的过滤器 FILTER (regex(?work, '.*Q1.*')) . 以将查询分割成子集,但也没有成功(未找到匹配的记录)。

目前我只提取了 ID,然后 运行 查询以获取每个 ID 的页面标题,但这看起来很愚蠢。

是否有解决超时的方法?

标准方法

如果您想要en.wikipedia.org上有文章的所有音乐作品的页面标题,您必须使用以下查询:

SELECT ?work ?workTitle
WHERE
{
  ?work wdt:P31/wdt:P279* wd:Q2188189.
  ?workLink schema:about ?work ;
    schema:isPartOf <https://en.wikipedia.org/> ;
    schema:name ?workTitle .
}

我试了3次,其中两次都没有超时。

替代方法

如果您无法让它工作,我能想到的唯一解决方法是检索音乐作品的所有可能类型(即子类),并使上述查询适应 single-class 情况.

所以,第一步是:

SELECT ?workType WHERE { ?workType wdt:P279* wd:Q2188189. }

您将获得一千多个结果。对于它们中的每一个(以结果 Q2743 为例),您将必须 运行 以下查询:

SELECT ?work ?workTitle
WHERE
{
  ?work wdt:P31 wd:Q2743.
  ?workLink schema:about ?work ;
    schema:isPartOf <https://en.wikipedia.org/> ;
    schema:name ?workTitle .
}

这将 return 所有 直接 Q2743 实例的项目,而不关心子类。

这个方法有点麻烦,如果你不介意做很多查询的话,可以使用它。这个想法是将复杂性分配给许多查询,这样您就不太可能超过每个查询的超时。