微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何避免 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 实例的项目,而不关心子类。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?