Cypher 和 Neo4j
本节讨论使用 Cypher® 时需要考虑的 Neo4j 的一些重要方面。
Cypher 和 Neo4j 的不同版本
Neo4j 包含两个版本:商业版企业版和社区版。
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 文档 → 使用 HTTP API。
-
有关在嵌入式核心 API 中使用事务的信息,请参阅Java 参考 → 从 Java 执行 Cypher 查询。
-
有关在 Neo4j 浏览器或 Cypher-shell 中使用事务的信息,请参阅Neo4j 浏览器文档或Cypher-shell 文档。
在编写过程或使用 Neo4j 嵌入式时,请记住,从执行结果返回的所有迭代器都应完全耗尽或关闭。这可确保正确释放绑定到它们的资源。