针对时间范围改进 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)
我正在尝试使用 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)