我使用 Jena 在 Owl Ontology 上有以下 SPARQL 查询:
SELECT ?label ?distance
WHERE {
?wpt rdf:type inav:Waypoint .
?wpt inav:Label ?label .
?ac rdf:type inav:Aircraft .
?ac inav:Label "myAircraft" .
?wpt inav:hasExactGeometry ?geom .
?geom inav:asWKT ?wkt .
?ac inav:hasExactGeometry ?geom2 .
?geom2 inav:asWKT ?wkt2 .
BIND (geof:distance(?wkt, ?wkt2, <http://www.opengis.net/def/uom/OGC/1.0/nauticalMile>) as ?distance)
}
ORDER BY ASC(?distance )
LIMIT 1
这个想法是:
- 我有一个
Aircraft
叫“myAircraft”的 - 我有几个航点
Waypoint
我使用 GeoSPARQL搜索最接近的- 我想返回最接近的标签
Waypoint
,它与“myAircraft”的距离Aircraft
这个查询没有任何问题。
现在我正在使用 Jena 添加自定义词汇表FunctionFactory
。在我的情况下,我想实时检索在航路点位置以米为单位的气象可见度(举个例子)。为了做到这一点,我用一个visibility
词创建了一个自定义词汇表。在我的情况下Label
,它只有一个论点。Waypoint
然后我将查询更改如下:
SELECT ?label ?distance ?visibility
WHERE {
?wpt rdf:type inav:Waypoint .
?wpt inav:Label ?label .
?ac rdf:type inav:Aircraft .
?ac inav:Label "myAircraft" .
?wpt inav:hasExactGeometry ?geom .
?geom inav:asWKT ?wkt .
?ac inav:hasExactGeometry ?geom2 .
?geom2 inav:asWKT ?wkt2 .
BIND (geof:distance(?wkt, ?wkt2, <http://www.opengis.net/def/uom/OGC/1.0/nauticalMile>) as ?distance)
BIND (my:visibility(?wpt) as ?visibility)
}
ORDER BY ASC(?distance )
LIMIT 1
它也可以毫无问题地工作,但是我在调试器中指出,Javavisibility
函数被Waypoint
Ontology 中的每个调用,而不仅仅是最接近的一个。如果我有很多航路点,我将不得不调用我的 Java 函数Waypoint
,而理想情况下我只想为其中一个,最接近的一个。
有没有办法加速这个查询?(想法是,在现实生活中,我会为我的 Waypoint 调用一个气象服务,但我不想为每一个都这样做Waypoint
,而只是我在查询中找到的那个)。