

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Modèle de données Neptune pour les données OpenSearch
<a name="full-text-search-model"></a>

Amazon Neptune utilise une structure de document JSON unifiée pour stocker les données SPARQL et Gremlin dans Service. OpenSearch Chaque document OpenSearch correspond à une entité et stocke toutes les informations pertinentes pour cette entité. Pour Gremlin, les sommets et les arêtes sont considérés comme des entités. Les OpenSearch documents correspondants contiennent donc des informations sur les sommets, les étiquettes et les propriétés. Pour SPARQL, les sujets peuvent être considérés comme des entités, de sorte que les OpenSearch documents correspondants contiennent des informations sur toutes les paires prédicat-objet dans un seul document.

**Note**  
L'implémentation de Neptune-to-OpenSearch réplication ne stocke que des données sous forme de chaîne. Toutefois, vous pouvez le modifier pour stocker d'autres types de données.

La structure de document JSON unifiée ressemble à ce qui suit.

```
{
  "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 unique d'entité représentant le document.
  + Pour SPARQL, il s'agit de l'URI de sujet.
  + Pour Gremlin, c'est le `Vertex_ID` ou `Edge_ID`.
+ `entity_type` : représente une ou plusieurs étiquettes pour un sommet ou une arête, ou zéro ou plusieurs valeurs de prédicat `rdf:type` pour un sujet.
+ `document_type` : permet de spécifier si le document actuel représente un sommet, une arête ou une ressource RDF.
+ `predicates` : pour Gremlin, stocke les propriétés et les valeurs d'un sommet ou d'une arête. Pour SPARQL, il stocke les paires prédicat-objet.

  Le nom de la propriété prend le formulaire `properties.name.value` dans OpenSearch. Pour l'interroger, vous devez le nommer sous cette forme.
+ `value ` : valeur de propriété pour Gremlin ou valeur d'objet pour SPARQL.
+ `graph` : graphe nommé pour SPARQL.
+ `language` : balise de langage pour un littéral `rdf:langString` dans SPARQL.

## Exemple de document SPARQL OpenSearch
<a name="full-text-search-model-sparql-example"></a>

**Données**

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

**Documents**

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

## Exemple de document Gremlin OpenSearch
<a name="full-text-search-model-gremlin-example"></a>

**Données**

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

**Documents**

```
{
  "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"
      }
    ]
  }
}
```