La joinOrder SPARQL sugerencia de consulta - Amazon Neptune

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

La joinOrder SPARQL sugerencia de consulta

Al enviar una SPARQL consulta, el motor de consultas de Amazon Neptune investiga la estructura de la consulta. Reordena partes de la consulta y trata de minimizar la cantidad de trabajo necesario para la evaluación y el tiempo de respuesta de la consulta.

Por ejemplo, una secuencia de patrones triples conectados normalmente no se evalúa en el orden dado. Se reordena mediante heurística y estadísticas como la selectividad de los patrones individuales y cómo están conectados a través de variables compartidas. Además, si la consulta contiene patrones más complejos, como subconsultas, complejos OPTIONAL o MINUS bloquesFILTERs, el motor de consultas de Neptune los reordena siempre que sea posible, con el objetivo de lograr un orden de evaluación eficiente.

Para consultas más complejas, el orden en el que Neptune decide evaluar la consulta puede no ser siempre el óptimo. Por ejemplo, Neptune podría perder las características específicas de datos de instancias (como el alcance de nodos Power en el gráfico) que surgen durante la evaluación de la consulta.

Si conoce las características exactas de los datos y desea dictar manualmente el orden de ejecución de la consulta, utilice la sugerencia de consulta joinOrder de Neptune para especificar que la consulta se evalúe en el orden indicado.

joinOrderSPARQLsintaxis de sugerencias

La sugerencia de joinOrder consulta se especifica como un patrón triple incluido en una SPARQL consulta.

Para una mayor claridad, los siguientes usos de sintaxis utilizan un prefijo hint que se define e incluye en la consulta para especificar el espacio de nombres de la sugerencia de consulta de Neptune:

PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> scope hint:joinOrder "Ordered" .
Ámbitos disponibles
  • hint:Query

  • hint:Group

Para obtener más información acerca de los ámbitos de sugerencia de consulta, vea Alcance de las sugerencias de SPARQL consulta en Neptune.

joinOrderSPARQLejemplo de sugerencia

En esta sección se muestra una consulta escrita con la sugerencia de consulta joinOrder y sin, así como las optimizaciones relacionadas.

En este ejemplo, suponga que el conjunto de datos contiene lo siguiente:

  • Una sola persona llamada John que indica que le gustan (:likes) 1000 personas, incluyendo a Jane.

  • Una sola persona llamada Jane que indica que le gustan (:likes) 10 personas, incluyendo a John.

Sin sugerencias de consulta

La siguiente SPARQL consulta extrae todos los pares de personas nombradas John y Jane que se gustan entre sí de un conjunto de datos de redes sociales:

PREFIX : <https://example.com/> SELECT ?john ?jane { ?person1 :name "Jane" . ?person1 :likes ?person2 . ?person2 :name "John" . ?person2 :likes ?person1 . }

El motor de consultas de Neptune puede evaluar las instrucciones en un orden diferente al escrito. Por ejemplo, puede elegir evaluar en el siguiente orden:

  1. Buscar todas las personas llamadas John.

  2. Buscar todas las personas conectadas a John por un borde :likes.

  3. Filtrar este conjunto por personas llamadas Jane.

  4. Filtrar este conjunto por las conectadas a John por un borde :likes.

Según el conjunto de datos, la evaluación en este orden da como resultado la extracción de 1000 entidades en el segundo paso. El tercer paso lo limita hasta el nodo individual, Jane. El paso final determina que a Jane también le gusta (:likes) el nodo John.

Sugerencia de consulta

Sería favorable comenzar con el nodo Jane porque solo tiene 10 bordes :likes salientes. De este modo se reduce la cantidad de trabajo durante la evaluación de la consulta al evitar la extracción de las 1000 entidades durante el segundo paso.

En el siguiente ejemplo, se utiliza la sugerencia de joinOrderconsulta para garantizar que el Jane nodo y sus bordes salientes se procesen primero. Para ello, se deshabilita todo el reordenamiento automático de las uniones de la consulta:

PREFIX : <https://example.com/> PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> SELECT ?john ?jane { hint:Query hint:joinOrder "Ordered" . ?person1 :name "Jane" . ?person1 :likes ?person2 . ?person2 :name "John" . ?person2 :likes ?person1 . }

Un escenario aplicable real podría ser una aplicación de red social en la que las personas de dicha red se clasifican como personas con influencia con muchas conexiones o como usuarios normales con pocas conexiones. En tal escenario, podría asegurarse de que el usuario normal (Jane) se procese antes que la persona influyente (John) en una consulta como la del ejemplo anterior.

Sugerencia de consulta y reordenación

Puede llevar este ejemplo un paso más allá. Si sabe que el atributo :name es único para un solo nodo, podría acelerar la consulta mediante la reordenación y el uso de la sugerencia de consulta joinOrder. Este paso garantiza que los nodos únicos se extraigan primero.

PREFIX : <https://example.com/> PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> SELECT ?john ?jane { hint:Query hint:joinOrder "Ordered" . ?person1 :name "Jane" . ?person2 :name "John" . ?person1 :likes ?person2 . ?person2 :likes ?person1 . }

En este caso, puede reducir la consulta a las siguientes acciones individuales en cada paso:

  1. Buscar la persona con :name Jane.

  2. Buscar la persona con :name John.

  3. Comprobar que el primer nodo está conectado al segundo con un borde :likes.

  4. Comprobar que el segundo nodo está conectado al primero con un borde :likes.

importante

Si elige un orden incorrecto, la sugerencia de consulta joinOrder puede provocar un descenso considerable del rendimiento. Por ejemplo, el ejemplo anterior no sería eficiente si los atributos :name no fueran únicos. Si los 100 nodos se llamaran Jane y los 1000 nodos se llamaran John, la consulta terminaría verificando 1000 * 100 (100.000) pares para los bordes :likes.