【问题标题】:Virtuoso SPARQL query unable to compare float constantsVirtuoso SPARQL 查询无法比较浮点常量
【发布时间】:2015-10-05 21:42:17
【问题描述】:

我在 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> .
}

返回值为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 )
}

这会返回:

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 放在查询的三重模式中以获得匹配?

【问题讨论】:

标签: sparql virtuoso


【解决方案1】:

我很确定 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的必填链接

【讨论】:

  • 你说得对。不知何故,"81.5"^^&lt;html...float&gt; 的格式给了我一个非常错误的印象,我正在处理一个存储的字符串。
  • @gdiazc 好吧,从某种意义上说,您正在处理存储的字符串。 (数据类型)RDF 文字是一对词汇形式(字符串)和数据类型 URI。虽然它们在语义上可能并不都是合法的,但您可以将任何字符串与任何数据类型 URI 配对,并具有 RDF 文字。 spec says 应该能够通过放置特定的词法形式和数据类型文字来匹配。我认为这可能意味着 Virtuoso 在这里所做的并不完全合法,因为它返回的词汇形式与我输入的不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多