繁体   English   中英

在 Jena 中使用自定义 function 时优化 SPARQL 查询

[英]optimizing a SPARQL query when using a custom function in Jena

我使用 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

这个想法是:

  • 我有一架名为“myAircraft”的Aircraft
  • 我有几个航点
  • 我使用 GeoSPARQL 搜索最近的Waypoint
  • 我想退回最近Waypoint的 label ,它与“myAircraft” Aircraft的距离

这个查询没有任何问题。

现在我正在使用 Jena FunctionFactory添加自定义词汇表。 在我的情况下,我想在航路点的 position 处以米为单位实时检索气象的能见度(举个例子)。 为了做到这一点,我创建了一个包含一个visibility单词的自定义词汇表。 它只有一个参数,在我的例子中是WaypointLabel

然后我将查询更改如下:

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

它也可以毫无问题地工作,但我在我的调试器中指出,Java visibility function 会为本体中的每个Waypoint调用,而不仅仅是最近的一个。 如果我有很多航点,我将不得不为航点调用我的 Java Waypoint ,理想情况下我只想为其中一个,最接近的一个。

有没有办法加速这个查询? (想法是,在现实生活中,我会为我的 Waypoint 调用一个气象服务,但我不想为每个Waypoint都这样做,而只是我在查询中找到的那个)。

根据 UninformedUser 的非常翔实的回答:

SELECT ?label ?distance ?visibility  
{
   {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
}  BIND (my:visibility(?wpt) as ?visibility)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM