针对时间范围改进 SPARQL

Improve SPARQL for the time range

我正在尝试使用 python 编程制作一些 sparql 查询语句,但我卡在了下面。我想做的是以某种一般方式对时间范围进行查询的语句。下面给我举个例子。问题是 "Who was the mayor of the new york city in %(YEAR)?" ,我写的相应的 sparql 与下面相同。对于之前的范围,它工作正常。但最近的范围,它不起作用,因为现任市长没有结束时间。换句话说,我可以编写类似 FIlTER (?v3 has no value or ?v3 > "2011-01-01"^^xsd:dateTime) 的代码吗?我想用一个查询来改进我的 sparql,以更通用的方式对应于时间范围问题。

案例 1:谁是 2011 年纽约市的市长? -好的

SELECT DISTINCT ?v ?vLabel ?v2 ?v3
WHERE
{
  wd:Q60 p:P6 ?stmt.
  ?stmt  ps:P6 ?v;
         pq:P580 ?v2;
         pq:P582 ?v3.
  FILTER (?v2 < "2011-01-01"^^xsd:dateTime) # start time
  FILTER (?v3 > "2011-01-01"^^xsd:dateTime) # end time

  SERVICE wikibase:label { bd:serviceParam wikibase:language "ko,en". }
}
ORDER BY DESC (?v2)

案例 2:谁是 2016 年纽约市的市长? - 无人接听

SELECT DISTINCT ?v ?vLabel ?v2 ?v3
WHERE
{
  wd:Q60 p:P6 ?stmt.
  ?stmt  ps:P6 ?v;
         pq:P580 ?v2;
         pq:P582 ?v3
  FILTER (?v2 < "2016-01-01"^^xsd:dateTime) # start time
  FILTER (?v3 > "2016-01-01"^^xsd:dateTime) # end time

  SERVICE wikibase:label { bd:serviceParam wikibase:language "ko,en". }
}
ORDER BY DESC (?v2)

第 1 步:即使“结束时间”没有值,也获取要匹配的查询模式。这可以使用 OPTIONAL 来完成该三重模式:

OPTIONAL { ?stmt pq:P582 ?v3 }

第 2 步:更改过滤器,使其接受结束时间变量 ?v3 没有值的解决方案。这可以使用 bound 函数来完成,如果有一个值 returns true 否则 false

FILTER (!bound(?v3) || ?v3 > "2016-01-01"^^xsd:dateTime) # end time

完成查询:

SELECT DISTINCT ?v ?vLabel ?v2 ?v3
WHERE
{
  wd:Q60 p:P6 ?stmt.
  ?stmt  ps:P6 ?v;
         pq:P580 ?v2.
  OPTIONAL { ?stmt pq:P582 ?v3 }
  FILTER (?v2 < "2016-01-01"^^xsd:dateTime) # start time
  FILTER (!bound(?v3) || ?v3 > "2016-01-01"^^xsd:dateTime) # end time

  SERVICE wikibase:label { bd:serviceParam wikibase:language "ko,en". }
}
ORDER BY DESC (?v2)