

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à.

# Modello di dati Neptune per i dati OpenSearch
<a name="full-text-search-model"></a>

Amazon Neptune utilizza una struttura documentale JSON unificata per archiviare i dati SPARQL e Gremlin in Service. OpenSearch Ogni documento OpenSearch corrisponde a un'entità e memorizza tutte le informazioni pertinenti per quell'entità. Per Gremlin, i vertici e gli spigoli sono considerati entità, quindi i OpenSearch documenti corrispondenti contengono informazioni su vertici, etichette e proprietà. Per SPARQL, i soggetti possono essere considerati entità, quindi i OpenSearch documenti corrispondenti contengono informazioni su tutte le coppie predicato-oggetto in un unico documento.

**Nota**  
L'implementazione di Neptune-to-OpenSearch replica memorizza solo dati di tipo stringa. Tuttavia, è possibile modificarlo per memorizzare altri tipi di dati.

La struttura del documento JSON unificata è simile a questa:

```
{
  "entity_id": "Vertex Id/Edge Id/Subject URI",
  "entity_type": [List of Labels/rdf:type object value],
  "document_type": "vertex/edge/rdf-resource"
  "predicates": {
    "Property name or predicate URI": [
      {
        "value": "Property Value or Object Value",
        "graph": "(Only for Sparql) Named Graph Quad is present"
        "language": "(Only for Sparql) rdf:langString"
      },
      {
        "value": "Property Value 2/ Object Value 2",
      }
    ]
  }
}
```

****
+ `entity_id`: ID univoco dell'entità che rappresenta il documento.
  + Per SPARQL, questo è l'URI del soggetto.
  + Per Gremlin, questo è `Vertex_ID` o `Edge_ID`.
+ `entity_type`: rappresenta una o più etichette per un vertice o un arco o zero o più valori di predicato `rdf:type` per un soggetto.
+ `document_type`: consente di specificare se il documento corrente rappresenta un vertice, un arco o una risorsa RDF.
+ `predicates`: per Gremlin, archivia proprietà e valori per un vertice o un arco. Per SPARQL, memorizza coppie di oggetti-predicato.

  Il nome della proprietà assume il formato `properties.name.value` in OpenSearch. Per interrogarlo, devi nominarlo in quel modulo.
+ `value `: valore della proprietà per Gremlin o valore di oggetto per SPARQL.
+ `graph`: grafo denominato per SPARQL.
+ `language`: tag del linguaggio per un valore letterale `rdf:langString` in SPARQL.

## Esempio di documento SPARQL OpenSearch
<a name="full-text-search-model-sparql-example"></a>

**Dati**

```
@prefix dt:   <http://example.org/datatype#> .
@prefix ex:   <http://example.org/> .
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

ex:simone   rdf:type     ex:Person                    ex:g1
ex:michael  rdf:type     ex:Person                    ex:g1
ex:simone   ex:likes     "spaghetti"                  ex:g1

ex:simone   ex:knows     ex:michael                   ex:g2   # Not stored in ES
ex:simone   ex:likes     "spaghetti"                  ex:g2
ex:simone   ex:status    "La vita è un sogno"@it      ex:g2

ex:simone   ex:age       "40"^^xsd:int                DG      # Not stored in ES
ex:simone   ex:dummy     "testData"^^dt:newDataType   DG      # Not stored in ES
ex:simone   ex:hates     _:bnode                              # Not stored in ES
_:bnode     ex:means     "coding"                     DG      # Not stored in ES
```

**Documenti**

```
{
  "entity_id": "http://example.org/simone",
  "entity_type": ["http://example.org/Person"],
  "document_type": "rdf-resource"
  "predicates": {
    "http://example.org/likes": [
      {
        "value": "spaghetti",
        "graph": "http://example.org/g1"
      },
      {
        "value": "spaghetti",
        "graph": "http://example.org/g2"
      }
    ]
    "http://example.org/status": [
      {
        "value": "La vita è un sogno",
        "language": "it"       // Only present for rdf:langString
      }
    ]
  }
}
```

```
{
  "entity_id" : "http://example.org/michael",
  "entity_type" : ["http://example.org/Person"],
  "document_type": "rdf-resource"
}
```

## Esempio di documento Gremlin OpenSearch
<a name="full-text-search-model-gremlin-example"></a>

**Dati**

```
# Vertex 1
simone   label    Person       <== Label
simone   likes    "spaghetti"  <== Property
simone   likes    "rice"       <== Property
simone   age      40           <== Property

# Vertex 2
michael  label    Person       <== Label

# Edge 1
simone  knows     michael      <== Edge
e1      updated  "2019-07-03"  <== Edge Property
e1      through  "company"     <== Edge Property
e1      since     10           <== Edge Property
```

**Documenti**

```
{
  "entity_id": "simone",
  "entity_type": ["Person"],
  "document_type": "vertex",
  "predicates": {
    "likes": [
      {
        "value": "spaghetti"
      },
      {
        "value": "rice"
      }
    ]
  }
}
```

```
{
  "entity_id" : "michael",
  "entity_type" : ["Person"],
  "document_type": "vertex"
}
```

```
{
  "entity_id": "e1",
  "entity_type": ["knows"],
  "document_type": "edge"
  "predicates": {
    "through": [
      {
        "value": "company"
      }
    ]
  }
}
```