高级连接信息

连接 URI

驱动程序支持以下形式的 URI 连接:

<SCHEME>://<HOST>[:<PORT>[?policy=<POLICY-NAME>]]
  • <SCHEME>neo4jneo4j+sneo4j+sscboltbolt+sbolt+ssc 之一。

  • <HOST> 是 Neo4j 服务器所在的主机名。

  • <PORT> 是可选的,表示 Bolt 协议可用的端口。

  • <POLICY-NAME> 是一个可选的服务器策略名称。服务器策略在使用前需要设置。

驱动程序不支持连接到嵌套路径,例如 example.com/neo4j/。服务器必须可以从域根访问。

连接协议和安全性

驱动程序和服务器之间的通信通过 Bolt 协议进行。服务器 URI 的方案决定了连接是否加密,如果加密,则决定接受哪种类型的证书。

URL 方案 加密 注释

neo4j

本地设置的默认值

neo4j+s

(仅限 CA 签名证书)

Aura 的默认值

neo4j+ssc

(CA 签名和自签名证书)

无论实例是适当的集群环境还是单机环境,驱动程序在成功连接后都会从服务器接收一个路由表。驱动程序的路由行为与Neo4j 的集群协同工作,将读/写事务定向到适当的集群成员。如果您想针对特定机器,请改用 boltbolt+sbolt+ssc URI 方案。

要使用的连接方案不是您的选择,而是由服务器要求决定的。您必须事先知道正确的服务器方案,因为在连接之前不会暴露任何元数据。如果您不确定,请咨询数据库管理员。

认证方法

基本认证

基本认证方案依赖于传统的用户名和密码。这些可以是您的本地安装凭据,也可以是 Aura 实例提供的凭据。

const driver = neo4j.driver(URI, neo4j.auth.basic(USER, PASSWORD))

基本认证方案也可以用于针对 LDAP 服务器进行认证(仅限企业版)。

Kerberos 认证

Kerberos 认证方案需要一个 base64 编码的票据。只有在服务器已安装 Kerberos 附加组件时才能使用。

const driver = neo4j.driver(URI, neo4j.auth.kerberos(ticket))

Bearer 认证

Bearer 认证方案需要一个由身份提供者通过 Neo4j 的单点登录功能提供的 base64 编码令牌。

const driver = neo4j.driver(URI, neo4j.auth.bearer(token))
Bearer 认证方案要求在服务器上配置单点登录。配置完成后,客户端可以通过发现 API 发现 Neo4j 的配置。

自定义认证

如果服务器配备了自定义认证方案,请使用 neo4j.auth.custom

const driver = neo4j.driver(
  URI,
  neo4j.auth.custom(principal, credentials, realm, scheme, parameters)
)

无认证

如果服务器上禁用了认证,则可以完全省略认证参数。

轮换认证令牌

可以轮换预期会过期的认证令牌(例如 SSO)。在实例化 Driver 时,您需要提供一个 AuthTokenManager 实例,而不是一个静态认证令牌。

最简单的入门方法是使用内置的 AuthTokenManager 实现之一

轮换每 60 秒过期的 bearer 令牌
import neo4j, { AuthToken } from 'neo4j-driver'

/**
 * Method called whenever the driver needs to refresh the token.
 *
 * The refresh will happen if the driver is notified by the server
 * of token expiration, or if `Date.now() > tokenData.expiry`.
 *
 * The driver will block creation of all connections until
 * this function resolves the new auth token.
 */
async function generateAuthToken () {
   const bearer = await getSSOToken()  // some way to get a token
   const token = neo4j.auth.bearer(bearer)

   // assume we know tokens expire every 60 seconds
   const expiresIn = 60
   // Include a little buffer so that new token is fetched before the old one expires
   const expiration = expiresIn - 10

   return {
      token,
      // if expiration is not provided,
      // the driver will only fetch a new token when an auth failure happens
      expiration
   }
}

const driver = neo4j.driver(
    URI,
    neo4j.authTokenManagers.bearer({
        tokenProvider: generateAuthToken
    })
)
此 API 不得用于切换用户。认证管理器必须始终返回相同身份的令牌。您可以在查询级别会话级别切换用户。
AuthManagers(包括传递给 expirationBasedAuthTokenManager() 的提供函数)不得以任何方式与驱动程序交互,因为这可能导致死锁和未定义行为。

相互 TLS (客户端证书作为双因素认证)

相互 TLS (mTLS) 允许您使用客户端证书作为与服务器进行认证的第二因素。证书只能与认证令牌一起使用,并且不能替代常规认证,除非服务器上禁用了认证。

客户端的证书和公钥必须放置在服务器的 <NEO4J_HOME>/certificates/bolt/trusted 目录中。有关服务器设置的更多信息,请参阅配置基于 Bolt 的 SSL

为了使 mTLS 工作,驱动程序与服务器的连接必须加密,即连接 URI 方案必须是 +s+ssc(例如 neo4j+s://example.com:7687)。

使用驱动程序配置选项 clientCertificate 以对象形式提供证书信息。

const driver = neo4j.driver(URI, neo4j.auth.basic(USER, PASSWORD), {
   clientCertificate: {
      certfile: '/path/to/cert.cert',
      keyfile: '/path/to/cert.pem',
      password: 'the_key_password' // optional
   }
})

通过 clientCertificateProviders.rotating 实例化证书对象,并在通过配置选项 clientCertificate 实例化驱动程序时提供它。

const initialClientCertificate: {
  certfile: '/path/to/cert.cert',
  keyfile: '/path/to/cert.pem',
  password: 'the_key_password' // optional
}
const clientCertificateProvider = neo4j.clientCertificateProviders.rotating({
    initialCertificate: initialClientCertificate
})
const driver = neo4j.driver(URI, MY_CREDENTIALS, {
   clientCertificate: clientCertificateProvider
})
// use the driver...
// ... until it's time to update the certificate
clientCertificateProvider.updateCertificate({
  certfile: '/path/to/new_cert.cert',
  keyfile: '/path/to/new_cert.pem',
  password: 'the_new_key_password' // optional
})
// use the driver some more

自定义地址解析器

创建 Driver 对象时,可以指定一个解析器函数来解析驱动程序初始化时使用的连接地址。请注意,驱动程序在路由表中接收到的地址不会使用自定义解析器进行解析。

连接 example.com 的端口 9999 被解析为 localhost 的端口 7687
let URI = 'neo4j://example.com:9999'
let addresses = [
  'localhost:7687'
]
let driver = neo4j.driver(URI, neo4j.auth.basic(USER, PASSWORD), {
  resolver: address => addresses
})

其他连接参数

您可以在API 文档中找到所有 Driver 配置参数。

术语表

LTS

长期支持版本是保证在数年内获得支持的版本。Neo4j 4.4 是 LTS,Neo4j 5 也将有一个 LTS 版本。

Aura

Aura 是 Neo4j 的全托管云服务。它提供免费和付费计划。

Cypher

Cypher 是 Neo4j 的图查询语言,它允许您从数据库中检索数据。它类似于 SQL,但专用于图。

APOC

Cypher 上的出色过程 (APOC) 是一个包含(许多)无法在 Cypher 本身中轻松表达的函数的库。

Bolt

Bolt 是 Neo4j 实例和驱动程序之间交互所使用的协议。它默认监听端口 7687。

ACID

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)(ACID) 是保证数据库事务可靠处理的特性。符合 ACID 的 DBMS 确保数据库中的数据在发生故障时仍能保持准确和一致。

最终一致性

如果一个数据库保证所有集群成员都将在某个时间点存储最新版本的数据,那么它就是最终一致的。

因果一致性

如果集群的每个成员都以相同的顺序看到读写查询,那么数据库就是因果一致的。这比最终一致性更强。

NULL

空标记不是一种类型,而是值缺失的占位符。有关更多信息,请参阅Cypher → 使用 null

事务

事务是一个工作单元,它要么整体提交,要么在失败时回滚。一个例子是银行转账:它涉及多个步骤,但它们必须全部成功或回退,以避免资金从一个账户中扣除但未添加到另一个账户的情况发生。

背压

背压是阻碍数据流动的力。它确保客户端不会被超出其处理能力的数据量所淹没。

事务函数

事务函数是 executeReadexecuteWrite 调用执行的回调。在服务器故障的情况下,驱动程序会自动重新执行该回调。

驱动程序

一个 Driver 对象包含与 Neo4j 数据库建立连接所需的详细信息。

© . All rights reserved.