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

时间:2019-02-07 20:01:21

标签: sparql wikidata

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

%%A

See it here

现在想在一段时间(日期范围)内找到化学奖得主。

一种方法可能是搜索每个目标年份(每个时间点 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是“ 2014”而最新的?date是“ 2017”

但是,此过滤器失败:

?date

我的想法是将字符串“ 2014”指定为时间点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" . } } ,但这没用。

如何修改Wikidata SPARQL查询以查找/过滤两个时间点之间的结果?

1 个答案:

答案 0 :(得分:0)

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

另一种选择是将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)结束时间< / em>(P3416)。这些属性用于限定许多Wikidata项目中的periods-of-time

Wikidata确实定义了年份,例如2014(Q1999)和2017(Q25290)。但是大多数维基数据项目都不使用years来限定period-of-time的资格。因此,我们必须使用(YEAR(?when)作为方法来设置?date,然后在FILTER上设置?date