结果格式&数据类型

查询 API 可以以两种格式返回查询数据:纯 JSON 格式,或带有类型信息的 Neo4j 扩展 JSON 格式。

纯 JSON

JSON 格式是默认格式。它返回纯 JSON,查询结果嵌入在 data 对象中。要请求此格式,请在请求头中设置 Accept: application/json(或者完全省略,因为在未提供 Accept 头时它就是默认值)。

JSON 输出格式原型
{
  "data": {
    "fields": [   field1, field2, ... ],  (1)
    "values": [ [ entity1, entity2, ... ] ]  (2)
  }
}
1 查询字段,即返回对象的键
2 查询结果。外部数组表示单个结果(或行),其中内部数组包含该结果的各个值(每个元素的内部结构取决于对象类型)。
示例 1. 返回一个节点和一个属性

请求示例

POST http://localhost:7474/db/neo4j/query/v2
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
Content-Type: application/json
{
  "statement": "MERGE (p:Person {name: $name}) RETURN p AS person, p.name AS name",
  "parameters": {
    "name": "Phil"
  }
}

响应示例

202: Accepted
Content-Type: application/json
{
  "data": {
    "fields": [
      "person",
      "name"
    ],
    "values": [
      [
        {
          "elementId": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
          "labels": [
            "Person"
          ],
          "properties": {
            "name": "Phil"
          }
        },
        "Phil"
      ]
    ]
  },
  "bookmarks": [
    "FB:kcwQ/wTfJf8rS1WY+GiIKXsCXg6Q"
  ]
}

类型映射

Cypher 类型映射到最接近的 JSON 类型,其中复杂类型(时间、空间、二进制)序列化为字符串。

Cypher 类型 查询 API 类型 示例

NULL

null

null

BOOLEAN

boolean

true

INTEGER

number

123

FLOAT

number

4.56

STRING

string

"Hello World"

ByteArray

string (base64)

"A2+/"

LIST

array

[123, 456]

MAP

object

{
  "fieldA": "A value",
  "fieldB": "Another value"
}

时间类型
(DATE, ZONED TIME, LOCAL TIME, ZONED DATETIME, LOCAL DATETIME, DURATION)

string (ISO-8601)

"2015-03-26"
"12:50:35.556+01:00"
"12:50:35.556"
"2015-11-21T21:40:32.142Z[Antarctica/Troll]"
"2015-07-04T19:32:24"
"P14DT16H12M"

POINT

string (WKT)

"SRID=7203;POINT (1.2 3.4)"

NODE

object

{
  "elementId": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:0",
  "labels": [
    "Person"
  ],
  "properties": {
    "name": "Alice",
    "age": 42
  }
}

RELATIONSHIP

object

{
  "elementId": "5:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
  "startNodeElementId": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:0",
  "endNodeElementId": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
  "type": "LIKES",
  "properties": {
    "since": "forever!"
  }
}

PATH

object

[
  {
    "elementId": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:0",
    "labels": [
      "Person"
    ],
    "properties": {
      "name": "Alice",
      "age": 42
    }
  },
  {
    "elementId": "5:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
    "startNodeElementId": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:0",
    "endNodeElementId": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
    "type": "LIKES",
    "properties": {
      "since": "forever!"
    }
  },
  {
    "elementId": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
    "labels": [
      "Person"
    ],
    "properties": {
      "name": "Phil"
    }
  }
]
路径中关系的S方向仅在起始和结束节点元素ID中编码。返回的节点和关系的顺序不代表关系的实际方向。

带类型信息的 JSON

纯 JSON 不提供有关返回值的类型信息。例如,以下两个请求会产生完全相同的响应,即使在第一个案例中返回值为 Cypher STRING,而在第二个案例中为 ZONED DATETIME

{
  "statement": "RETURN '2024-01-01T21:40:32-01:00'"
}
{
  "statement": "RETURN datetime('2024-01-01T21:40:32-01:00')"
}

如果您关心每个返回值的类型,可以使用 Neo4j 的带类型信息的扩展 JSON 格式。要以这种格式接收结果,请在请求头中设置 Accept: application/vnd.neo4j.query

在这种格式中,每个返回值都是一个对象,其中类型和值信息作为单独的键存储

带类型信息的 JSON 中的 OffsetDateTime
{
  "$type":"OffsetDateTime",
  "_value":"2024-01-01T21:40:32-01:00"
}

如果您希望也以这种格式提交参数,请在请求头中设置 Content-Type: application/vnd.neo4j.query

示例 2. 扩展 JSON 格式的参数和结果数据

请求示例

POST http://localhost:7474/db/neo4j/query/v2
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
Accept: application/vnd.neo4j.query
Content-Type: application/vnd.neo4j.query
{
  "statement": "MERGE (p:Person {name: $name}) RETURN p AS person, p.name AS name",
  "parameters": {
    "name": {
      "$type": "String",
      "_value": "Phil"
    }
  }
}

响应示例

202: Accepted
Content-Type: application/vnd.neo4j.query
{
  "data": {
    "fields": [
      "person",
      "name"
    ],
    "values": [
      [
        {
          "$type": "Node",
          "_value": {
            "_element_id": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
            "_labels": [
              "Person"
            ],
            "_properties": {
              "name": {
                "$type": "String",
                "_value": "Phil"
              }
            }
          }
        },
        {
          "$type": "String",
          "_value": "Phil"
        }
      ]
    ]
  },
  "bookmarks": [
    "FB:kcwQ/wTfJf8rS1WY+GiIKXsCXg6Q"
  ]
}

类型映射

本节详细说明了 Cypher 类型在 Query API 中的标签方式。

Cypher 类型 查询 API 类型 示例

NULL

null

{
  "$type": "Null",
  "_value": null
}

BOOLEAN

Boolean

{
  "$type": "Boolean",
  "_value": true
}

INTEGER

Integer

{
  "$type": "Integer",
  "_value": "123"
}

FLOAT

Float

{
  "$type": "Float",
  "_value": "4.56"
}

STRING

String

{
  "$type": "String",
  "_value": "Hello World"
}

ByteArray

Base64

{
  "$type": "Base64",
  "_value": "A2+/"
}

LIST

List

{
  "$type": "List",
  "_value": [
    {
      "$type": "String",
      "_value": "A"
    },
    {
      "$type": "String",
      "_value": "B"
    }
  ]
}

MAP

Map

{
  "$type": "Map",
  "_value": {
    "fieldA": {
      "$type": "String",
      "_value": "A"
    },
    "fieldB": {
      "$type": "String",
      "_value": "B"
    }
  }
}

DATE

Date

{
  "$type": "Date",
  "_value": "2015-03-26"
}

ZONED TIME

Time

{
  "$type": "Time",
  "_value": "12:50:35.556+01:00"
}

LOCAL TIME

LocalTime

{
  "$type": "LocalTime",
  "_value": "12:50:35.556"
}

ZONED DATETIME

OffsetDateTime

{
  "$type": "OffsetDateTime",
  "_value": "2015-11-21T21:40:32.142Z[Antarctica/Troll]"
}

LOCAL DATETIME

LocalDateTime

{
  "$type": "LocalDateTime",
  "_value": "2015-07-04T19:32:24"
}

DURATION

Duration

{
  "$type": "Duration",
  "_value": "P14DT16H12M"
}

POINT

Point

{
  "$type": "Point",
  "_value": "SRID=7203;POINT (1.2 3.4)"
}

NODE

Node

{
  "$type": "Node",
  "_value": {
    "_element_id": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
    "_labels": [
      "Person"
    ],
    "_properties": {
      "name": {
        "$type": "String",
        "_value": "Phil"
      }
    }
  }
}

RELATIONSHIP

Relationship

{
  "$type": "Relationship",
  "_value": {
    "_element_id": "5:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
    "_start_node_element_id": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:0",
    "_end_node_element_id": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
    "_type": "LIKES",
    "_properties": {
      "since": {
        "$type": "String",
        "_value": "forever!"
      }
    }
  }
}

PATH

Path

{
  "$type": "Path",
  "_value": [
    {
      "$type": "Node",
      "_value": {
        "_element_id": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:0",
        "_labels": [
          "Person"
        ],
        "_properties": {
          "name": {
            "$type": "String",
            "_value": "Alice"
          },
          "age": {
            "$type": "Integer",
            "_value": "42"
          }
        }
      }
    },
    {
      "$type": "Relationship",
      "_value": {
        "_element_id": "5:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
        "_start_node_element_id": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:0",
        "_end_node_element_id": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
        "_type": "LIKES",
        "_properties": {
          "since": {
            "$type": "String",
            "_value": "forever!"
          }
        }
      }
    },
    {
      "$type": "Node",
      "_value": {
        "_element_id": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:2",
        "_labels": [
          "Person"
        ],
        "_properties": {
          "name": {
            "$type": "String",
            "_value": "Phil"
          }
        }
      }
    }
  ]
}
路径中关系的S方向仅在起始和结束节点元素ID中编码。返回的节点和关系的顺序不代表关系的实际方向。
© . All rights reserved.