

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

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

创建连接后，您可以与 Amazon Neptune 数据库集群进行交互。这包括加载数据、执行查询和执行其他操作。大多数用户利用 `curl` 或 `awscurl` 命令行工具有效地与 Neptune 数据库集群进行通信。使用这些工具，您可以发送请求、加载数据并从图形数据库检索结果，从而帮助实现无缝的数据管理和查询功能。

## 设置 `curl` 以与您的 Neptune 端点进行通信
<a name="get-started-access-graph-curl"></a>

如本文档中的多个示例所示，[curl](https://curl.haxx.se/) 命令行工具是用于与您的 Neptune 端点进行通信的方便选项。有关该工具的信息，请参阅 [curl 手册页面](https://curl.haxx.se/docs/manpage.html)和电子书 *[Everything curl](https://ec.haxx.se/)*。

要使用 HTTPS 进行连接（正如我们所建议以及 Neptune 在大多数区域中所要求的），`curl` 需要对相应证书拥有访问权限。要了解如何获取这些证书以及如何将其正确格式化为 `curl` 可以使用的证书颁发机构 (CA) 证书存储，请参阅 `curl` 文档中的 [SSL 证书验证](https://curl.haxx.se/docs/sslcerts.html)。

然后，您使用 `CURL_CA_BUNDLE` 环境变量指定此 CA 证书存储的位置。在 Windows 上，`curl` 自动在名为 `curl-ca-bundle.crt` 的文件中查找它。首先在与 `curl.exe` 相同的目录中查找，然后在路径的其他位置查找。有关更多信息，请参阅 [SSL 证书验证](https://curl.haxx.se/docs/sslcerts.html)。

只要 `curl` 可以找到相应的证书，它即可像处理 HTTP 连接一样处理 HTTPS 连接，而无需额外的参数。本文档中的示例基于该场景。

## 使用查询语言访问 Neptune 数据库集群中的图形数据
<a name="get-started-access-graph-query-langs"></a>

连接后，您可以使用 Gremlin 和 openCypher 查询语言来创建和查询属性图，或者使用 SPARQL 查询语言来创建和查询包含 RDF 数据的图形。

**Neptune 支持的图形查询语言**
+ [Gremlin](access-graph-gremlin.md) 是用于属性图的图形遍历语言。Gremlin 中的查询是由离散步骤组成的遍历，每个步骤都沿着一个边缘到达一个节点。有关更多信息，请参阅 [Apache](https://tinkerpop.apache.org/docs/current/reference/) 上的 Gremlin 文档 TinkerPop。

  Gremlin 的 Neptune 实施与其它实施有一些差别，尤其是在您使用 Gremlin-Groovy 时（作为序列化文本发送的 Gremlin 查询）。有关更多信息，请参阅 [Amazon Neptune 中的 Gremlin 标准合规性](access-graph-gremlin-differences.md)。
+ [openCypher](access-graph-opencypher.md) 是一种用于属性图的声明式查询语言，最初由 Neo4j 开发，然后于 2015 年开源，并在 Apache 2 开源许可证下为 [openCypher](http://www.opencypher.org/) 项目做出了贡献。其语法在 [Cypher 查询语言参考版本 9](https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf) 中介绍。
+ [SPARQL](access-graph-sparql.md) 是一种用于 [RDF](https://www.w3.org/2001/sw/wiki/RDF) 数据的声明性查询语言，基于由万维网联盟 (W3C) 标准化的图形模式匹配，并在 [SPARQL 1.1 概述](https://www.w3.org/TR/sparql11-overview/)和 [SPARQL 1.1 查询语言规范](https://www.w3.org/TR/sparql11-query/)中描述。

**注意**  
可以同时使用 Gremlin 和 openCypher 在 Neptune 中访问属性图数据，而不使用 SPARQL。同样，您只能使用 SPARQL 访问 RDF 数据，而不能使用 Gremlin 或 openCypher。

# 使用 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()` 结尾。仅返回最后遍历中的数据。

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

[要开始使用 OpenCypher，请查看或使用 Nept [openCypher](access-graph-opencypher.md) une 图形笔记本存储库中的 OpenCypher 笔记本。 GitHub ](https://github.com/aws/graph-notebook/tree/main/src/graph_notebook/notebooks)

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

SPARQL 是一种用于资源描述框架 (RDF) 的查询语言，这是一种专为 Web 设计的图形数据格式。Amazon Neptune 与 SPARQL 1.1 兼容。这表示您可以连接到 Neptune 数据库实例并使用 [SPARQL 1.1 查询语言](https://www.w3.org/TR/sparql11-query/)规范中所述的查询语言查询图形。

 SPARQL 中的查询包含一个用于指定要返回的变量的 `SELECT` 子句和一个用于指定要在图形中匹配的数据的 `WHERE` 子句。如果您不熟悉 SPARQL 查询，请参阅 [SPARQL 1.1 查询语言](https://www.w3.org/TR/sparql11-query/#WritingSimpleQueries)中的[编写简单查询](https://www.w3.org/TR/sparql11-query/)。

针对 Neptune 数据库实例的 SPARQL 查询的 HTTP 端点为 `https://your-neptune-endpoint:port/sparql`。

**连接到 SPARQL**

1. **你可以从堆栈输出部分的项目中获取 Neptune 集群**SparqlEndpoint**的 SPARQL 终端节点。** CloudFormation 

1. 输入以下内容以使用 HTTP `POST` 和 **curl** 命令提交 SPARQL **`UPDATE`**。

   ```
   curl -X POST --data-binary 'update=INSERT DATA { <https://test.com/s> <https://test.com/p> <https://test.com/o> . }' https://your-neptune-endpoint:port/sparql
   ```

   上述示例将以下三元组插入 SPARQL 默认图形中：`<https://test.com/s> <https://test.com/p> <https://test.com/o>`

1. 输入以下内容以使用 HTTP `POST` 和 **curl** 命令提交 SPARQL **`QUERY`**。

   ```
   curl -X POST --data-binary 'query=select ?s ?p ?o where {?s ?p ?o} limit 10' https://your-neptune-endpoint:port/sparql
   ```

   前面的示例使用限制为 10 的`?s ?p ?o`查询，返回图中最多 10 个三元组 (subject-predicate-object)。要查询其他内容，请将其替换为其他 SPARQL 查询。
**注意**  
对于 `SELECT` 和 `ASK` 查询，响应的默认 MIME 类型为 `application/sparql-results+json`。  
对于 `CONSTRUCT` 和 `DESCRIBE` 查询，响应的默认 MIME 类型为 `application/n-quads`。  
有关所有可用的 MIME 类型的列表，请参阅 [SPARQL HTTP API](sparql-api-reference.md)。