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