Cypher 和 Neo4j
本节讨论使用 Cypher® 时需要考虑的 Neo4j 方面。
Cypher 与 Neo4j 的不同版本
Neo4j 包含两个版本:商业企业版 (Enterprise Edition) 和社区版 (Community Edition)。
Cypher 在这两个版本之间几乎相同,但在关键领域存在差异
功能 | 企业版 | 社区版 |
---|---|---|
任意数量的用户数据库。 |
仅支持 |
|
基于角色的安全性 |
多用户管理。所有用户拥有完全访问权限。 |
|
约束 |
仅支持节点和关系属性唯一性约束。 |
Neo4j 关键术语
Cypher 查询在 Neo4j 数据库上执行,但通常适用于特定的图。理解这些术语的含义以及图何时不是数据库至关重要。
- DBMS
-
Neo4j 数据库管理系统能够包含和管理数据库中包含的多个图。客户端应用程序将连接到 DBMS 并打开会话。客户端会话提供对 DBMS 中任何图的访问。
- 图
-
指数据库中的数据模型。通常,每个数据库中只有一个图,许多引用特定图的管理命令都使用数据库名称。在会话中执行的 Cypher 查询可以声明它们适用于哪个图,或使用会话提供的默认图。复合数据库可以通过别名引用其他数据库来包含多个图。提交到复合数据库的查询可以在同一查询中引用多个图。有关更多信息,请参阅操作手册 → 复合数据库。
- 数据库
-
数据库是一种用于在磁盘和内存中的指定空间中收集数据的存储和检索机制。
Neo4j 中的内置数据库
所有 Neo4j 服务器都包含一个名为 system
的内置数据库,其行为与其他所有数据库不同。system
数据库存储系统数据,您无法对其执行图查询。
全新安装的 Neo4j 包含两个数据库
-
system
- 上述系统数据库,包含 DBMS 的元数据和安全配置。 -
neo4j
- 默认数据库,使用配置选项dbms.default_database=neo4j
命名。
查询注意事项
大多数情况下,Cypher 查询是读取或更新查询,它们针对图运行。也存在适用于数据库或整个 DBMS 的管理命令。管理命令不能在连接到普通用户数据库的会话中运行,而需要连接到 system
数据库的会话中运行。管理命令在 system
数据库上执行。如果管理命令提交到用户数据库,它将被重定向到系统数据库。
Cypher 和 Neo4j 事务
所有 Cypher 查询都在事务中运行。更新查询所做的修改由事务保存在内存中,直到事务提交,此时更改才会持久化到磁盘并对其他事务可见。如果发生错误(无论是在查询评估期间,例如除以零,还是在提交期间,例如违反约束),事务都会自动回滚,并且图中的任何更改都不会持久化。
简而言之,更新查询要么完全成功,要么根本不成功。
进行大量更新的查询会因此使用大量内存,因为事务将更改保存在内存中。有关 Neo4j 中的内存配置,请参阅Neo4j 操作手册 → 内存配置。 |
显式事务和隐式事务
Neo4j 中的事务可以是显式的或隐式的。
显式 | 隐式 |
---|---|
由用户打开。 |
自动打开。 |
可以按顺序执行多个 Cypher 查询。 |
可以执行单个 Cypher 查询。 |
由用户提交或回滚。 |
事务成功完成时自动提交。 |
本身启动独立事务的查询(例如使用CALL { ... } IN TRANSACTIONS
的查询)只允许在隐式模式下使用。显式事务不能直接通过查询管理,它们必须通过 API 或工具进行管理。
有关 API 或用于启动和提交事务的命令示例,请参阅 API 或工具特定的文档
-
有关使用 Neo4j 驱动程序进行事务的信息,请参阅Neo4j 驱动程序手册中的会话 API。
-
有关通过 HTTP API 使用事务的信息,请参阅HTTP API 文档 → 运行事务。
-
有关在嵌入式核心 API 中使用事务的信息,请参阅Java 参考 → Cypher 查询。
-
有关在 Neo4j Browser 或 Cypher-shell 中使用事务的信息,请参阅Neo4j Browser 文档或Cypher-shell 文档。
在编写过程或使用嵌入式 Neo4j 时,请记住,执行结果返回的所有迭代器都应完全耗尽或关闭。这可确保绑定到它们的资源得到正确释放。
DBMS 事务
连接到 DBMS 时启动事务将启动 DBMS 级别事务。DBMS 级别事务是数据库事务的容器。
当对特定数据库发出第一个查询时,数据库事务将启动。在 DBMS 级别事务内部打开的数据库事务在 DBMS 级别事务提交或回滚时提交或回滚。
DBMS 事务有以下限制
-
一个 DBMS 事务中只能写入一个数据库。
-
在同一事务中执行的查询必须是相同的语句类型,或者是模式修改和读取查询的组合。存在以下语句类型:
在系统数据库上调用过程不被视为管理命令。查询将根据过程的定义模式被归类为读取查询或写入查询。有关更多信息,请参阅操作手册 → 过程。 |