

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 sugerencia de consulta `evaluationStrategy` de SPARQL
<a name="sparql-query-hints-evaluationStrategy"></a>

La sugerencia de consulta `evaluationStrategy` indica al motor de consultas de Amazon Neptune que el fragmento de la consulta anotada debe evaluarse de abajo arriba como una unidad independiente. Esto significa que no se utiliza ninguna solución de los pasos de evaluación anteriores para calcular el fragmento de consulta. El fragmento de consulta se evalúa como una unidad independiente y las soluciones producidas se unen con el resto de la consulta una vez calculada.

El uso de la sugerencia de consulta `evaluationStrategy` implica un plan de consulta de bloqueo (sin canalización), lo que significa que las soluciones del fragmento anotado con la sugerencia de consulta se materializan y se almacenan en búfer en la memoria principal. El uso de esta sugerencia de consulta puede aumentar considerablemente la cantidad de memoria principal necesaria para evaluar la consulta, especialmente si el fragmento de consulta anotado calcula un gran número de resultados.

## Sintaxis de sugerencias SPARQL de `evaluationStrategy`
<a name="sparql-query-hints-evaluationStrategy-syntax"></a>

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

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#>
hint:SubQuery hint:evaluationStrategy "BottomUp" .
```

**Ámbitos disponibles**
+ `hint:SubQuery`

**nota**  
Esta sugerencia de consulta solo es compatible con las subconsultas anidadas.

Para obtener más información acerca de los ámbitos de sugerencia de consulta, vea [Ámbito de las sugerencias de consulta SPARQL en Neptune](sparql-query-hints.md#sparql-query-hints-scope).

## Ejemplo de sugerencia SPARQL `evaluationStrategy`
<a name="sparql-query-hints-evaluationStrategy-example"></a>



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

En este ejemplo, suponga que el conjunto de datos tiene las siguientes características:
+ Contiene 1000 bordes etiquetados `:connectedTo`.
+ Cada nodo `component` está conectado a una media de otros 100 nodos `component`.
+ El número típico de conexiones cíclicas de cuatro saltos entre nodos es de unos 100.

Como ejemplo típico, la sugerencia `evaluationStrategy` puede ser útil para optimizar los patrones de consulta que contienen ciclos.

**Sin sugerencias de consulta**  
La siguiente consulta SPARQL extrae todos los nodos `component` que están cíclicamente conectados entre sí a través de cuatro saltos:

```
PREFIX : <https://example.com/>
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT * {
  ?component1 :connectedTo ?component2 .
  ?component2 :connectedTo ?component3 .
  ?component3 :connectedTo ?component4 .
  ?component4 :connectedTo ?component1 .
}
```

El enfoque del motor de consultas de Neptune es evaluar esta consulta utilizando los siguientes pasos:
+ Extraer los 1000 bordes `connectedTo` del gráfico.
+ Expandir 100 veces (el número de bordes `connectedTo` de salida desde component2).

  Resultados intermedios: 100.000 nodos.
+ Expandir 100 veces (el número de bordes `connectedTo` de salida desde component3).

  Resultados intermedios: 10.000.000 nodos.
+ Escanear los 10.000.000 de nodos para el cierre del ciclo.

Esto da como resultado un plan de consulta de streaming, que tiene una cantidad constante de memoria principal.

**Sugerencia de consulta y subconsultas**  
Es posible que desee intercambiar el espacio de memoria principal para acelerar el cálculo. Al reescribir la consulta mediante una sugerencia de consulta `evaluationStrategy`, puede forzar al motor a calcular una unión entre dos subconjuntos más pequeños y materializados.

```
PREFIX : <https://example.com/>
          PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT * {
  {
    SELECT * WHERE {
      hint:SubQuery hint:evaluationStrategy "BottomUp" .
      ?component1 :connectedTo ?component2 .
      ?component2 :connectedTo ?component3 .
    }
  }
  {
    SELECT * WHERE {
      hint:SubQuery hint:evaluationStrategy "BottomUp" .
      ?component3 :connectedTo ?component4 .
      ?component4 :connectedTo ?component1 .
    }
  }
}
```

En lugar de evaluar los patrones triples en secuencia mientras se usan iterativamente los resultados del patrón triple anterior como entrada para los patrones siguientes, la sugerencia `evaluationStrategy` provoca que las dos subconsultas se evalúen de forma independiente. Ambas subconsultas producen 100.000 nodos para los resultados intermedios, que después se unen para formar la salida final. 

En concreto, cuando ejecuta Neptune en los tipos de instancia más grandes, el almacenamiento temporal de estos dos subconjuntos de 100 000 en la memoria principal aumenta el uso de memoria a cambio de acelerar considerablemente la evaluación.