Neo4j 驱动程序 API

Neo4j 驱动程序导出统一的 API。这允许在各个生态系统中共享驱动程序概念和命名,从而使语言之间以及多语言支持的转换更加容易和一致。

驱动程序对象

  • 驱动程序

  • 会话

  • 事务

  • 驱动程序配置

    • uri::字符串

    • auth::字典

    • user_agent::字符串

    • encrypted::布尔值

    • trust::字符串

  • 会话配置

    • default_access_mode::字符串

    • database::字符串

    • fetch_size::整数

    • bookmarks::字符串列表

    • imp_user::字符串

  • 事务配置

    • metadata::字典

    • timeout::整数

  • 身份验证令牌

  • 事务管理器

  • 连接池

  • 路由

  • Bolt 协议

  • PackStream

  • Neo4j 异常

  • 驱动程序异常

URI 方案

未启用 TLS

  • bolt:连接到单个 Neo4j 实例。

  • neo4j:连接到 Neo4j 实例并使用路由表信息进行进一步连接。

启用 TLS 并允许自签名证书颁发机构

  • bolt+ssc

  • neo4j+ssc

启用 TLS 并仅允许系统启用的证书颁发机构并验证主机名

  • bolt+s

  • neo4j+s

客户端路由

Neo4j 支持集群设置并使用Raft 共识算法

集群中的每个 Neo4j *主* 服务器都支持 routingreading。只能选择一个集群主服务器作为*领导者*,负责 write 操作。此选择可能会随着时间推移而轮换。驱动程序应支持路由表。*辅助* 服务器不参与 Raft 共识算法,但辅助服务器确实返回一个仅包含辅助服务器本身的路由表。

有关更多信息,请参阅操作手册 → 集群

获取路由表

获取路由表的过程调用在 Neo4j 的各个版本中发生了很大变化。

表 1. 路由消息 (4.3+)
Neo4j Bolt Bolt 消息

4.3

4.3

ROUTE {$context} [$bookmarks] $db

4.4

4.4

ROUTE {$context} [$bookmarks] {"db": $db, "imp_user": $imp_user}

表 2. 如何为数据库 foo 获取路由表
Neo4j Bolt Bolt 消息

4.3

4.3

ROUTE {"address": "example.org:7687"} ["neo4j-bookmark-transaction:1", "neo4j-bookmark-transaction:2"] "foo"

4.4

4.4

ROUTE {"address": "example.org:7687"} ["neo4j-bookmark-transaction:1", "neo4j-bookmark-transaction:2"] {"db": "foo"}

示例
C: 60 60 B0 17
C: 00 00 04 04 00 00 00 00 00 00 00 00 00 00 00 00
S: 00 00 04 04
C: HELLO {"scheme": "basic", "principal": "user", "credentials": "password", "user_agent": "Example/4.4.0", "routing": {"address": "localhost:9001", "policy": "example_policy", "region": "example_region"}}
S: SUCCESS {"server": "Neo4j/4.4.0", "connection_id": "bolt-123456789"}
C: ROUTE {"address": "localhost:9001", "policy": "example_policy", "region": "example_region"} ["neo4j-bookmark-transaction:1", "neo4j-bookmark-transaction:2"], {}
S: SUCCESS {"rt": {"ttl": 300, "db": "foo", "servers": [{"addresses": ["127.0.0.1:9001"], "role": "WRITE"}, {"addresses": ["127.0.0.1:9002"], "role": "READ"}, {"addresses": ["127.0.0.1:9001", "127.0.0.1:9002"], "role": "ROUTE"}]}}
C: GOODBYE

过程调用 <4.2

Neo4j Bolt Neo4j 过程调用

3.5

3

dbms.cluster.routing.getRoutingTable($context)

4.0

4.0

dbms.routing.getRoutingTable($context, $database)

4.1

4.1

dbms.routing.getRoutingTable($context, $database)

4.2

4.2

dbms.routing.getRoutingTable($context, $database)

表 3. 如何为数据库 foo 获取路由表
Neo4j Bolt Bolt 消息

3.5

3

RUN "CALL dbms.cluster.routing.getRoutingTable($context)" {"context": {}} {"mode": "r"}

4.0

4.0

RUN "CALL dbms.routing.getRoutingTable($context, $database)" {"context": {}, "database": "foo"} {"db": "system", "mode": "r"}

4.1

4.1

RUN "CALL dbms.routing.getRoutingTable($context, $database)" {"context": {}, "database": "foo"} {"db": "system", "mode": "r"}

4.2

4.2

RUN "CALL dbms.routing.getRoutingTable($context, $database)" {"context": {}, "database": "foo"} {"db": "system", "mode": "r"}

示例
C: 60 60 B0 17
C: 00 00 01 04 00 00 00 00 00 00 00 00 00 00 00 00
S: 00 00 01 04
C: HELLO {"scheme": "basic", "principal": "user", "credentials": "password", "user_agent": "Example/4.1.0", "routing": {"address": "localhost:9001", "policy": "example_policy", "region": "example_region"}}
S: SUCCESS {"server": "Neo4j/4.1.0", "connection_id": "bolt-123456789"}
C: RUN "CALL dbms.routing.getRoutingTable($context)" {"context": {"address": "localhost:9001", "policy": "example_policy", "region": "example_region"}} {"mode": "r", "db": "system"}
C: PULL {"n": -1}
S: SUCCESS {"fields": ["ttl", "servers"]}
S: RECORD [300, [{"addresses": ["127.0.0.1:9001"], "role": "WRITE"}, {"addresses": ["127.0.0.1:9002"], "role": "READ"}, {"addresses": ["127.0.0.1:9001", "127.0.0.1:9002"], "role": "ROUTE"}]]
S: SUCCESS {"bookmark": "example-bookmark:1", "type": "r", "t_last": 5, "db": "system"}
C: GOODBYE

集群和多个数据库

系统数据库

  • 系统数据库的名称是固定的,名为 system

  • 对于单个实例或集群,系统数据库无法更改。

  • 每个实例上都存在系统数据库。

集群成员

集群包含*主* 成员和*辅助* 成员。

  • 任何时候只能有一个主服务器是*领导者*(接受 writes)。

  • 集群中的每个数据库都有自己的Raft 组,并且每个数据库都有自己的路由表。换句话说,集群中每个数据库的主/领导者/辅助服务器可能不同。

  • 集群中的任何主成员都可以为该集群中的任何数据库提供路由表。给定指向主成员的种子 URL,可以通过从主成员获取路由表来查找集群中的任何数据库。

此外,在 Neo4j 4.x 中

  • 每个集群成员都托管完全相同的数据库。如果集群成员 A 有数据库 foosystem,则所有其他集群成员也应该并且只能有 foosystem

  • 单个实例和/或集群都有一个默认数据库。

这些不适用于 Neo4j 5.x。

驱动程序路由表

驱动程序应防止路由表无限增长。如果尝试获取路由信息失败,则应从路由表中删除特定数据库的路由表。如果路由表无效,则应从路由表中删除特定数据库的路由表。无效的路由表可能是

  • 路由表已超时,其中该路由表的 TTL(生存时间)键已结束。

  • 路由表指向不再存在的数据库。

这是驱动程序在为名为 foo 的数据库获取路由表时应遵循的工作流程。

  1. 查找数据库 foo 的路由表。

  2. 如果路由表中不存在该数据库,则创建一个空路由表,并将种子 URL 作为初始路由器。

  3. 如果路由表已过期,则使用查询刷新路由表,该查询指向一个集群成员。

  4. 如果发生任何错误,请从路由表映射中删除键 foo

唯一可能的错误是

  • 安全错误

  • 路由错误

  • 服务不可用错误,当驱动程序无法为所有现有路由器获取路由表时发生。

客户端日志记录

  • 日志记录级别

  • 日志记录语法

会话

  • 连接

  • 连接池

事务

  • 原子工作单元

  • 事务管理器

  • 事务函数

因果链接

  • 书签