Cypher 与 Neo4j

本节讨论在使用 Cypher® 时需要考虑的 Neo4j 相关方面。

Cypher 与 Neo4j 的不同版本

Neo4j 包含两个版本:商业企业版(Enterprise Edition)和社区版(Community Edition)。

Cypher 在两个版本中的工作方式几乎完全相同,但在关键领域存在差异

特性 企业版 社区版

多数据库

包含一个 system 数据库和任意数量的用户数据库。

仅包含 system 数据库和一个用户数据库。

基于角色的安全性

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

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

模式

VECTOR 值存储为属性。

如果数据库运行在块格式(block format)上,则 VECTOR 值可以存储为属性。

社区版无法将 VECTOR 值存储为属性。

向量索引

适用于存储为 LIST<INTEGER | FLOAT>VECTOR 值的嵌入(embeddings)。

适用于存储为 LIST<INTEGER | FLOAT> 的嵌入。

运行时(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 命名。

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

查询注意事项

大多数情况下,Cypher 查询是针对图执行的读取或更新查询。还有一些管理命令应用于数据库或整个 DBMS。管理命令不能在连接到普通用户数据库的会话中运行,而必须在连接到 system 数据库的会话中运行。管理命令在 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 事务中,只能写入一个数据库。

  • 在同一事务中执行的查询必须属于相同的语句类型,或者是模式修改与读取查询的组合。存在以下语句类型

    • 管理命令包含管理子句,例如 CREATE DATABASE movies

    • 模式修改,包含索引和约束子句,例如 CREATE CONSTRAINT …​

    • 写入查询,包含写入子句,例如 CREATE (n) RETURN n

    • 读取查询,不包含上述任何子句,例如 MATCH (n) RETURN n

在 system 数据库上调用过程不属于管理命令。根据过程定义的模式,查询将被归类为读取查询或写入查询。有关更多信息,请参阅 操作手册 → 过程。

ACID 合规性

Neo4j 完全符合 ACID 标准。这意味着

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

  • 一致性(Consistency) - 每次事务都使数据库处于一致状态。

  • 隔离性(Isolation) - 在事务期间,修改后的数据不能被其他操作访问。

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