

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Best practice di Neptune per l'utilizzo di SPARQL
<a name="best-practices-sparql"></a>

Segui queste best practice durante l'utilizzo del linguaggio di query SPARQL con Neptune. Per ulteriori informazioni sull'utilizzo di SPARQL in Neptune, consulta [Accesso al grafo Neptune con SPARQL](access-graph-sparql.md).

**Topics**
+ [Query di tutti i grafi nominati per impostazione predefinita](best-practices-sparql-query.md)
+ [Specifica di un grafo denominato per il caricamento](best-practices-sparql-graph.md)
+ [Scelta tra FILTER, FILTER...IN e VALUES nelle query](best-practices-sparql-batch.md)

# Query di tutti i grafi nominati per impostazione predefinita
<a name="best-practices-sparql-query"></a>

Amazon Neptune associa ogni tripla a un grafo denominato. Il grafo predefinito è definito come l'unione di grafi denominati. 

Se invii una query SPARQL senza specificare un grafo in maniera esplicita tramite la parola chiave `GRAPH` o costrutti quali `FROM NAMED`, Neptune considera sempre tutte le triple nell'istanza database. Ad esempio, la seguente query restituisce tutte le triple da un endpoint SPARQL Neptune: 

```
SELECT * WHERE { ?s ?p ?o }
```

Le triple che appaiono in più grafici vengono restituite una sola volta.

Per informazioni sulla specifica del grafico predefinito, consulta la sezione [RDF Dataset](https://www.w3.org/TR/sparql11-query/#rdfDataset) delle specifiche SPARQL 1.1 Query Language.

# Specifica di un grafo denominato per il caricamento
<a name="best-practices-sparql-graph"></a>

Amazon Neptune associa ogni tripla a un grafo denominato. Se non specifichi un grafo denominato durante il caricamento, l'inserimento o l'aggiornamento di triple, Neptune utilizza il grafo denominato di fallback definito dall'URI, `http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph`.

Se usi lo strumento di caricamento in blocco Neptune, puoi specificare il grafo denominato da utilizzare per tutte le triple (o quadruple con la quarta posizione vuota) con il parametro `parserConfiguration: namedGraphUri`. Per ulteriori informazioni sulla sintassi del comando `Load` dello strumento di caricamento in blocco Neptune, consulta [Comando dello strumento di caricamento Neptune](load-api-reference-load.md).

# Scelta tra FILTER, FILTER...IN e VALUES nelle query
<a name="best-practices-sparql-batch"></a>

Sono disponibili tre tecniche di base per inserire valori in query SPARQL:   `FILTER`,   `FILTER...IN`   e   `VALUES`.

Ad esempio, potresti voler cercare gli amici di più persone con una singola query. Utilizzando `FILTER`, è possibile strutturare la query come segue:

```
  PREFIX ex: <https://www.example.com/>
  PREFIX foaf : <http://xmlns.com/foaf/0.1/>

  SELECT ?s ?o
  WHERE {?s foaf:knows ?o. FILTER (?s = ex:person1 || ?s = ex:person2)}
```

Questo restituisce nel grafo tutte le triple che hanno `?s` associato a `ex:person1` o `ex:person2` e hanno un arco in uscita etichettato come `foaf:knows`.

Puoi anche creare una query utilizzando `FILTER...IN` che restituisce risultati equivalenti:

```
  PREFIX ex: <https://www.example.com/>
  PREFIX foaf : <http://xmlns.com/foaf/0.1/>

  SELECT ?s ?o
  WHERE {?s foaf:knows ?o. FILTER (?s IN (ex:person1, ex:person2))}
```

Puoi anche creare una query utilizzando `VALUES`, che in questo caso restituisce risultati equivalenti:

```
  PREFIX ex: <https://www.example.com/>
  PREFIX foaf : <http://xmlns.com/foaf/0.1/>

  SELECT ?s ?o
  WHERE {?s foaf:knows ?o. VALUES ?s {ex:person1 ex:person2}}
```

Anche se in molti casi queste query sono semanticamente equivalenti, vi sono alcuni casi in cui le due varianti `FILTER` differiscono dalla variante `VALUES`:
+ Il primo caso corrisponde a quando inserisci valori duplicati, come ad esempio inserire la stessa persona due volte. In questo caso, la query `VALUES` include il duplicato nel risultato. Puoi eliminare esplicitamente questi duplicati aggiungendo `DISTINCT` alla clausola `SELECT`. In alcuni casi, potresti volere i duplicati nei risultati della query per inserire valori ridondanti.

  Tuttavia, quando lo stesso valore appare più volte, le versioni `FILTER` e `FILTER...IN` lo estraggono una sola volta.
+ Il secondo caso è correlato al fatto che `VALUES` esegue sempre una corrispondenza esatta, mentre in alcuni casi `FILTER` potrebbe applicare la promozione di tipo ed eseguire corrispondenze parziali.

  Ad esempio, quando includi un valore letterale come `"2.0"^^xsd:float` nella clausola dei valori, una query `VALUES` esegue la corrispondenza esatta con questo valore letterale, inclusi il valore letterale e il tipo di dati.

  Al contrario, `FILTER` produce una corrispondenza parziale per questi valori letterali numerici. Le corrispondenze possono includere valori letterali con lo stesso valore ma con diversi tipi di dati numerici, come `xsd:double`.
**Nota**  
Non c'è differenza tra il `VALUES` comportamento `FILTER` e quando si enumerano stringhe letterali o. URIs

Le differenze tra `FILTER` e `VALUES` possono influenzare l'ottimizzazione e la strategia di valutazione query risultante. A meno che il caso d’uso richieda le corrispondenze parziali, consigliamo di utilizzare `VALUES` poiché evita di controllare i casi speciali relativi al casting del tipo. Di conseguenza, `VALUES` spesso produce una query più efficiente, più veloce e meno costosa.