如何避免 Wikidata 上的 SPARQL 查询超时? 标准方法替代方法

问题描述

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

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 .
}

我尝试了三次,其中两次都没有超过超时时间。

替代方法

如果你不能让它工作,我能想象的唯一解决方法是检索音乐作品的所有可能类型(即子类),并将上述查询调整为单类情况。

所以,第一步是:

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 .
}

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

这个方法有点麻烦,但是如果你不关心做很多查询,你可以使用它。这个想法是在许多查询之间划分复杂性,这样你就不太可能超过每个查询的超时时间。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...