Wikidata SPARQL:如何按日期范围过滤?

Wikidata SPARQL: how to filter by date range?

此查询查找诺贝尔化学奖获得者。

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" . }
}

See it here

现在想查找某个时间段(日期范围)内的化学奖获得者。

一种方法可能是搜索每个目标年份(每个 时间点 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,但这没有用。

如何将 Wikidata SPARQL 查询修改为两个时间点之间的 find/filter 结果?

根据 AKSW 的(始终是高质量的)建议,select 日期范围内的项目的最佳方法如下:

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" . }
}

另一种方法是将 BINDFILTER

一起使用
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 并没有被大多数维基数据项用来限定 period-of-time。所以我们必须使用 (YEAR(?when) 作为设置 ?date 的方法,然后 FILTER on ?date