簡體   English   中英

sparql-通過返回空響應來排序

[英]sparql --order by returning empty response

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

誰能告訴我我做錯了嗎?

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

完全是錯誤的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM