es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

optimizando una consulta SPARQL al utilizar una función personalizada en Jena.

Tengo la siguiente consulta SPARQL en una ontología Owl, utilizando Jena:

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

La idea es la siguiente:

  • Tengo una aeronave llamada “myAircraft”
  • Tengo varios Waypoints
  • Busco el Waypoint más cercano utilizando GeoSPARQL
  • Quiero devolver la etiqueta del Waypoint más cercano y su distancia a la aeronave “myAircraft”

Esta consulta funciona sin ningún problema.

Ahora estoy agregando un vocabulario personalizado utilizando FunctionFactory de Jena. En mi caso, quiero recuperar en tiempo real la visibilidad del clima en metros en la posición del waypoint (por poner un ejemplo). Para hacer eso, he creado un vocabulario personalizado con una palabra “visibilidad”. Solo tiene un argumento, que es la “etiqueta” del Waypoint en mi caso.

Luego cambié mi consulta de la siguiente manera:

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

También funciona sin ningún problema, pero he observado en mi depurador que la función Java visibility se llama para cada Waypoint en la ontología, no solo para el más cercano. Si tengo muchos waypoints, tendré que llamar a mi función Java por cada Waypoint, cuando idealmente me gustaría hacerlo solo para uno de ellos, el más cercano.

¿Existe alguna forma de hacerlo para acelerar esta consulta? (la idea es que en la vida real llamaría a un servicio meteorológico para mi Waypoint, pero no quiero hacerlo para cada Waypoint, solo para el que encuentre en mi consulta).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de optimizar la consulta y llamar solo a la función de Java para el punto de paso más cercano. Un enfoque posible es usar una subconsulta para encontrar la distancia de cada punto de paso con respecto a la aeronave “myAircraft”, y luego utilizar eso como un filtro para llamar solo a la función de Java para el punto de paso más cercano.

    Aquí hay una consulta actualizada que implementa este enfoque:

    SELECCIONAR ?label ?distancia ?visibilidad
    DONDE {
      ?wpt rdf:type inav:Waypoint .
      ?wpt inav:Label ?label .
      ?wpt inav:hasExactGeometry ?geom .
      ?geom inav:asWKT ?wkt .
    
      # subconsulta para encontrar la distancia a "myAircraft"
      {
        SELECCIONAR ?wpt (geof:distance(?wkt, ?wkt2, <http: www.opengis.net/def/uom/ogc/1.0/nauticalmile="">) como ?distancia)
        DONDE {
          ?ac rdf:type inav:Aircraft .
          ?ac inav:Label "myAircraft" .
          ?ac inav:hasExactGeometry ?geom2 .
          ?geom2 inav:asWKT ?wkt2 .
        }
        ORDENAR POR ASC(?distancia)
        LÍMITE 1
      }
    
      # filtro para llamar solo a la función de Java para el punto de paso más cercano
      filtro (?wpt = ?closestWaypoint)
    
      # llamar a la función de Java para la visibilidad
      BIND (my:visibility(?wpt) como ?visibilidad)
    }
    

    Esta consulta utiliza una subconsulta para encontrar la distancia de cada punto de paso con respecto a la aeronave “myAircraft”, luego ordena los resultados por distancia y selecciona el más cercano. Luego utilizamos filtro para procesar solo el punto de paso más cercano y llamamos a la función de Java para la visibilidad utilizando BIND.

    Esto debería acelerar significativamente la consulta al llamar solo a la función de Java para el punto de paso más cercano.

Comments are closed.