【问题标题】:Fast publication date lookup with Wikidata Query Service使用 Wikidata 查询服务快速查找发布日期
【发布时间】:2019-03-04 04:35:46
【问题描述】:

有没有办法在 Wikidata Query Service 的 SPARQL 中快速查找发布日期以查找某个日期的发布,例如今天?

我希望这样的查询会很快:

SELECT * WHERE {
  ?work wdt:P577 ?datetime .
  BIND("2018-09-28T00:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> as ?now_datetime)
  FILTER (?datetime = ?now_datetime)
}
LIMIT 10

但是,在 https://query.wikidata.org 的 SPARQL 端点上使用它时会超时

范围查询似乎都不是很快。下面的查询在将近 30 秒后返回:

SELECT * WHERE {
  ?work wdt:P577 ?datetime .
  FILTER (?datetime > "2018-09-28T00:00:00Z"^^xsd:dateTime)
}
LIMIT 1

【问题讨论】:

    标签: sparql wikidata


    【解决方案1】:

    诀窍是避免全扫描和使用索引:

    1. VALUES:

      SELECT * WHERE {
        VALUES (?datetime) {("2018-09-28T00:00:00Z"^^xsd:dateTime)}
        ?work wdt:P577 ?datetime .
      } LIMIT 10
      

      Try it!

    2. hint:rangeSafe:

      SELECT * WHERE {
        VALUES (?datetime) {("2018-09-28T00:00:00Z"^^xsd:dateTime)}
        ?work wdt:P577 ?date_time .
        hint:Prior hint:rangeSafe true .
        FILTER (?date_time > ?datetime)
      } LIMIT 10
      

      Try it!

      [rangeSafe 提示] 声明 [s] 特定三元组模式的查询所触及的数据是强类型的,因此允许将范围过滤器下推到索引上。

    【讨论】:

    • 为什么VALUES 是单个文字查找所必需的,而不仅仅是SELECT * WHERE { ?work wdt:P577 "2018-09-28T00:00:00Z"^^xsd:dateTime . } LIMIT 10
    • @AKSW,显然,也可以。我认为"2018-09-28T00:00:00Z"^^xsd:dateTime 是一种“内联数据”,为此设计了VALUES
    猜你喜欢
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    相关资源
    最近更新 更多