我将本地版本的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
以获得匹配?
答案 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
}
}
x sx
--------------------------
1.11111 1.111109972000122
1.11115 1.111150026321411
1.11119 1.111189961433411
如果要比较确切的值,您可能希望提取这些字符串形式并明确查找它们。
当然,还有What Every Computer Scientist Should Know About Floating-Point Arithmetic
的强制性链接