我现在正在执行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:lat
和geo: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时,没有结果。我在第一个查询中犯了一个错误?
非常感谢你, 声波
答案 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,因此假设srid
为4326
(对于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
。