

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Práticas recomendadas para o Neptune ao usar SPARQL
<a name="best-practices-sparql"></a>

Siga estas práticas recomendadas ao usar a linguagem de consulta SPARQL com Neptune. Para obter informações sobre como usar o SPARQL no Neptune, consulte [Acessar o grafo do Neptune com o SPARQL](access-graph-sparql.md).

**Topics**
+ [Como consultar todos os gráficos nomeados por padrão](best-practices-sparql-query.md)
+ [Como especificar um nome gráfico para carregamento](best-practices-sparql-graph.md)
+ [Como escolher entre FILTER, FILTER...IN e VALUES em suas consultas](best-practices-sparql-batch.md)

# Como consultar todos os gráficos nomeados por padrão
<a name="best-practices-sparql-query"></a>

O Amazon Neptune associa cada triplo a um grafo nomeado. O gráfico padrão é definido como a união de todos os gráficos nomeados. 

Se você enviar uma consulta do SPARQL sem especificar explicitamente um gráfico por meio da palavra-chave `GRAPH` ou construções como `FROM NAMED`, o Neptune sempre considerará todos os trios em sua instância de banco de dados. Por exemplo, a seguinte consulta gera todos os triplos de um endpoint do SPARQL no Neptune: 

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

Trios que aparecem em mais de um gráfico são retornados somente uma vez.

Para obter informações sobre a especificação de gráfico padrão, consulte a seção [Dataset do RDF](https://www.w3.org/TR/sparql11-query/#rdfDataset) da especificação do SPARQL 1.1 Query Language.

# Como especificar um nome gráfico para carregamento
<a name="best-practices-sparql-graph"></a>

O Amazon Neptune associa cada triplo a um grafo nomeado. Se você não especificar um grafo nomeado ao carregar, inserir ou atualizar triplos, o Neptune usará o grafo nomeado fallback definido pelo URI, `http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph`.

Se você estiver usando o carregador em massa do Neptune, será possível especificar um grafo nomeado para usar todos os triplos (ou quadrantes com a quarta posição em branco) usando o parâmetro `parserConfiguration: namedGraphUri`. Para obter informações sobre a sintaxe do comando `Load` do carregador do Neptune, consulte [Comando do carregador do Neptune](load-api-reference-load.md).

# Como escolher entre FILTER, FILTER...IN e VALUES em suas consultas
<a name="best-practices-sparql-batch"></a>

Existem três maneiras básicas para injetar valores em consultas SPARQL:   `FILTER`,   `FILTER...IN`   e   `VALUES`.

Por exemplo, suponha que você queira pesquisar os amigos de várias pessoas em uma única consulta. Usando `FILTER`, você pode estruturar a consulta da seguinte forma:

```
  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)}
```

Isso retorna todos os triplos no gráfico que têm `?s` vinculado a `ex:person1` ou a `ex:person2` e uma borda de saída chamada `foaf:knows`.

Você também pode criar uma consulta usando `FILTER...IN` que retorna resultados equivalentes:

```
  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))}
```

Você também pode criar uma consulta usando `VALUES` que, nesse caso, também retorna resultados equivalentes:

```
  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}}
```

Embora em muitos casos essas consultas sejam semanticamente equivalentes, há alguns casos em que as duas variantes `FILTER` diferem da variante `VALUES`:
+ O primeiro caso é quando você injeta valores duplicados, como injetar a mesma pessoa duas vezes. Nesse caso, a consulta `VALUES` inclui as duplicatas no resultado. Você pode eliminar essas duplicações explicitamente adicionando um `DISTINCT` à cláusula `SELECT`. No entanto, pode haver situações em que você realmente quer duplicações nos resultados da consulta de injeção de valor redundante.

  No entanto, as versões `FILTER` e `FILTER...IN` extraem o valor somente uma vez quando o mesmo valor é exibido várias vezes.
+ O segundo caso está relacionado ao fato de que `VALUES` sempre realiza uma correspondência exata, enquanto `FILTER` pode aplicar uma promoção de tipo e fazer correspondência difusa em alguns casos.

  Por exemplo, quando você inclui um literal, como `"2.0"^^xsd:float` na cláusula de valores, uma consulta `VALUES` corresponde exatamente a essa literal, incluindo valor de literal e tipo de dados.

  Por outro lado, `FILTER` produz uma correspondência difusa para esses literais numéricos. As correspondências podem incluir literais com o mesmo valor, mas com diferentes tipos de dados numéricos, como `xsd:double`.
**nota**  
Não há diferença entre o comportamento de `FILTER` e de `VALUES` ao enumerar literais de strings ou URIs.

As diferenças entre `FILTER` e `VALUES` podem afetar a otimização e a estratégia de avaliação de consulta resultante. A não ser que seu caso de uso precise de correspondência difusa, recomendamos usar `VALUES` porque ele evita olhar para casos especiais relacionados a conversão do tipo. Como resultado, `VALUES` muitas vezes produz uma consulta mais eficiente cuja execução é mais rápida e mais econômica.