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" . }
}
现在想查找某个时间段(日期范围)内的化学奖获得者。
一种方法可能是搜索每个目标年份(每个 时间点 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" . }
}
另一种方法是将 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
并没有被大多数维基数据项用来限定 period-of-time
。所以我们必须使用 (YEAR(?when)
作为设置 ?date
的方法,然后 FILTER
on ?date
此查询查找诺贝尔化学奖获得者。
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
,但这没有用。
如何将 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" . }
}
另一种方法是将 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
并没有被大多数维基数据项用来限定 period-of-time
。所以我们必须使用 (YEAR(?when)
作为设置 ?date
的方法,然后 FILTER
on ?date