

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

# Neptune 如何使用陳述式索引來處理 Gremlin 查詢
<a name="gremlin-explain-background-indexing-examples"></a>

陳述式會在 Amazon Neptune 中透過三個陳述式索引的方式存取，如 [陳述式在 Neptune 中如何編製索引](feature-overview-storage-indexing.md) 中所述。Neptune 從 Gremlin 查詢中擷取陳述式「模式」**，其中某些位置已知，其餘位置則留給索引搜尋進行探索。

Neptune 假設屬性圖結構描述的大小不大。這表示不同邊緣標籤和屬性名稱的數量相當低，導致不同的述詞總數很低。Neptune 會在個別索引中追蹤不同的述詞。它會使用此述詞快取來執行的 `{ all P x POGS }` 聯合掃描，而不是使用 OSGP 索引。避免需要反向周遊 OSGP 索引，可同時節省儲存空間和載入輸送量。

Neptune Gremlin Explain/設定檔 API 可讓您在圖形中取得述詞計數。然後，您可以判斷您的應用程式是否會使屬性圖結構描述很小的 Neptune 假設失效。

以下範例可協助說明 Neptune 如何使用索引來處理 Gremlin 查詢。

**問：什麼是頂點 `v1` 的標籤？**

```
  Gremlin code:      g.V('v1').label()
  Pattern:           (<v1>, <~label>, ?, ?)
  Known positions:   SP
  Lookup positions:  OG
  Index:             SPOG
  Key range:         <v1>:<~label>:*
```

**問：什麼是頂點 `v1` 的「已知」外邊緣？**

```
  Gremlin code:      g.V('v1').out('knows')
  Pattern:           (<v1>, <knows>, ?, ?)
  Known positions:   SP
  Lookup positions:  OG
  Index:             SPOG
  Key range:         <v1>:<knows>:*
```

**問：哪些頂點有 `Person` 頂點標籤？**

```
  Gremlin code:      g.V().hasLabel('Person')
  Pattern:           (?, <~label>, <Person>, <~>)
  Known positions:   POG
  Lookup positions:  S
  Index:             POGS
  Key range:         <~label>:<Person>:<~>:*
```

**問：什麼是指定邊緣 `e1` 的來源/目標頂點？**

```
  Gremlin code:      g.E('e1').bothV()
  Pattern:           (?, ?, ?, <e1>)
  Known positions:   G
  Lookup positions:  SPO
  Index:             GPSO
  Key range:         <e1>:*
```

Neptune **沒有**的陳述式索引是反向周遊 OSGP 索引。此索引可用來收集所有邊緣標籤的所有傳入邊緣，如下列範例所示。

**問：什麼是傳入的相鄰頂點`v1`？**

```
  Gremlin code:      g.V('v1').in()
  Pattern:           (?, ?, <v1>, ?)
  Known positions:   O
  Lookup positions:  SPG
  Index:             OSGP  // <-- Index does not exist
```