2015-10-05 26 views
0

我有本地副本DBpedia 2014加載到Virtuoso 7.1上。我運行以下查詢:Virtuoso SPARQL查詢無法比較浮點常量

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?o, datatype(?o) 
WHERE { 
    <http://dbpedia.org/resource/Caesar_Creek_State_Park> <http://www.w3.org/2003/01/geo/wgs84_pos#long> ?o . 
} 

得到以下結果:

o   callret-1 
-84.0653 http://www.w3.org/2001/XMLSchema#float 
-84.0139 http://www.w3.org/2001/XMLSchema#float 

我現在執行(貌似真)查詢:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

ASK 
WHERE { 
    <http://dbpedia.org/resource/Caesar_Creek_State_Park> <http://www.w3.org/2003/01/geo/wgs84_pos#long> "-84.0139"^^<http://www.w3.org/2001/XMLSchema#float> . 
} 

在返回值是false

接下來,我嘗試確保與FILTERfloat值:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?o 
WHERE { 
    <http://dbpedia.org/resource/Caesar_Creek_State_Park> <http://www.w3.org/2003/01/geo/wgs84_pos#long> ?o . 
    FILTER (datatype(?o) = xsd:float) 
} 

這將返回:

o 
-84.0653 
-84.0139 

這是很好的。接下來,我嘗試潛入前面查詢中的額外三重模式:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?o 
WHERE { 
    <http://dbpedia.org/resource/Caesar_Creek_State_Park> <http://www.w3.org/2003/01/geo/wgs84_pos#long> ?o . 
    <http://dbpedia.org/resource/Caesar_Creek_State_Park> <http://www.w3.org/2003/01/geo/wgs84_pos#long> "-84.0139"^^<http://www.w3.org/2001/XMLSchema#float> . 
    FILTER (datatype(?o) = <http://www.w3.org/2001/XMLSchema#float>) 
} 

返回空!

不幸的是,在線端點lod.openlinksw.com/sparql沒有緯度和經度加載,所以我無法複製這個問題讓你親身體驗。

任何暗示?我的主要問題是:如何才能將文字float置於查詢的三重模式中以獲得匹配?

+0

而不是'選擇?O,數據類型(?O)',你得到了什麼,如果你'SELECT STR(O),數據類型(?O) '?可能是客戶端正在打印從RDF文字中讀取的浮點數,這可能並不會完全是RDF文字的詞法形式。 –

+0

請注意,http://lod.openlinksw.com/sparql和http://dbpedia.org/sparql上的數據集是在一段時間之前提取的。更加積極地更新的數據 - 包括緯度/經度值 - 可以在http://dbpedia-live.openlinksw.com/sparql和http://live.dbpedia.org/sparql – TallTed

回答

2

我很確定Virtuoso在打印數值時舍入或截斷值。作爲一個非常簡單的例子,你可以在公共DBpedia的端點上運行(運行的Virtuoso):

select ?x, (str(?x) as ?sx) { 
    values ?x { 
    "1.11111"^^xsd:float 
    "1.11115"^^xsd:float 
    "1.11119"^^xsd:float 
    } 
} 

SPARQL Results

x  sx 
-------------------------- 
1.11111 1.111109972000122 
1.11115 1.111150026321411 
1.11119 1.111189961433411 

如果要比較精確值,你可能會想提取這些字符串形式並明確地查找它們。

,當然,還有就是強制性鏈接What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

找到。你是絕對的對。格式化「81.5」^^ '給了我一個錯誤的印象,就是我正在處理一個存儲的字符串。 – gdiazc

+0

@gdiazc從某種意義上說,你*是處理存儲的字符串。 (數據類型)RDF文字是一對詞法形式(一個字符串)和一個數據類型URI。雖然它們可能不是全部在語義上合法,但可以將任何字符串與任何數據類型URI配對,並具有RDF文字。 [spec說](http://www.w3.org/TR/sparql11-query/#matchArbDT),你應該能夠通過放置一個特定的詞法表單和數據類型文字來匹配。我*認爲*這可能意味着Virtuoso在這裏所做的並不完全合法,因爲它返回的詞彙形式與我輸入的詞彙形式不同。 –