Wikidata SPARQL: как фильтровать по диапазону дат? - PullRequest
0 голосов
/ 07 февраля 2019

Этот запрос находит лауреатов Нобелевской премии по химии.

SELECT DISTINCT ?item ?itemLabel ?when (YEAR(?when) as ?date)
WHERE {
  ?item p:P166 ?awardStat .
  ?awardStat ps:P166 wd:Q44585 .
  ?awardStat pq:P585 ?when .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" . }
}

См. Здесь

Теперь хотел бы найти лауреатов химии в периодвремя (диапазон дат).

Одним из подходов может быть поиск каждого целевого года (каждый момент времени P585), а затем объединение результатов.

Нолучшим подходом может быть фильтрация набора результатов сверху.Например, фильтр, где самым ранним ?date является «2014», а самым последним ?date является «2017»

Однако этот фильтр завершается ошибкой:

SELECT DISTINCT ?item ?itemLabel ?when (YEAR(?when) as ?date)
WHERE {
  ?item p:P166 ?awardStat .
  ?awardStat ps:P166 wd:Q44585 .
  ?awardStat pq:P585 ?when .
FILTER(?date <= "2017"^^pq:P585 && ?date > "2014"^^pq:P585)
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" . }
}

Моя мысль заключалась в том, чтобы указатьстрока «2014» как qualifier для момента времени , но это не сработало.

Как изменить запрос SPARQL Wikidata для поиска / фильтрации результатов между двумямоменты времени?

1 Ответ

0 голосов
/ 08 февраля 2019

На основе (всегда высокого качества) рекомендаций от AKSW лучший способ выбрать товары с датами, которые встречаются в диапазоне дат, заключается в следующем:

SELECT DISTINCT ?item ?itemLabel ?when (YEAR(?when) as ?date)
WHERE {
  ?item p:P166 ?awardStat .
  ?awardStat ps:P166 wd:Q44585 . 
  ?awardStat pq:P585 ?when . 
FILTER(YEAR(?when) <= 2017 && YEAR(?when) > 2014)
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" . }
}

альтернативаиспользовать BIND с FILTER

SELECT DISTINCT ?item ?itemLabel ?when (YEAR(?when) as ?date)
WHERE {
  ?item p:P166 ?awardStat .
  ?awardStat ps:P166 wd:Q44585 . 
  ?awardStat pq:P585 ?when . 
BIND(YEAR(?when) as ?date) FILTER(?date <= 2017 && ?date > 2014)
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" . }
}

Решение использует момент времени P585.Альтернативное решение может использовать время начала (P580) и время окончания (P582) или время начала (P3415) время окончания (P3416).Эти свойства используются для квалификации periods-of-time во многих элементах Викиданных.

Викиданные действительно определяют годы, например, 2014 (Q1999) и 2017 (Q25290).Но years не используются большинством предметов Wikidata для квалификации period-of-time.Поэтому мы должны использовать (YEAR(?when) в качестве метода установки ?date, а затем FILTER на ?date

...