结果格式

查询 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"
    }
  }
]
路径中关系的方向仅在起始和结束节点元素 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/json
{
  "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 类型 在查询 API 中的标记方式。

Cypher 类型 查询 API 类型 示例

NULL

null

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

BOOLEAN

布尔值

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

INTEGER

整数

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

FLOAT

浮点数

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

STRING

字符串

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

ByteArray

Base64

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

LIST

列表

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

MAP

映射

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

DATE

日期

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

ZONED TIME

时间

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

LOCAL TIME

LocalTime

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

ZONED DATETIME

ZonedDateTime

{
  "$type": "ZonedDateTime",
  "_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

{
  "$type": "Point",
  "_value": {
    "coordinates": [
      2.3,
      4.5,
      2.0
    ],
    "crs": {
      "srid": 9157,
      "name": "cartesian-3d",
      "type": "link",
      "properties": {
        "href": "http://spatialreference.org/ref/sr-org/9157/ogcwkt/",
        "type": "ogcwkt"
      }
    }
  }
}

NODE

节点

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

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

路径

{
  "$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"
          }
        }
      }
    }
  ]
}
路径中关系的方向仅在起始和结束节点元素 ID 中编码。返回的节点和关系的顺序不代表关系的方向。