此查询查找诺贝尔化学奖的获得者。
%%A
现在想在一段时间(日期范围)内找到化学奖得主。
一种方法可能是搜索每个目标年份(每个时间点 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查询以查找/过滤两个时间点之间的结果?
答案 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" . }
}
另一种选择是将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)结束时间< / em>(P3416)。这些属性用于限定许多Wikidata项目中的periods-of-time
。
Wikidata确实定义了年份,例如2014(Q1999
)和2017(Q25290
)。但是大多数维基数据项目都不使用years
来限定period-of-time
的资格。因此,我们必须使用(YEAR(?when)
作为方法来设置?date
,然后在FILTER
上设置?date