

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# OpenSearch 資料的 Neptune 資料模型
<a name="full-text-search-model"></a>

Amazon Neptune 會使用統一的 JSON 文件結構，在 OpenSearch Service 中儲存 SPARQL 和 Gremlin 資料。OpenSearch 中的每份文件都會對應至一個實體，並儲存該實體的所有相關資訊。對 Gremlin 而言，頂點和邊緣皆視為實體，所以對應的 OpenSearch 文件會包含頂點、標籤和屬性的資訊。對 SPARQL 而言，主體可視為實體，所以對應的 OpenSearch 文件在一份文件中包含所有述詞物件對的資訊。

**注意**  
Neptune 至 OpenSearch 的複寫實作只會儲存字串資料。但可加以修改以儲存其他資料類型。

統一的 JSON 文件結構如下所示。

```
{
  "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。
  + 對於 SPARQL 而言，這是主體 URI。
  + 對於 Gremlin 而言，這是 `Vertex_ID` 或 `Edge_ID`。
+ `entity_type` - 表示頂點或邊緣的一或多個標籤，或為主體的零或多個 `rdf:type` 述詞值。
+ `document_type` - 用來指定目前文件代表頂點、邊緣，還是 rdf 資源。
+ `predicates` - 若為 Gremlin，儲存頂點或邊緣的屬性和值。若為 SPARQL，則儲存述詞物件對。

  屬性名稱會在 OpenSearch 中採用格式 `properties.name.value`。若要查詢該屬性，則必須採用該形式加以命名。
+ `value ` - Gremlin 的屬性值或 SPARQL 的物件值。
+ `graph` - SPARQL 的具名圖形。
+ `language` - SPARQL 中 `rdf:langString` 常值的語言標籤。

## 範例 SPARQL OpenSearch 文件
<a name="full-text-search-model-sparql-example"></a>

**資料**

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

**文件**

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

## 範例 Gremlin OpenSearch 文件
<a name="full-text-search-model-gremlin-example"></a>

**資料**

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

**文件**

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