您可以使用公共 DBpedia 端点尝试 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
SPARQL 结果
请注意,该查询中的某些结果具有一些您可能没有预料到的值。例如,
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 )
}
SPARQL 结果
结果是:
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>
这里发生了一些奇怪的事情,我还不能构建一个有效的查询。但是,我建议您与他们的邮件列表取得联系并直接询问他们,因为这在您的 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 )
,我们会得到这些结果,其中很多年龄都小于 100,虽然所有的year
值都表明我们得到了正确的条目,但这些age
值完全不正确。例如,
private http://dbpedia.org/resource/UCLA_Graduate_School_of_Education_and_Information_Studies
now 2013
then 1881
age 66
完全错了。