

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

# 使用 Gremlin 访问 Amazon Neptune 中的图形数据
<a name="get-started-graph-gremlin"></a>

你可以使用 Gremlin 控制台在 REPL（read-eval-print 循环）环境中尝试 TinkerPop 图形和查询。

以下教程为您演练使用 Gremlin 控制台将顶点、边缘、属性以及更多内容添加到 Neptune 图形的过程，重点讲述 Neptune 特定的 Gremlin 实施的不同之处。

**注意**  
此示例假定您已完成以下内容：  
您已使用 SSH 连接到 Amazon EC2 实例。
您已创建了一个 Neptune 集群，如[创建 Neptune 集群](get-started-create-cluster.md)中所述。
您已安装了 Gremlin 控制台，如 [安装 Gremlin 控制台](access-graph-gremlin-console.md) 中所述。

**使用 Gremlin 控制台**

1. 将目录更改为解压缩 Gremlin 控制台文件所在的文件夹。

   ```
   cd apache-tinkerpop-gremlin-console-3.7.2
   ```

1. 输入以下命令以运行 Gremlin 控制台。

   ```
   bin/gremlin.sh
   ```

   您应看到以下输出：

   ```
            \,,,/
            (o o)
   -----oOOo-(3)-oOOo-----
   plugin activated: tinkerpop.server
   plugin activated: tinkerpop.utilities
   plugin activated: tinkerpop.tinkergraph
   gremlin>
   ```

   您现在位于 `gremlin>` 提示符处。您在此提示符处输入剩余步骤。

1. 在 `gremlin>` 提示符处，输入以下命令以连接到 Neptune 数据库实例。

   ```
   :remote connect tinkerpop.server conf/neptune-remote.yaml
   ```

1. 在 `gremlin>` 提示符处，输入以下命令以切换到远程模式。这会将所有 Gremlin 查询发送到远程连接。

   ```
   :remote console
   ```

1. **添加带有标签和属性的顶点。**

   ```
   g.addV('person').property('name', 'justin')
   ```

   顶点分配有包含 GUID 的 `string` ID。在 Neptune 中，所有顶点 IDs都是字符串。

1. **添加具有自定义 ID 的顶点。**

   ```
   g.addV('person').property(id, '1').property('name', 'martin')
   ```

   `id` 属性未使用引号引起来。这是顶点 ID 的关键字。顶点 ID 具有一个字符串，其中包含数字 `1`。

   普通属性名称必须包含在引号中。

1. **更改属性或添加属性（如果属性不存在）。**

   ```
   g.V('1').property(single, 'name', 'marko')
   ```

   此处介绍如何更改上一步中顶点的 `name` 属性。这会从 `name` 属性删除现有值。

   如果您未指定 `single`，则会改为将值附加到 `name` 属性（如果尚未附加）。

1. **添加属性，但在属性已有值时附加属性。**

   ```
   g.V('1').property('age', 29)
   ```

   Neptune 使用集基数作为默认操作。

   此命令添加值为 `29` 的 `age` 属性，但不替换任何现有值。

   如果 `age` 属性已有值，此命令将 `29` 附加到属性。例如，如果 `age` 属性是 `27`，则新值将为 `[ 27, 29 ]`。

1. **添加多个顶点。**

   ```
   g.addV('person').property(id, '2').property('name', 'vadas').property('age', 27).iterate()
   g.addV('software').property(id, '3').property('name', 'lop').property('lang', 'java').iterate()
   g.addV('person').property(id, '4').property('name', 'josh').property('age', 32).iterate()
   g.addV('software').property(id, '5').property('name', 'ripple').property('lang', 'java').iterate()
   g.addV('person').property(id, '6').property('name', 'peter').property('age', 35)
   ```

   您可以同时将多个语句添加到 Neptune。

   语句可以使用换行符 (`'\n'`)、空格 (`' '`)、分号 (`'; '`) 或什么都不使用（例如，`g.addV(‘person’).iterate()g.V()` 是有效的）来分隔。
**注意**  
Gremlin 控制台对每个换行符 (`'\n'`) 发送单独的命令，因此在该例中，它们每一个都是一项单独的事务。此示例的每个命令位于单独一行中，以便阅读。删除换行符 (`'\n'`) 可以将其通过 Gremlin 控制台作为单个命令发送。

   除了最后一条语句之外的所有语句必须以终止步骤结尾，例如 `.next()` 或 `.iterate()`，否则语句不会运行。Gremlin 控制台不需要这些终止步骤。在不需要对结果进行序列化时使用 `.iterate`。

   一起发送的所有语句包括在单个事务处理中，并且一起成功或失败。

1. **添加边缘。**

   ```
   g.V('1').addE('knows').to(__.V('2')).property('weight', 0.5).iterate()
   g.addE('knows').from(__.V('1')).to(__.V('4')).property('weight', 1.0)
   ```

   这里介绍了两种不同的方法来添加边缘。

1. **添加现代图形的其余部分。**

   ```
   g.V('1').addE('created').to(__.V('3')).property('weight', 0.4).iterate()
   g.V('4').addE('created').to(__.V('5')).property('weight', 1.0).iterate()
   g.V('4').addE('knows').to(__.V('3')).property('weight', 0.4).iterate()
   g.V('6').addE('created').to(__.V('3')).property('weight', 0.2)
   ```

1. **删除顶点。**

   ```
   g.V().has('name', 'justin').drop()
   ```

   删除 `name` 属性等于 `justin` 的顶点。
**重要**  
*到此为止，你就有了完整的 Apache M TinkerPop odern 图表。 TinkerPop 文档的[遍历部分](https://tinkerpop.apache.org/docs/current/reference/#graph-traversal-steps)中的示例使用了现代图。*

1. **运行遍历。**

   ```
   g.V().hasLabel('person')
   ```

   返回所有 `person` 顶点。

1. **使用值运行遍历 (valueMap())。**

   ```
   g.V().has('name', 'marko').out('knows').valueMap()
   ```

   返回 `marko`“知道”的所有顶点的键值对。

1. **指定多个标签。**

   ```
   g.addV("Label1::Label2::Label3") 
   ```

   Neptune 对于一个顶点支持多个标签。创建标签时，您可以指定多个标签，同时使用 `::` 分隔它们。

   此示例添加具有三个不同标签的顶点。

   `hasLabel` 步骤与具有以下任一三个标签的此顶点相匹配：`hasLabel("Label1")`、`hasLabel("Label2")` 和 `hasLabel("Label3")`。

   `::` 分隔符仅用于此用途。

   您不能在 `hasLabel` 步骤中指定多个标签。例如，`hasLabel("Label1::Label2")` 与任何内容都不匹配。

1. **指定时间/日期**。

   ```
   g.V().property(single, 'lastUpdate', datetime('2018-01-01T00:00:00'))
   ```

   Neptune 不支持 Java 日期。改用该`datetime()`函数。 `datetime()`接受 ISO8061符合条件的`datetime`字符串。

   支持以下格式：`YYYY-MM-DD, YYYY-MM-DDTHH:mm`、`YYYY-MM-DDTHH:mm:SS` 和 `YYYY-MM-DDTHH:mm:SSZ`。

1. **删除顶点、属性或边缘。**

   ```
   g.V().hasLabel('person').properties('age').drop().iterate()
   g.V('1').drop().iterate()
   g.V().outE().hasLabel('created').drop()
   ```

   下面是几个删除示例。
**注意**  
 `.next()` 步骤不可与 `.drop()` 一起使用。请改用 `.iterate()`。

1. 完成后，输入以下命令以退出 Gremlin 控制台。

   ```
   :exit
   ```

**注意**  
使用分号 (`;`) 或换行符 (`\n`) 分隔每个语句。  
在最后遍历之前的每个遍历必须以要执行的 `iterate()` 结尾。仅返回最后遍历中的数据。