4.x 版本驱动程序变更

本节介绍了 Neo4j 1.7 驱动程序与 Neo4j 4.x 驱动程序之间的区别。

高级变更

从 4.0 版本开始,驱动程序旨在为所有语言提供用户友好且统一的 API。

在 Neo4j 的先前版本中,客户端与服务器之间的通信使用加密的本地连接,并默认生成自签名证书。然而,从 4.0 版本开始,默认设置为非加密。有关更多信息,请参阅 驱动程序手册 → 连接 URI

Neo4j 4.0 引入了兼容 Reactive Streams 标准的响应式 API。这使得能够精细控制 Cypher® 查询结果的数据流,包括在中途暂停或取消的能力。有关更多信息,请参阅 驱动程序手册 → 查询与结果

当使用 4.x 驱动程序连接到 4.x 数据库时,可以操作多个数据库。从驱动程序 API 的角度来看,这意味着必须选择一个数据库作为会话内事务的执行上下文。这可以在构建会话时进行配置。如果没有选择数据库,驱动程序将连接到服务器的默认数据库。

1.7 版本驱动程序在 Neo4j 4.x 中以回退模式工作。它们不支持 Neo4j 4.0 及更高版本引入的功能,例如多数据库Neo4j Fabric细粒度访问控制。若要同时在线运行多个数据库并对它们进行分布式查询,必须从 1.7 迁移到 4.x。

本章中的示例主要使用 Java 编写,使用的是 Java 驱动程序。不过,类似的代码可以转换为其他语言。

新功能

  • 从 Neo4j 4.0 开始,数据库、驱动程序和协议的版本控制方案已统一。对于支持的驱动程序,这意味着版本号从 1.7 变更为 4.x 的任意版本。

  • 与 4.x 服务器通信的 1.7+ 驱动程序可能需要显式关闭加密。这是由于 Neo4j 3.x 和 4.x 之间的默认设置发生了变化。

  • Bolt 4.0 已在 4.x 驱动程序和 4.0 服务器中实现。

  • 响应式 API 现在可用于 4.0 服务器。要使用响应式 API,起始点是驱动程序对象上的 RxSession

  • 使用 4.0 服务器时,现在应该针对特定数据库获取会话实例。每个数据库仍然遵守因果链(事务不能跨越多个数据库)。驱动程序本身连接到 Neo4j DBMS。

  • 新增了一种功能检测方法 driver.supportsMultiDb(),用于查询远程数据库是否支持多数据库。

  • 引入了一种新的 driver.verifyConnectivity() 方法,用于连接验证。默认情况下,驱动程序实例在构建后不会验证 DBMS 的可用性。

  • 新的连接 URI 方案,包含额外加密和信任信息的变体 - neo4j+sbolt+sneo4j+sscbolt+ssc+s 变体启用带有完整证书检查的加密,而 +ssc 变体启用无证书检查的加密。后一种变体专门设计用于自签名证书。有关更多信息,请参阅 附加 URI 方案

示例 1. 检测多数据库支持
import org.neo4j.driver.Driver;
import org.neo4j.driver.Result;
import org.neo4j.driver.Session;
import org.neo4j.driver.SessionConfig;
import org.neo4j.driver.Values;

...
private final Driver driver;
...

public void printGreeting( final String message )
{
   SessionConfig sessionConfig = driver.supportsMultiDb() ? SessionConfig.forDatabase( "neo4j" )
                                                          : SessionConfig.defaultConfig();

   try ( Session session = driver.session( sessionConfig ) )
   {
       String greeting = session.writeTransaction( tx -> {
           Result result = tx.run( "CREATE (a:Greeting) SET a.message = $message RETURN a.message + ', from node ' + id(a)",
                                   Values.parameters( "message", message ) );
           return result.single().get( 0 ).asString();
       } );
       System.out.println( greeting );
   }
}
© . This site is unofficial and not affiliated with Neo4j, Inc.