我是SPARQL的新手,并尝试了最后有ORDER BY的简单查询,查询我工作正常,但是当我在最后添加ORDER BY时,我得到空响应。你能告诉我这里我做错了什么吗?
工作正常:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpediaowl: <http://dbpedia.org/ontology/>
PREFIX dbpedia: <http://dbpedia.org/resource/>
PREFIX dbpprop: <http://dbpedia.org/property/>
SELECT * WHERE
{
{?private dbpediaowl:city dbpedia:Los_Angeles} UNION {?private dbpprop:location dbpedia:Los_Angeles}
?private dbpprop:established ?yr.
bind(year(now())-?yr as ?age).
FILTER (?age > 100). }
ORDER BY的相同查询返回空响应:
SELECT * WHERE
{
{?private dbpediaowl:city dbpedia:Los_Angeles} UNION {?private dbpprop:location dbpedia:Los_Angeles}
?private dbpprop:established ?yr.
bind(year(now())-?yr as ?age).
FILTER (?age > 100) . }
ORDER BY ?age
有谁能告诉我我做错了什么?
答案 0 :(得分:3)
您可以使用public DBpedia endpoint尝试SPARQL查询。在尝试重新创建查询时,我通过以下查询成功完成了:
select * where {
{
?private dbpedia-owl:city dbpedia:Los_Angeles
}
UNION
{
?private dbpprop:location dbpedia:Los_Angeles
}
?private dbpprop:established ?year.
bind(year(now())-?year as ?age).
filter (?age > 100).
}
limit 10
请注意,该查询中的某些结果具有一些您可能没有预料到的值。例如,
private year age
... ... ...
http://dbpedia.org/resource/Harvard-Westlake_School "''Harvard School for Boys: 1900"@en 2013
http://dbpedia.org/resource/Harvard-Westlake_School "Fully Merged as Harvard-Westlake: 1991"@en 2013
http://dbpedia.org/resource/Harvard-Westlake_School "Westlake School for Girls: 1904''"@en 2013
现在,当我向查询添加order by ?age
时,我会收到一条相当描述性的错误消息,该消息以:
Virtuoso 22003错误SR087:日期时算术的参数错误,无法从值类型189(INTEGER)中减去211(DATETIME)的值。
在深入研究其中一些值的数据类型之后,看起来now()
的数据类型发生了一些非常奇怪的事情(但看起来你的查询正在使用的是正确的) 。看看这个查询:
select ?now ?nowtype where {
values ?value { <urn:ex:value> } # only here so that there are non-bind variables
bind( now() as ?now )
bind( datatype(now()) as ?nowtype )
}
结果是:
now nowtype
2013-09-13T21:11:11.000005+02:00 2013-09-13T21:11:11.000005+02:00
看起来now()
返回的文字的数据类型与时间相同! now
应该返回xsd:dateTime
!为了进行比较,使用Jena的ARQ运行的相同查询返回:
now nowtype
"2013-09-13T15:24:10.908-04:00"^^<http://www.w3.org/2001/XMLSchema#dateTime> <http://www.w3.org/2001/XMLSchema#dateTime>
这里有一些奇怪的事情,我还没有能够构建一个有效的查询。但是,我建议您与他们的mailing list联系并直接询问他们,因为 在您的SPARQL中看起来不像。
这个查询是奇怪的,因为虽然它产生的theYear
的所有值确实至少在100年前,但年龄根本没有意义。
select ?private ?theYear ?age where {
values ?location { dbpedia-owl:city dbpprop:location }
?private ?location dbpedia:Los_Angeles ;
dbpprop:established ?year .
bind( if( datatype(?year) = xsd:int, xsd:integer(?year), year(now()) ) as ?theYear )
bind( year(now()) - ?theYear as ?age )
filter( ?age > xsd:integer(100) )
}
order by ?age
我尝试进行一堆数据类型转换,以确保生成的值具有适当的数据类型,并以此查询结束:
select * where {
values ?location { dbpedia-owl:city dbpprop:location }
?private ?location dbpedia:Los_Angeles ;
dbpprop:established ?established .
bind( xsd:int(year(now())) as ?nowYear )
bind( if( datatype(?established) = xsd:dateTime || datatype(?established) = xsd:date,
year(xsd:dateTime(?established)),
if( datatype(?established) = xsd:integer || datatype(?established) = xsd:int,
xsd:int(?established),
?nowYear ) )
as ?year )
bind( ?nowYear - ?year as ?age )
}
其结果显示所有内容都正确计算,但如果我们向其添加filter( ?age > 100 )
,我们会得到these results,其中大部分年龄都小于100,而所有{{}} {{3}} 1}}值表示我们获得了正确的条目,year
值完全不正确。例如,
age
是完全错误的。