Cypher 和 Neo4j

本节讨论使用 Cypher® 时需要考虑的 Neo4j 的一些重要方面。

Cypher 和 Neo4j 的不同版本

Neo4j 包含两个版本:商业版企业版和社区版。

Cypher 在这两个版本之间的工作方式几乎相同,但它们之间存在一些关键差异

功能 企业版 社区版

多数据库

任意数量的用户数据库。

system 和一个用户数据库。

基于角色的安全性

用户、角色和权限管理,用于灵活的 访问控制子图访问控制

多用户管理。所有用户都具有完全访问权限。

约束

关键 Neo4j 术语

Cypher 查询针对 Neo4j 数据库执行,但通常应用于特定图。了解这些术语的含义以及图何时不是数据库非常重要。

DBMS

Neo4j 数据库管理系统能够包含和管理数据库中包含的多个图。客户端应用程序将连接到 DBMS 并对其打开会话。客户端会话提供对 DBMS 中任何图的访问。

指的是数据库中的数据模型。通常每个数据库中只有一个图,许多引用特定图的管理命令都使用数据库名称来执行此操作。在会话中执行的 Cypher 查询可以声明它们应用于哪个图,或者使用会话提供的默认图。复合数据库可以通过对其他数据库的别名包含多个图。提交到复合数据库的查询可以在同一查询中引用多个图。有关更多信息,请参阅 操作手册 → 复合数据库

数据库

数据库是用于在磁盘和内存上的定义空间中收集数据的存储和检索机制。

Neo4j 中的内置数据库

所有 Neo4j 服务器都包含一个名为 system 的内置数据库,其行为与所有其他数据库不同。system 数据库存储系统数据,您不能对其执行图查询。

Neo4j 的新安装包括两个数据库

  • system - 上述系统数据库,包含有关 DBMS 和安全配置的元数据。

  • neo4j - 默认数据库,使用配置选项 dbms.default_database=neo4j 命名。

有关 system 数据库的更多信息,请参阅有关 数据库管理访问控制 的部分。

查询注意事项

大多数情况下,Cypher 查询是读取或更新查询,它们针对图运行。还有一些 管理命令 应用于数据库或整个 DBMS。管理命令不能在连接到普通用户数据库的会话中运行,而需要在连接到 system 数据库的会话中运行。管理命令在 system 数据库上执行。如果将管理命令提交到用户数据库,则会将其重新路由到系统数据库。

Cypher 和 Neo4j 事务

所有 Cypher 查询都在事务中运行。更新查询所做的修改由事务在内存中保存,直到它提交,此时更改将持久保存到磁盘并对其他事务可见。如果发生错误 - 无论是在查询评估期间(例如除以零),还是在提交期间(例如约束冲突) - 事务将自动回滚,并且不会在图中持久保存任何更改。

简而言之,更新查询总是完全成功或完全不成功。

如果查询导致大量更新操作,则会消耗大量内存,因为事务会将更改保存在内存中。有关 Neo4j 中内存配置的信息,请参阅Neo4j 操作手册 → 内存配置

显式和隐式事务

Neo4j 中的事务可以是显式的或隐式的。

显式 隐式

由用户打开。

自动打开。

可以按顺序执行多个 Cypher 查询。

可以执行单个 Cypher 查询。

由用户提交或回滚。

事务成功完成时自动提交。

自身启动单独事务的查询(例如,使用CALL { ... } IN TRANSACTIONS的查询)仅在隐式模式下允许。显式事务不能直接从查询中管理,必须通过 API 或工具进行管理。

有关 API 或用于启动和提交事务的命令的示例,请参阅特定于 API 或工具的文档。

在编写过程或使用 Neo4j 嵌入式时,请记住,从执行结果返回的所有迭代器都应完全耗尽或关闭。这可确保正确释放绑定到它们的资源。

DBMS 事务

连接到 DBMS 时开始事务将启动一个 DBMS 级别的事务。DBMS 级别的事务是数据库事务的容器。

当向特定数据库发出第一个查询时,将启动数据库事务。在 DBMS 级别的事务内打开的数据库事务在 DBMS 级别的事务提交或回滚时提交或回滚。

DBMS 事务具有以下限制

  • 在 DBMS 事务中只能写入一个数据库。

  • Cypher 操作主要分为以下几类

    • 图操作。

    • 模式命令。

    • 管理命令。

无法在单个 DBMS 事务中组合任何这些工作负载。

ACID 兼容性

Neo4j 完全符合 ACID。这意味着

  • 原子性 - 如果事务的一部分失败,则数据库状态保持不变。

  • 一致性 - 每个事务都使数据库处于一致状态。

  • 隔离性 - 在事务期间,其他操作无法访问已修改的数据。

  • 持久性 - DBMS 始终可以恢复已提交事务的结果。