Amazon Neptune openCypher HTTPS 端点 - Amazon Neptune

Amazon Neptune openCypher HTTPS 端点

HTTPS 端点上的 openCypher 读取和写入查询

openCypher HTTPS 端点支持使用 GETPOST 方法执行读取和更新查询。不支持 DELETEPUT 方法。

以下说明将为您介绍如何使用 curl 命令和 HTTPS 连接到 openCypher 端点。必须从与您的 Neptune 数据库实例位于同一虚拟私有云 (VPC) 中的 Amazon EC2 实例中按照这些说明操作。

语法如下:

HTTPS://(the server):(the port number)/openCypher

以下是示例读取查询,一个使用 POST,一个使用 GET

1. 使用 POST

curl HTTPS://server:port/openCypher \ -d "query=MATCH (n1) RETURN n1;"

2. 使用 GET(查询字符串采用 URL 编码):

curl -X GET \ "HTTPS://server:port/openCypher?query=MATCH%20(n1)%20RETURN%20n1"

以下是示例写入/更新查询,一个使用 POST,一个使用 GET

1. 使用 POST

curl HTTPS://server:port/openCypher \ -d "query=CREATE (n:Person { age: 25 })"

2. 使用 GET(查询字符串采用 URL 编码):

curl -X GET \ "HTTPS://server:port/openCypher?query=CREATE%20(n%3APerson%20%7B%20age%3A%2025%20%7D)"

默认 openCypher JSON 结果格式

默认情况下或通过将请求标头显式设置为 Accept: application/json,返回以下 JSON 格式。这种格式旨在使用大多数库的原生语言特征轻松解析为对象。

返回的 JSON 文档包含一个字段 results,其中包含查询返回值。以下示例显示了常用值的 JSON 格式。

值响应示例:

{ "results": [ { "count(a)": 121 } ] }

节点响应示例:

{ "results": [ { "a": { "~id": "22", "~entityType": "node", "~labels": [ "airport" ], "~properties": { "desc": "Seattle-Tacoma", "lon": -122.30899810791, "runways": 3, "type": "airport", "country": "US", "region": "US-WA", "lat": 47.4490013122559, "elev": 432, "city": "Seattle", "icao": "KSEA", "code": "SEA", "longest": 11901 } } } ] }

关系响应示例:

{ "results": [ { "r": { "~id": "7389", "~entityType": "relationship", "~start": "22", "~end": "151", "~type": "route", "~properties": { "dist": 956 } } } ] }

路径响应示例:

{ "results": [ { "p": [ { "~id": "22", "~entityType": "node", "~labels": [ "airport" ], "~properties": { "desc": "Seattle-Tacoma", "lon": -122.30899810791, "runways": 3, "type": "airport", "country": "US", "region": "US-WA", "lat": 47.4490013122559, "elev": 432, "city": "Seattle", "icao": "KSEA", "code": "SEA", "longest": 11901 } }, { "~id": "7389", "~entityType": "relationship", "~start": "22", "~end": "151", "~type": "route", "~properties": { "dist": 956 } }, { "~id": "151", "~entityType": "node", "~labels": [ "airport" ], "~properties": { "desc": "Ontario International Airport", "lon": -117.600997924805, "runways": 2, "type": "airport", "country": "US", "region": "US-CA", "lat": 34.0559997558594, "elev": 944, "city": "Ontario", "icao": "KONT", "code": "ONT", "longest": 12198 } } ] } ] }

用于多部分 openCypher 响应的可选 HTTP 尾随标头

该特征从 Neptune 引擎发行版本 1.4.5.0 开始推出。

对 openCypher 查询和更新的 HTTP 响应通常以多个块的形式返回。如果在发送初始响应块(HTTP 状态码为 200)之后发生失败,诊断问题可能会变得很困难。默认情况下,Neptune 通过在消息正文中附加错误消息来报告此类失败,消息正文可能会因响应的流式传输性质而被损坏。

使用尾随标头

为了改进错误检测和诊断,您可以通过在请求中包含传输编码(TE)尾随标头(te: trailers)来启用尾随标头。这样做会导致 Neptune 在响应块的尾随标头中加入两个新的标头字段:

  • X-Neptune-Status – 包含响应代码后跟一个短名称。例如,如果成功,则尾随标头将是:X-Neptune-Status: 200 OK。如果失败,响应代码将是 Neptune 引擎错误代码,例如 X-Neptune-Status: 500 TimeLimitExceededException

  • X-Neptune-Detail – 对于成功的请求,为空。如果出现错误,则它包含 JSON 错误消息。由于 HTTP 标头值中只允许使用 ASCII 字符,因此 JSON 字符串是经过 URL 编码的。错误消息还会附加到响应消息正文中。

有关更多信息,请参阅有关 TE 请求标头的 MDN 页面

openCypher 尾随标头使用示例

此示例演示了尾随标头如何帮助诊断超出其时间限制的查询:

curl --raw 'https://your-neptune-endpoint:port/openCypher' \ -H 'TE: trailers' \ -d 'query=MATCH(n) RETURN n.firstName' Output: < HTTP/1.1 200 OK < transfer-encoding: chunked < trailer: X-Neptune-Status, X-Neptune-Detail < content-type: application/json;charset=UTF-8 < < { "results": [{ "n.firstName": "Hossein" }, { "n.firstName": "Jan" }, { "n.firstName": "Miguel" }, { "n.firstName": "Eric" }, {"detailedMessage":"Operation terminated (deadline exceeded)", "code":"TimeLimitExceededException", "requestId":"a7e9d2aa-fbb7-486e-8447-2ef2a8544080", "message":"Operation terminated (deadline exceeded)"} 0 X-Neptune-Status: 500 TimeLimitExceededException X-Neptune-Detail: %7B%22detailedMessage%22%3A%22Operation+terminated+%28deadline+exceeded%29%22%2C%22code%22%3A%22TimeLimitExceededException%22%2C%22requestId%22%3A%22a7e9d2aa-fbb7-486e-8447-2ef2a8544080%22%2C%22message%22%3A%22Operation+terminated+%28deadline+exceeded%29%22%7D
响应详解:

前面的示例显示了带有尾随标头的 openCypher 响应如何帮助诊断查询失败。在此示例中,我们可以看到四个连续的部分:(1)初始标头,状态为 200 OK,表明流式传输已开始;(2)失败前成功流式传输的部分(损坏)JSON 结果;(3)显示超时的附加错误消息;(4)包含最终状态(500 TimeLimitExceededException)和详细错误信息的尾随标头。