[英]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
請注意,該查詢中的某些結果具有某些您可能不會期望的值。 例如,
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>
這里發生了一些奇怪的事情,而我還無法構建一個有效的查詢。 但是,我建議您與他們的郵件列表聯系並直接詢問他們,因為這在您的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.