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.
joinOrder
SPARQLsintaxis 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.
joinOrder
SPARQLejemplo 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 aJane
.Una sola persona llamada
Jane
que indica que le gustan (:likes
) 10 personas, incluyendo aJohn
.
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:
Buscar todas las personas llamadas
John
.Buscar todas las personas conectadas a
John
por un borde:likes
.Filtrar este conjunto por personas llamadas
Jane
.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:
Buscar la persona con
:name
Jane
.Buscar la persona con
:name
John
.Comprobar que el primer nodo está conectado al segundo con un borde
:likes
.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
.