如何避免维基数据上的 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
我试过使用 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 .
}
我试了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
实例的项目,而不关心子类。
这个方法有点麻烦,如果你不介意做很多查询的话,可以使用它。这个想法是将复杂性分配给许多查询,这样您就不太可能超过每个查询的超时。
我正在尝试提取 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
我试过使用 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 .
}
我试了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
实例的项目,而不关心子类。
这个方法有点麻烦,如果你不介意做很多查询的话,可以使用它。这个想法是将复杂性分配给许多查询,这样您就不太可能超过每个查询的超时。