结果格式
响应可以以三种格式返回查询数据:JSON、Jolt 或图形。
JSON
JSON 格式是默认格式,并返回包含嵌入式results
元素的 JSON。要请求此格式,请在请求标头中设置Accept: application/json
(或完全避免指定它,因为如果没有提供Accept
标头,则它是默认值)。
{
"results": [
{
"columns": [ columns-list ], (1)
"data": [
{
"row": [ row-data ], (2)
"meta": [ entities-metadata ] (3)
},
]
},
{
//another statement's results
}
]
}
1 | 查询字段,即返回对象的键 |
2 | 查询结果(内部结构取决于对象类型) |
3 | 每个返回实体(节点/关系)的元数据 |
示例请求
POST http://localhost:7474/db/neo4j/tx/commit
Accept: application/json;charset=UTF-8
Content-Type: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{
"statements": [
{
"statement": "MERGE (p:Person {name: $name}) RETURN p AS person",
"parameters": {
"name": "Phil"
}
}
]
}
示例响应
{
"results": [ {
"columns": [ "person" ],
"data": [ {
"row": [ {
"name": "Phil"
} ],
"meta": [ {
"id": 11, (1)
"elementId": "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:11", (2)
"type": "node", (3)
"deleted": false (4)
} ]
} ]
} ],
// other transactional data
}
1 | (已弃用)数据库中的实体 ID |
2 | 数据库中的实体 ID |
3 | 实体类型 |
4 | 实体是否在查询中被删除(在对它运行 Cypher DELETE 后返回实体时,它为true ) |
应谨慎使用elementId ,因为不保证单个事务范围之外的 ID 值和元素之间的映射。换句话说,跨不同事务使用elementId 来MATCH 元素是有风险的。 |
Jolt
Jolt(JSON Bolt的简称)是一种基于 JSON 的格式,它将响应值的类型与值一起封装在单例对象中。
例如,{"Z": "2"}
将值2
标记为整数类型。
要以这种格式接收结果,请按如下方式设置Accept
标头
Accept: application/vnd.neo4j.jolt-v2
容器格式
Jolt 结果以基于事件的容器格式返回。典型的响应如下所示
{"header":{"fields":["name","age"]}}
{"data":[{"U":"Bob"},{"Z":"30"}]}
{"data":[{"U":"Alice"},{"Z":"40"}]}
{"data":[{"U":"Eve"},{"Z":"50"}]}
...
{"summary":{}}
{"info":{"commit":"commit/uri/1"}}
事件 | 功能 |
---|---|
|
标记语句的结果集的开始,并包含查询字段。 |
|
每个返回记录的一个这样的对象。每个查询都可能返回多个 |
|
标记语句的结果集的结束。包含查询计划信息(如果请求)。 |
|
在处理所有语句后出现的最后一个事件(除非发生错误)。包含事务信息(例如提交 URI、书签)。 |
|
在处理事务期间发生的错误。 |
换行符分隔模式和 JSON 序列模式
默认情况下,Jolt 以换行符分隔模式返回。在此模式下,每个事件都是一个单独的 JSON 文档,由单个LF
字符(换行符,UTF 编码:0x8A
)分隔。
{"header":{"fields":["result"]}}\n
{"data":[{"Z":"1"}]}\n
{"summary":{}}\n
{"info":{}}\n
API 也可以以JSON 序列模式返回它(根据RFC 7464进行编码)。要实现这一点,请按如下方式设置Accept
标头
Accept: application/vnd.neo4j.jolt-v2+json-seq
在此模式下,每个事件都在每个文档的开头用RS
字符(记录分隔符/信息分隔符二,UTF-8 编码:0x1E
)以及末尾的LF
字符封装。
\u001E{"header":{"fields":["result"]}}\n
\u001E{"data":[{"Z":"1"}]}\n
\u001E{"summary":{}}\n
\u001E{"info":{}}\n
稀疏模式和严格模式
默认情况下,Jolt 以稀疏模式返回数据,该模式省略可以与 JSON 类型匹配的值的类型配对。
在严格模式下,**所有**值都与其类型配对。要启用严格模式,请将;strict=true
附加到Accept
标头
Accept: application/vnd.neo4j.jolt-v2;strict=true
Accept: application/vnd.neo4j.jolt-v2+json-seq;strict=true
有关类型匹配的信息,请参见Jolt 类型。
请求中的多个结果集
当单个请求中有多个查询时,每个查询将有多个header
、data
和summary
输出。结果集按请求中指定的顺序返回。
示例请求
POST http://localhost:7474/db/neo4j/tx/commit
Accept: application/vnd.neo4j.jolt-v2
Content-Type: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{
"statements": [
{ "statement": "RETURN 1 AS resultA" },
{ "statement": "UNWIND range(1,3,1) AS resultB RETURN resultB" }
]
}
示例响应
200: OK
Content-Type: application/vnd.neo4j.jolt-v2
{"header":{"fields":["resultA"]}}
{"data":[{"Z":"1"}]}
{"summary":{}}
{"header":{"fields":["resultB"]}}
{"data":[{"Z":"1"}]}
{"data":[{"Z":"2"}]}
{"data":[{"Z":"3"}]}
{"summary":{}}
{"info":{}}
Jolt 类型
本节详细介绍了如何在 Jolt 中标记Cypher 类型。
基本类型
类型标签 | 类型 | 示例 |
---|---|---|
(N/A) |
null |
|
|
布尔值 |
|
|
整数 |
|
|
浮点数 |
|
|
字符串 |
|
|
时间 |
|
|
空间 |
|
|
十六进制 |
|
1. 类型标签 |
实体类型
- 节点
-
{"()": [node_id, [ node_labels], {"prop1": "value1", "prop2": "value2"}]}
示例请求
POST http://localhost:7474/db/neo4j/tx/commit Accept: application/vnd.neo4j.jolt-v2 Content-Type: application/json Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{ "statements": [ { "statement": "MERGE (p:Person:Employee {name: 'Phil', age: 21}) RETURN p" } ] }
示例响应
200: OK Content-Type: application/vnd.neo4j.jolt-v2
{ "header": { "fields": [ "p" ] } } { "data": [ { "()": [ "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:12", [ "Person", "Employee" ], { "name": "Phil", "age": 21 } ] } ] } { "summary": {} } { "info": { "lastBookmarks": [ "FB:kcwQt8DpQx5zR0uN3Oj/OudM3ReQ" ] } }
- 关系
-
{"->": [rel_id, start_node_id, rel_type, end_node_id, {properties}]} {"<-": [rel_id, end_node_id, rel_type, start_node_id, {properties}]}
示例请求
POST http://localhost:7474/db/neo4j/tx/commit Accept: application/vnd.neo4j.jolt-v2 Content-Type: application/json Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{ "statements": [ { "statement": "MERGE (:Person:Employee {name: 'Phil', age: 21})-[rel:KNOWS {since: 1999}]->(:Person {name: 'Lucy', age: 20}) RETURN rel" } ] }
示例响应
200: OK Content-Type: application/vnd.neo4j.jolt-v2
{ "header": { "fields": [ "rel" ] } } { "data": [ { "->": [ "5:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:7", "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:12", "KNOWS", "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:13", { "since": 1999 } ] } ] } { "summary": {} } { "info": { "lastBookmarks": [ "FB:kcwQt8DpQx5zR0uN3Oj/OudM3ReQ" ] } }
- 路径
-
{"..": [{node_1}, {rel_1}, {node_2}, ..., {node_n}, {rel_n}, {node_n+1}]}
示例请求
POST http://localhost:7474/db/neo4j/tx/commit Accept: application/vnd.neo4j.jolt-v2 Content-Type: application/json Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{ "statements": [ { "statement": "MERGE path=(:Person:Employee {name: 'Phil', age: 21})-[:KNOWS {since: 1999}]->(:Person {name: 'Lucy', age: 20}) RETURN path" } ] }
示例响应
200: OK Content-Type: application/vnd.neo4j.jolt-v2
{ "header": { "fields": [ "path" ] } } { "data": [ { "..": [ { "()": [ "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:12", [ "Person", "Employee" ], { "name": "Phil", "age": 21 } ] }, { "->": [ "5:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:7", "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:12", "KNOWS", "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:13", { "since": 1999 } ] }, { "()": [ "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:13", [ "Person" ], { "name": "Lucy", "age": 20 } ] } ] } ] } { "summary": {} } { "info": { "lastBookmarks": [ "FB:kcwQt8DpQx5zR0uN3Oj/OudM3ReQ" ] } }
图形
图形格式整理结果所有列中的所有节点和关系,并展平节点和关系的集合,包括路径。此格式有助于理解查询返回的节点和关系的图形结构。
示例请求
POST http://localhost:7474/db/neo4j/tx/commit
Accept: application/json;charset=UTF-8
Content-Type: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{
"statements": [
{
"statement": "CREATE (bike:Bike {weight: 10}) CREATE (frontWheel:Wheel {spokes: 3}) CREATE (backWheel:Wheel {spokes: 32}) CREATE p1 = (bike)-[:HAS {position: 1}]->(frontWheel) CREATE p2 = (bike)-[:HAS {position: 2} ]->(backWheel) RETURN bike, p1, p2",
"resultDataContents": ["graph"]
}
]
}
示例响应
200: OK
Content-Type: application/json;charset=utf-8
{
"results": [ {
"columns": [
"bike",
"p1",
"p2"
],
"data": [ {
"graph": {
"nodes": [
{
"id": "17",
"elementId": "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:17",
"labels": [ "Wheel" ],
"properties": { "spokes": 3 }
},
{
"id": "18",
"elementId": "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:18",
"labels": [ "Wheel" ],
"properties": { "spokes": 32 }
},
{
"id": "16",
"elementId": "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:16",
"labels": [ "Bike" ],
"properties": { "weight": 10 }
}
],
"relationships": [
{
"id": "9",
"elementId": "5:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:9",
"type": "HAS",
"startNode": "16",
"startNodeElementId": "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:16",
"endNode": "17",
"endNodeElementId": "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:17",
"properties": { "position": 1 }
},
{
"id": "10",
"elementId": "5:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:10",
"type": "HAS",
"startNode": "16",
"startNodeElementId": "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:16",
"endNode": "18",
"endNodeElementId": "4:b7c0e943-1e73-474b-8ddc-e8ff3ae74cdd:18",
"properties": { "position": 2 }
}
]
}
} ]
} ],
"errors": [],
"commit": "http://localhost:7474/db/neo4j/tx/14/commit",
"transaction": {
"expires": "Wed, 9 Aug 2023 08:08:35 GMT"
}
}
您还可以将默认返回格式与图形格式结合使用。要实现这一点,请设置 |
由于图形格式与结果主体如何编码无关,因此它可以与 JSON 或 Jolt |