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

Wikidata SPARQL:如何按日期范围过滤?,sparql,wikidata,Sparql,Wikidata,这个查询找到了诺贝尔化学奖的获得者 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" . } }

这个查询找到了诺贝尔化学奖的获得者

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”,最晚的日期为“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" . }
}
选择不同的项目标签时间(年份(?时间)作为日期)
在哪里{
?项目p:P166?奖励统计。
?awardStat ps:P166 wd:Q44585。
?获奖统计pq:P585?何时。
过滤器(?日期“2014”^^pq:P585)
服务wikibase:标签{bd:serviceParam wikibase:语言“en”。}
}
我的想法是将字符串“2014”指定为时间点的
限定符,但这不起作用

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

基于来自(始终高质量)的建议,选择日期在某个日期范围内的项目的最佳方法如下:

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" . }
}
该解决方案使用时间点P585。替代解决方案可以使用开始时间(P580)和结束时间(P582),或开始时段(P3415)结束时段(P3416)。这些属性用于限定许多Wikidata项目中的时间段


Wikidata确实定义了年份,比如2014年(
Q1999
)和2017年(
Q25290
)。但是大多数Wikidata项目都不使用
年来限定
时间段
。因此,我们必须使用
(YEAR(?when)
作为设置
?日期
的方法,然后在
?日期
上进行
过滤
。有几个问题。1)
?日期
不在查询中绑定,只要在投影部分执行即可。在查询中使用
BIND
,或者直接在过滤器中使用
YEAR
功能。2) 文字的数据类型很奇怪。你为什么用它?我的意思是,
YEAR
返回一个int值,而不是属性名为
P585
的内容。使用
选择?日期{…绑定(年份(?时间)为?日期)过滤器(?日期2014)}
现场。如何“直接在
过滤器中使用
年份
功能”。这种方法听起来更有效。理想情况下,我希望使用范围值,如
Q1999
(2014)和
Q25290
(2017),但这些财产目标不在项目文件中。请把答案贴出来,我会接受的。或者,我将把答案写在@AKSW上,并引用其他未显示有效解决方案v的堆栈链接。您的解决方案。好吧,我基本上是想使用
过滤器(2014年(?)时)
而不是先使用
BIND
来获取年份。最后,我想这没什么关系,效率应该没有差别,或者或多或少可以忽略不计。如果你真的想使用多年来的Wikidata实体,您可以使用每年附加的
startTime
endTime
数据。但
startTime
endTime
的值是文本字符串,而不是wikidata实体。我在你的建议中遗漏了什么吗?我们试图遵循wikidata方法(实体如
?s
?o
;最小化文本;最小化空白节点等),但日期/时间似乎仍然表示为文本(例如,在具有数据类型声明的非wikidata SPARQL中,如
xsd
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" . }
}