sparql - order返回空响应

时间:2013-09-13 18:31:23

标签: sparql dbpedia

我是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

有谁能告诉我我做错了什么?

1 个答案:

答案 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

SPARQL results

请注意,该查询中的某些结果具有一些您可能没有预料到的值。例如,

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 results

结果是:

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

results

我尝试进行一堆数据类型转换,以确保生成的值具有适当的数据类型,并以此查询结束:

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 )
}

results

其结果显示所有内容都正确计算,但如果我们向其添加filter( ?age > 100 ),我们会得到these results,其中大部分年龄都小于100,而所有{{}} {{3}} 1}}值表示我们获得了正确的条目,year值完全不正确。例如,

age

是完全错误的。