簡體   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