Быстрый поиск даты публикации с помощью службы запросов Викиданных

Есть ли способ быстро найти даты публикации в 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

Однако время ожидания истекает при использовании на конечной точке SPARQL на https://query.wikidata.org.

Запрос диапазона не кажется быстрым. Запрос ниже возвращается почти через 30 секунд:

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

person Finn Årup Nielsen    schedule 28.09.2018    source источник


Ответы (1)


Уловка состоит в том, чтобы избежать полного сканирования и использовать индексы:

  1. VALUES:

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

    Попробуйте!

  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
    

    Попробуйте!

    [rangeSafe подсказка] объявляют [s], что данные, затронутые запросом для определенного тройного шаблона, строго типизированы, что позволяет поместить фильтр диапазона в индекс.

person Stanislav Kralin    schedule 28.09.2018
comment
почему VALUES необходим для единственного буквального поиска, а не только SELECT * WHERE { ?work wdt:P577 "2018-09-28T00:00:00Z"^^xsd:dateTime . } LIMIT 10? - person UninformedUser; 28.09.2018
comment
@AKSW, конечно, тоже нормально. Я рассматриваю "2018-09-28T00:00:00Z"^^xsd:dateTime как своего рода встроенные данные, для которых предназначен VALUES. - person Stanislav Kralin; 28.09.2018