Sparql查询几何做奇怪的事情

时间:2018-08-06 09:43:21

标签: sparql dbpedia geo virtuoso

我现在正在执行Sparql查询,以查找dbpedia端点(Snorql)中给定点特定半径附近的地方。

我的第一个解决方案(已经在其他一些端点上做到了)是

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT *
WHERE {
?resource rdfs:label ?label  .
?resource geo:lat ?lat .
?resource geo:long ?long .
?resource geo:geometry ?coordinates .
FILTER(bif:st_within(?coordinates, bif:st_geomFromText("POINT(10.2788 47.4093)"), 1)) .
FILTER (lang(?label)= "de") .
}

我注意到它没有给我任何结果。然后,我在geo:latgeo:long中使用给定的四舍五入值尝试了同样的事情:

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT *
WHERE {
?resource rdfs:label ?label  .
?resource geo:lat ?lat .
?resource geo:long ?long .
?resource geo:geometry ?coordinates .
FILTER(bif:st_within(bif:st_point(?long, ?lat), bif:st_geomFromText("POINT(10.2788 47.4093)"), 1)) .
FILTER (lang(?label)= "de") .
}

现在我得到2个结果。当我将第一个解的半径增加到21时,有很多结果,但是将其减小到20时,没有结果。我在第一个查询中犯了一个错误?

非常感谢你, 声波

1 个答案:

答案 0 :(得分:2)

As I answered on Confluence ...

  

有趣!

     

您的原始查询(添加了FROM <http://dbpedia.org>子句)确实在run against the LOD Cloud Cache时返回了预期的结果,而st_distance() function现在使用的是较旧的Virtuoso引擎。在新版本中,这看起来像是回归。

     

要检查DBpedia上的内容,我从您的查询开始,并在BIND子句中使用DBpedia.org/sparql添加了两个WHERE –      

BIND ( bif:st_distance ( ?coordinates, bif:st_geomFromText("POINT(10.2788 47.4093)") ) AS ?coord_distance ) . BIND ( bif:st_distance ( bif:st_point(?long, ?lat), bif:st_geomFromText("POINT(10.2788 47.4093)") ) AS ?latlong_distance ) }

     

我还向查询添加了最后一个ORDER BY ?coord_distance

     

我在st_within()上得到的结果清楚地显示了您期望的1半径内的两个实体,无论是基于?coordinates还是st_point(?long, ?lat),计算出的距离都是相同的,但是它们是除非bif:st_within指定半径为21或更大,并且这些结果包括位于该较大半径内的许多其他实体,否则不会交付。

     

我已经将此问题提交给了Virtuoso Development,并在内部将其作为bug#18399进行跟踪。

...以及随后的内容...

  

st_distance()使用haversine function,因此假设srid4326(对于DBpedia地理数据来说是典型的),“ DBpedia 2016-10 Snapshot用于计算地球上以千米为单位的大圆距。”您可以将距离(以米为单位)除以1000(或乘以0.001),以获取以千米为单位的距离,以供st_within()调用中使用。

     

计算时间取决于实例主机,实例上的其他负载等。公共DBpedia实例的响应时间可能比您可以忍受的时间更长。您可以在本地服务器或云中(基于DBpedia-Live [当前DBpedia.org/sparql]或LOD Cloud Cache instance [当前live.DBpedia.org/sparql]的AMI)设置自己的镜像。 ,您可以将其放在任何AWS实例类型上-因此您可以根据需要为其提供尽可能多的处理器和/或RAM。

     

请注意,A slightly adjusted DBpedia query可以随时升级到更新的Virtuoso引擎,因此您不应该依赖于通过st_within()来提供期望的结果。 what I think you want仅使用st_distance()函数(此处是根据?coordinates计算的,即可交付this SO question,但您也可以使用基于?long和{{ 1}}),而不是故障的?lat