Amazon Neptune openCypher HTTPS 端点
HTTPS 端点上的 openCypher 读取和写入查询
openCypher HTTPS 端点支持使用 GET 和 POST 方法执行读取和更新查询。不支持 DELETE 和 PUT 方法。
以下说明将为您介绍如何使用 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)和详细错误信息的尾随标头。