查询数据库
要在数据库上运行查询,请向以下端点提交 POST
请求
http://<host>:<port>/db/<databaseName>/tx/commit
-
<host>
是 Neo4j 实例所在的位置(例如localhost
、xxx.databases.neo4j.io
), -
<port>
是 Neo4j HTTP 服务器设置为监听的端口(默认值为7474
), -
<databaseName>
是您要查询的数据库(例如neo4j
)。
服务器会为您将提交的 Cypher 查询包装在(隐式)事务中。这意味着,如果查询的任何部分失败,数据库将恢复到执行查询的任何部分之前的状态。要控制事务的生命周期,请参阅 运行事务。
每个请求都必须包含 |
请求示例
POST http://localhost:7474/db/neo4j/tx/commit
Accept: application/json;charset=UTF-8
Content-Type: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{
"statements": [
{
"statement": "MERGE (n:Person {name: $name, age: $age}) RETURN n",
"parameters": {
"name": "Alice",
"age": 42
}
}
]
}
响应示例
200: OK
Content-Type: application/json;charset=utf-8
{
"results": [ {
"columns": ["n"],
"data": [ {
"row": [ {
"name": "Alice",
"age": 42
} ],
"meta": [ {
"id": 36,
"elementId": "4:0ea4a108-32c5-498c-99e7-95cc67ab5f7d:36",
"type": "node",
"deleted": false
} ]
} ]
} ],
"errors": [],
"lastBookmarks": [
"FB:kcwQDqShCDLFSYyZ55XMZ6tffRuQ"
]
}
在通过 API 提交的 Cypher 语句中不允许使用文字换行符(根据 JSON 规范)。这意味着查询应放在一行上。您可以用空格替换换行符,因为 Cypher 会以相同的方式解析它们。 |
查询参数
不要将参数硬编码或直接连接到查询中。相反,始终使用占位符并指定 Cypher 参数。这是为了
-
性能优势:Neo4j 会编译和缓存查询,但只有在查询结构不变的情况下才能这样做;
-
安全原因:请参阅 防止 Cypher 注入。
{
"statements": [
{
"statement": "MERGE (n:Person {name: $name, age: $age}) RETURN n",
"parameters": {
"name": "Alice",
"age": 42
}
}
]
}
{
"statements": [
{
"statement": "MERGE (n:Person {name: 'Alice', age: 42}) RETURN n",
}
]
}
有关更多信息,请参阅 Cypher 手册 → 参数。
执行多个查询
您可以在同一个请求中发送多个 Cypher 语句。服务器按顺序运行它们,但彼此分开,因此一个语句不能引用另一个语句中定义的变量。响应包含每个语句的结果,按顺序排列。
请求示例
POST http://localhost:7474/db/neo4j/tx/commit
Accept: application/json;charset=UTF-8
Content-Type: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{
"statements": [
{ "statement": "RETURN 1" },
{ "statement": "RETURN 2" }
]
}
响应示例
200: OK
Content-Type: application/json;charset=utf-8
{
"results": [
{
"columns": ["1"],
"data": [{ "row": [1], "meta": [null] }]
},
{
"columns": ["2"],
"data": [{ "row": [2], "meta": [null] }]
}
],
"errors": [],
"lastBookmarks": [
"FB:kcwQDqShCDLFSYyZ55XMZ6tffRuQ"
]
}
如果其中一个查询失败,则通过请求提交的所有语句都将回滚。在下面的示例中,第二个语句由于除以 0 而失败。结果是不仅没有创建 :Number
节点(甚至没有 val: 1
的节点),而且也没有创建 :Person
节点。
请求示例
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",
"parameters": {
"name": "Bob"
}
},
{
"statement": "UNWIND [1, 0] AS i MERGE (n:Number {val: 1/i}) RETURN n"
},
]
}
响应示例
200: OK
Content-Type: application/json;charset=utf-8
{
"results": [ {
"columns": [ "p" ],
"data": [ {
"row": [ {
"name": "Bob"
} ],
"meta": [ {
"id": 8,
"elementId": "4:0ea4a108-32c5-498c-99e7-95cc67ab5f7d:8",
"type": "node",
"deleted": false
} ]
] }
] },
{
"columns": [ "n" ],
"data": [ {
"row": [ {
"val": 1
} ],
"meta": [ {
"id": 1,
"elementId": "4:0ea4a108-32c5-498c-99e7-95cc67ab5f7d:1",
"type": "node",
"deleted": false
} ]
} ]
} ],
"errors": [ {
"code": "Neo.ClientError.Statement.ArithmeticError",
"message": "/ by zero"
} ]
}
包含 CALL {} IN TRANSACTIONS
的查询
在使用 Cypher 子句 CALL {} IN TRANSACTIONS
的查询时要格外小心。因为这些查询会自行生成更多事务,所以由于它们与周围事务的交互,可能会出现意外行为。
回滚行为
虽然任何语句中的失败都会导致请求中的所有语句回滚,但这不适用于使用 CALL {} IN TRANSACTIONS
的语句。由于该子句创建的事务会独立提交,因此如果其他部分失败,服务器无法回滚它们。
在下面的示例中,即使第二个语句由于除以零而执行失败,第一个语句也不会恢复。结果是创建了两个新的 :Person
节点。
POST http://localhost:7474/db/neo4j/tx/commit
Accept: application/json;charset=UTF-8
Content-Type: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{
"statements": [
{
"statement": "UNWIND ['Sofia', 'Greg'] AS name CALL { WITH name CREATE (:Person {name: name}) } IN TRANSACTIONS OF 1 ROWS RETURN name"
},
{
"statement": "UNWIND [1, 0] AS i MERGE (n:Number {val: 1/i}) RETURN n"
},
]
}
查询顺序
包含 CALL {} In TRANSACTIONS
的查询必须在 statements
JSON 列表的顺序中排在首位。否则将导致错误。
请求示例
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.name",
"parameters": {
"name": "Bob"
}
},
{
"statement": "UNWIND [1, 0] AS i CALL { WITH i MERGE (:Number {val: 1/i}) } IN TRANSACTIONS OF 1 ROWS RETURN i"
},
]
}
响应示例
200: OK
Content-Type: application/json;charset=utf-8
{
"results": [ {
"columns": [ "p.name" ],
"data": [ {
"row": [ "Bob" ],
"meta": [ null ]
}]
},
{
"columns": [ "i" ],
"data": []
} ],
"errors": [ {
"code": "Neo.DatabaseError.Statement.ExecutionFailed",
"message": "Expected transaction state to be empty when calling transactional subquery. (Transactions committed: 0)"
} ]
}
服务器通知
如果服务器生成任何 通知,它们将返回在响应对象的 notifications
密钥中(作为列表)。通知包括性能改进建议、有关使用弃用功能的警告以及有关 Neo4j 次优使用的其他提示。
请求示例
POST http://localhost:7474/db/neo4j/tx/commit
Accept: application/json;charset=UTF-8
Content-Type: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{
"statements": [
{
"statement": "MATCH p=shortestPath((:Person {name: $from})-[*]->(:Person {name: $to})) RETURN p",
"parameters": {
"from": "Alice",
"to": "Bob"
}
}
]
}
响应示例
200: OK
Content-Type: application/json;charset=utf-8
{
"results": [
...
],
"notifications": [
{
"code": "Neo.ClientNotification.Statement.UnboundedVariableLengthPattern",
"severity": "INFORMATION",
"title": "The provided pattern is unbounded, consider adding an upper limit to the number of node hops.",
"description": "Using shortest path with an unbounded pattern will likely result in long execution times. It is recommended to use an upper limit to the number of node hops in your pattern.",
"position": {
"offset": 21,
"line": 1,
"column": 22
}
}
],
...
}
词汇表
- Aura
-
Aura 是 Neo4j 的完全托管云服务。它提供免费和付费计划。
- Cypher
-
Cypher 是 Neo4j 的图查询语言,允许您从数据库中检索数据。它类似于 SQL,但适用于图。
- ACID
-
原子性、一致性、隔离性、持久性 (ACID) 是保证数据库事务可靠处理的属性。符合 ACID 的 DBMS 可确保数据库中的数据即使在发生故障时也能保持准确和一致。
- 因果一致性
-
如果读取和写入查询以相同的顺序被集群中的每个成员看到,则数据库具有因果一致性。这比最终一致性更强。
- 事务
-
事务是工作的单元,要么完整提交,要么在失败时回滚。例如银行转账:它涉及多个步骤,但它们必须全部成功或恢复,以避免从一个账户中扣除资金但未添加到另一个账户中。