查询路由决策

查询路由是决定应使用哪个 Cypher 执行器(数据库)以及在哪个物理位置执行查询的过程。每个通过 Bolt 协议从驱动程序到达 Neo4j 服务器的查询,都会经历此处描述的过程。

路由决策树

在执行查询之前,会在查询路由阶段做出以下决策

第 1 步:确定目标数据库名称

选择以下列表中第一个有值的项

第 2 步:重用打开的事务
  • 如果已存在指向目标数据库(本地或远程)的打开事务,则继续执行第 6 步。

  • 如果不存在,则继续执行第 3 步。

第 3 步:确定目标数据库的类型(执行上下文类型)
  • 如果目标数据库是当前 DBMS 中的数据库,则上下文类型为内部 (Internal)

  • 如果目标数据库是组合数据库 (Composite database),则上下文类型为组合 (Composite)

    这也允许查询针对多个数据库。

  • 如果目标数据库是远程别名 (Remote Alias),则上下文类型为外部 (External)

第 4 步:确定执行位置
  • 如果上下文类型为内部 (Internal)

    • 且 URI 方案为 bolt://(路由已禁用),则位置为本地 (Local)

    • 且事务模式为 READ

      • 且数据库托管在此服务器上,则位置为本地 (Local)

      • 且数据库托管在另一台服务器上

    • 如果事务模式为 WRITE

  • 如果上下文类型为组合 (Composite),则位置为本地 (Local)(对于查询的此部分)。

  • 如果上下文类型为外部 (External),则位置为远程 (Remote)(使用配置中提供的URI 和数据库)。

第 5 步:打开事务
  • 如果位置为本地 (Local),则打开指向此服务器上数据库的事务。

  • 如果位置为远程 (Remote),则使用第 4 步中确定的 URI 打开指向数据库的驱动程序事务。

第 6 步:执行查询
  • 在打开的事务中执行查询。

图解路由决策树

routing decisions
图 1. 图解路由决策树