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