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