

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

# 陳述式在 Neptune 中如何編製索引
<a name="feature-overview-storage-indexing"></a>

當您查詢 quad 圖表，您可以對每個 quad 指定值限制，也可以不指定。查詢會傳回符合您指定之值限制的所有 quad。

 Neptune 使用索引來解析圖形查詢模式。這些索引位於圖形邊緣的四個主要元件上：主體 (LPG 中的來源頂點）、述詞 (RDF) 或屬性或邊緣標籤 (LPG)、物件 (LPG 中的目標頂點或屬性值），以及圖形 (RDF) 或邊緣識別符 (LPG)。這四個四元元件位置有 16 (2^4) 個可能的存取模式。您可以有效率地查詢所有 16 種模式，而無需使用六個索引進行掃描和篩選。每個 quad 陳述式索引使用由以不同順序串連的四個位置值組成的索引鍵。涵蓋所有 16 個存取路徑的 quad 陳述式索引可能組合為：

```
       Access Pattern                                     Index key order
  ----------------------------------------------------    ---------------
   1.  ????  (No constraints; returns every quad)             SPOG
   2.  SPOG  (Every position is constrained)                  SPOG
   3.  SPO?  (S, P, and O are constrained; G is not)          SPOG
   4.  SP??  (S and P are constrained; O and G are not)       SPOG
   5.  S???  (S is constrained; P, O, and G are not)          SPOG
   6.  S??G  (S and G are constrained; P and O are not)       SPOG

   7.  ?POG  (P, O, and G are constrained; S is not)          POGS
   8.  ?PO?  (P and O are constrained; S and G are not)       POGS
   9.  ?P??  (P is constrained; S, O, and G are not)          POGS

  10.  ?P?G  (P and G are constrained; S and O are not)       GPSO
  11.  SP?G  (S, P, and G are constrained; O is not)          GPSO
  12.  ???G  (G is constrained; S, P, and O are not)          GPSO

  13.  S?OG  (S, O, and G are constrained; P is not)          OGSP
  14.  ??OG  (O and G are constrained; S and P are not)       OGSP
  15.  ??O?  (O is constrained; S, P, and G are not)          OGSP

  16.  S?O?  (S and O are constrained; P and G are not)       OSGP
```

根據預設，Neptune 只會建立和維護這六個索引中的三個：
+ `SPOG –  ` 使用 `Subject + Predicate + Object + Graph` 組成的索引鍵。
+ `POGS –  ` 使用 `Predicate + Object + Graph + Subject` 組成的索引鍵。
+ `GPSO –  ` 使用 `Graph + Predicate + Subject + Object` 組成的索引鍵。

這三個索引會處理許多最常見的存取模式。只維護三個完整陳述式索引 (而非六個)，可大幅減少支援不經掃描和篩選而快速存取所需的資源。例如，每當頂點或頂點和屬性識別符等位置字首繫結時，`SPOG` 索引會允許有效查詢。只有存放於 `P` 位置的邊緣或屬性標籤繫結時，`POGS` 索引才會允許有效存取。

尋找陳述式的低層級 API 採用的陳述式模式，其中有些位置已知，而其餘則保留供索引搜尋探索。透過根據其中一個陳述式索引的索引鍵順序，在索引鍵字首索引鍵中構成已知位置，Neptune 執行範圍掃描來擷取符合已知位置的所有陳述式。

不過，根據預設，Neptune 未**建立的其中一個陳述式索引是反向周遊 `OSGP` 索引，它可以跨物件和主題收集述詞。Neptune 預設會改為在個別索引中追蹤它用來進行 `{all P x POGS}` 聯合掃描的不同述詞。使用 Gremlin 時，述詞對應到屬性或邊緣標籤。

如果圖形中的不同述詞量很大時，預設的 Neptune 存取策略會變得沒有效率。例如，在 Gremlin 中，未指定邊緣標籤的 `in()` 步驟，或內部使用 `in()` 的任何步驟 (例如 `both()` 或 `drop()`) 可能會變得沒有效率。

## 使用實驗室模式啟用 OSGP 索引建立
<a name="feature-overview-storage-indexing-osgp"></a>

如果您的資料模型建立大量不同的述詞，可能會遇到效能降低和營運成本增加的情況，這些可藉由使用實驗室模式來啟用 [OSGP 索引](features-lab-mode.md#features-lab-mode-features-osgp-index) (除了 Neptune 根據預設維護的三個索引以外) 而大幅改善。

啟用 OSGP 索引可能會有幾個缺點：
+ 插入速率最多可能減慢 23%。
+ 儲存量增加高達 20%。
+ 均等觸及所有索引的讀取查詢 (這是很少見的情況) 可能會增加延遲。

不過，一般而言，啟用具有大量不同述詞之資料庫叢集的 OSGP 索引是值得的。物件型搜尋變成很有效率 (例如，尋找頂點的所有傳入邊緣，或連線到給定物件的所有主體)，因此，降低頂點也變得更有效率。

**重要**  
在載入任何資料之前，您只能在空白的資料庫叢集中啟用 OSGP 索引。

   

## Neptune 資料模型中的 Gremlin 陳述式
<a name="feature-overview-storage-indexing-gremlin"></a>

Gremlin 屬性圖資料在 SPOG 模型中使用三類陳述式來表示，即：
+ [頂點標籤陳述式](gremlin-explain-background-statements.md#gremlin-explain-background-vertex-labels)
+ [邊緣陳述式](gremlin-explain-background-statements.md#gremlin-explain-background-edge-statements) 
+ [屬性陳述式](gremlin-explain-background-statements.md#gremlin-explain-background-property-statements) 

如需如何在 Gemlin 查詢中使用這些陳述式的說明，請參閱 [了解 Gremlin 查詢如何在 Neptune 中運作](gremlin-explain-background.md)。