Virtuoso SPARQL查询无法比较浮点常量

时间:2015-10-05 10:37:02

标签: sparql virtuoso

我将本地版本的DBpedia 2014加载到Virtuoso 7.1上。我运行以下查询:

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

接下来,我尝试使用float确保FILTER值:

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以获得匹配?

1 个答案:

答案 0 :(得分: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

的强制性链接