在时间范围内改善SPARQL

时间:2019-04-11 13:10:01

标签: sparql wikidata

我正在尝试使用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 个答案:

答案 0 :(得分:2)

步骤1:即使没有“结束时间”值,也要使查询模式匹配。可以使用OPTIONAL来实现该三重模式:

OPTIONAL { ?stmt pq:P582 ?v3 }

步骤2:更改过滤器,以使其接受结束时间变量?v3没有值的解决方案。可以使用bound函数来完成此操作,如果有值,该函数将返回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)