结果格式

响应可以以三种格式返回查询数据:JSON、Jolt 或图形。

JSON

JSON 格式是默认格式,并返回包含嵌入式results元素的 JSON。要请求此格式,请在请求标头中设置Accept: application/json(或完全避免指定它,因为如果没有提供Accept标头,则它是默认值)。

JSON 输出格式原型
{
  "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 值和元素之间的映射。换句话说,跨不同事务使用elementIdMATCH元素是有风险的。

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"}}
表 1. 容器格式对象
事件 功能

header

标记语句的结果集的开始,并包含查询字段。

data

每个返回记录的一个这样的对象。每个查询都可能返回多个data对象。数组中值的顺序与在标头中接收到的字段匹配。

summary

标记语句的结果集的结束。包含查询计划信息(如果请求)。

info

在处理所有语句后出现的最后一个事件(除非发生错误)。包含事务信息(例如提交 URI、书签)。

error

在处理事务期间发生的错误。

换行符分隔模式和 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字符封装。

JSON 序列模式编码示例
\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 类型

请求中的多个结果集

当单个请求中有多个查询时,每个查询将有多个headerdatasummary输出。结果集按请求中指定的顺序返回。

示例请求

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

null

?

布尔值

{"?": "true"}

Z

整数

{"Z": "123"}

R

浮点数

{"R": "9.87"} [1]

U

字符串

{"U": "Neo4j"}

T

时间

{"T": "2023-08-09T09:02:40.063Z"}
{"T": "2023-08-09"}
{"T": "09:02:40.063Z"}
{"T": "P14DT16H12M"}

@

空间

{"@": "SRID=4326;POINT(1.2 3.4)"}
{"@": "SRID=4979;POINT Z (3.4 5.6 7.8)"}

#

十六进制

{"#": "FA08"}

1. 类型标签R用于指示浮点数和 32 位有符号整数范围之外的整数。

复合类型

类型标签 类型 示例

[]

列表

{"[]": [{"Z": "123"}, …​ ]}

{}

映射

{"{}": {"name": {"U": "Jeff"}, …​}}

实体类型

节点
{"()": [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"
  }
}

您还可以将默认返回格式与图形格式结合使用。要实现这一点,请设置"resultDataContents": ["row", "graph"]

由于图形格式与结果主体如何编码无关,因此它可以与 JSON 或 Jolt Accept标头结合使用。