Virtuoso SPARQL 查询无法比较浮点常量
Virtuoso SPARQL query unable to compare float constants
我在 Virtuoso 7.1 上加载了 DBpedia 2014 的本地副本。我运行以下查询:
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> .
}
其中 return 值为 false
!
接下来,我尝试使用 FILTER
:
确保 float
值
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 )
}
这个returns:
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> )
}
其中 return 是空的!
遗憾的是,位于 lod.openlinksw.com/sparql 的在线端点没有加载纬度和经度,所以我无法重现问题让您亲眼看到。
有什么建议吗?我的主要问题是:如何在查询的三重模式中放置文字 float
以获得匹配项?
我很确定 Virtuoso 在打印值时正在四舍五入或 t运行cating 值。作为一个非常简单的示例,您可以在 public DBpedia 端点(运行s Virtuoso)上 运行:
select ?x, (str(?x) as ?sx) {
values ?x {
"1.11111"^^xsd:float
"1.11115"^^xsd:float
"1.11119"^^xsd:float
}
}
x sx
--------------------------
1.11111 1.111109972000122
1.11115 1.111150026321411
1.11119 1.111189961433411
如果您想比较精确的值,您可能需要提取那些字符串形式并明确地查找它们。
当然还有 link 到 What Every Computer Scientist Should Know About Floating-Point Arithmetic
我在 Virtuoso 7.1 上加载了 DBpedia 2014 的本地副本。我运行以下查询:
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> .
}
其中 return 值为 false
!
接下来,我尝试使用 FILTER
:
float
值
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 )
}
这个returns:
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> )
}
其中 return 是空的!
遗憾的是,位于 lod.openlinksw.com/sparql 的在线端点没有加载纬度和经度,所以我无法重现问题让您亲眼看到。
有什么建议吗?我的主要问题是:如何在查询的三重模式中放置文字 float
以获得匹配项?
我很确定 Virtuoso 在打印值时正在四舍五入或 t运行cating 值。作为一个非常简单的示例,您可以在 public DBpedia 端点(运行s Virtuoso)上 运行:
select ?x, (str(?x) as ?sx) {
values ?x {
"1.11111"^^xsd:float
"1.11115"^^xsd:float
"1.11119"^^xsd:float
}
}
x sx
--------------------------
1.11111 1.111109972000122
1.11115 1.111150026321411
1.11119 1.111189961433411
如果您想比较精确的值,您可能需要提取那些字符串形式并明确地查找它们。
当然还有 link 到 What Every Computer Scientist Should Know About Floating-Point Arithmetic