

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 如何在 Neptune 中为语句编制索引
<a name="feature-overview-storage-indexing"></a>

当您查询四元组的图形时，对于每个四元组位置，您可以指定一个值约束，也可以不指定。查询将返回与您指定的值约束相匹配的所有四元组。

 Neptune 使用索引来解析图形查询模式。这些索引涵盖图形边缘的四个主要组件：主题（LPG 中的源顶点）；谓词（RDF）或者属性或边缘标签（LPG）；对象（LPG 中的目标顶点或属性值）；以及图形（RDF）或边缘标识符（LPG）。这四个四元组组件位置有 16（2^4）种可能的访问模式。您可以有效地查询所有 16 种模式，而无需使用 6 个索引进行扫描和筛选。每个四元组语句索引都使用一个由以不同顺序连接的四个位置值组成的键。涵盖所有 16 个访问路径的四语句索引的一种可能组合是：

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

如果您的数据模型创建了大量不同的谓词，则可能会遇到性能下降和运营成本较高的问题，在 Neptune 默认维护的三个索引之外，还可以使用实验室模式来启用 [OSGP 索引](features-lab-mode.md#features-lab-mode-features-osgp-index)，从而显著改进这些问题。

启用 OSGP 索引可能有一些缺点：
+ 插入速率最多可能会降低 23%。
+ 使用的存储最多会增加 20％。
+ 均匀接触所有索引的读取查询（这是非常少有的情况）的延迟可能会增加。

但是，一般来说，为具有大量不同谓词的数据库集群启用 OSGP 索引是值得的。基于对象的搜索（例如，查找指向某个顶点的所有传入边缘，或者连接到指定对象的所有主题）将变得高效，因此删除顶点的效率也会更高。

**重要**  
您只能首先在空数据库集群中启用 OSGP 索引，然后再将任何数据加载到其中。

   

## Neptune 数据模型中的 Gremlin 语句
<a name="feature-overview-storage-indexing-gremlin"></a>

在 SPOG 模型中，Gremlin 属性图数据使用三个语句类来表示，即：
+ [顶点标签语句](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) 

有关如何在 Gremlin 查询中使用它们的说明，请参阅[了解 Gremlin 查询在 Neptune 中的工作方式](gremlin-explain-background.md)。