2

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

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

4

1 回答 1

3

您可以使用公共 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

完全错了。

于 2013-09-13T18:55:42.210 回答