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
  }
}

SPARQL Results

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