问题描述
我正在尝试提取维基数据上某个类别的所有项目,以及它们各自的英文页面标题。只要类别不包含很多项目,它就可以正常工作,如下所示:
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
我曾尝试使用 LIMIT
或 OFFSET
子句,但这并没有改变结果。
我也尝试插入这样的过滤器 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
实例的项目,而不关心子类。
这个方法有点麻烦,但是如果你不关心做很多查询,你可以使用它。这个想法是在许多查询之间划分复杂性,这样你就不太可能超过每个查询的超时时间。