

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# OpenSearch データの Neptune データモデル
<a name="full-text-search-model"></a>

Amazon Neptune は、統一された JSON ドキュメント構造を使用して、SPARQL と Gremlin の両方のデータを OpenSearch Service に保存します。OpenSearch の各ドキュメントは 1 つのエンティティに対応し、そのエンティティに関連するすべての情報を格納します。Gremlin の場合、頂点とエッジはエンティティと見なされるため、対応する OpenSearch ドキュメントには頂点、ラベル、およびプロパティに関する情報があります。SPARQL の場合、サブジェクトはエンティティと見なすことができるため、対応する OpenSearch ドキュメントには、1 つのドキュメント内のすべての述語とオブジェクトのペアに関する情報があります。

**注記**  
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` – 頂点またはエッジの 1 つや複数のラベル、またはサブジェクトの 0 個以上の `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"
      }
    ]
  }
}
```