代码之家  ›  专栏  ›  技术社区  ›  Jay Gray

wikidata-sparql:如何按日期范围过滤?

  •  1
  • Jay Gray  · 技术社区  · 6 年前

    这个问题找到了诺贝尔化学奖的获奖者。

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

    See it here

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

    一种方法可能是搜索每个目标年(每个 时间点 P585 )然后连接结果。

    但更好的方法可能是从上面过滤结果集。例如,筛选最早的 ?date 是“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" . }
    }
    

    我的想法是将字符串“2014”指定为 qualifier 对于 时间点 但那不起作用。

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jay Gray    6 年前

    基于(总是高质量的)建议 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)和 结束时间 (P585),或 启动期 (P34 15) 结束期 (P34 16)。这些属性用于限定 periods-of-time 在许多维基数据项中。

    维基数据确实定义了年份,比如2014年( Q1999 (2017) Q25290 )但是 years 不是大多数wikidata项目用来限定 period-of-time . 所以我们必须使用 (YEAR(?when) 作为设置的方法 ?date 然后 滤波器 ?日期