运行非阻塞异步查询
异步托管事务
您可以通过 AsyncSession
运行异步事务。流程类似于 常规事务,除了异步事务函数返回一个 CompletionStage
对象(可以进一步转换为 CompletableFuture
)。
package demo;
import java.util.Map;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import org.neo4j.driver.async.AsyncSession;
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.summary.ResultSummary;
import org.neo4j.driver.SessionConfig;
public class App {
public static void main(String... args) throws ExecutionException, InterruptedException {
final String dbUri = "<URI for Neo4j database>";
final String dbUser = "<Username>";
final String dbPassword = "<Password>";
try (var driver = GraphDatabase.driver(dbUri, AuthTokens.basic(dbUser, dbPassword))) { (1)
driver.verifyConnectivity();
var summary = printAllPeople(driver);
// Block as long as necessary (for demonstration purposes)
System.out.println(summary.get()); (8)
}
}
public static CompletableFuture<ResultSummary> printAllPeople(Driver driver) {
var session = driver.session(AsyncSession.class, SessionConfig.builder().withDatabase("neo4j").build()); (2)
var query = """
UNWIND ['Alice', 'Bob', 'Sofia', 'Charles'] AS name
MERGE (p:Person {name: name}) RETURN p.name
""";
var summary = session.executeWriteAsync(tx -> tx.runAsync(query) (3)
.thenCompose(resCursor -> resCursor.forEachAsync(record -> { (4)
System.out.println(record.get(0).asString());
})))
.whenComplete((result, error) -> { (5)
session.closeAsync();
})
.toCompletableFuture(); (6)
return summary; (7)
}
}
1 | 驱动程序创建在同步和异步版本中相同。 |
2 | 异步会话是通过将 AsyncSession.class 作为第一个参数提供给 Driver.session() 来创建的,它返回一个 AsyncSession 对象。请注意,异步会话可能无法作为资源使用 try 语句打开,因为驱动程序无法知道何时可以安全地关闭它们。 |
3 | 至于常规事务,.executeWriteAsync() (和 executeReadAsync() )接受一个事务函数回调。在事务函数内部,使用 .runAsync() 运行查询。每个运行的查询都返回一个 CompletionStage 。 |
4 | 可以选择使用 CompletionStage 上的方法在异步运行程序中处理结果。查询的结果集作为 AsyncResultCursor 提供,它实现了与同步事务处理结果的类似方法集(参见 事务→处理查询结果)。内部对象类型与同步情况相同(即 Record 、ResultSummary )。 |
5 | 可以选择在查询完成后运行操作,例如关闭驱动程序会话。 |
6 | CompletableFuture 是一种方便的类型,可以返回给调用方。 |
7 | 与同步事务相反,.executeWriteAsync() 和 executeReadAsync() 仅返回 结果摘要。**必须在异步运行程序内部完成结果处理和处理。** |
8 | .get() 会等待必要的时间,直到 future 完成,然后返回其结果。 |
方法 .executeReadAsync() 和 .executeWriteAsync() 已替换 .readTransactionAsync() 和 .writeTransactionAsync() ,后者在 5.x 版本中已弃用,并将在 6.0 版本中删除。 |
词汇表
- LTS
-
长期支持版本是保证支持若干年的版本。Neo4j 4.4 是 LTS,Neo4j 5 也将有一个 LTS 版本。
- Aura
-
Aura 是 Neo4j 的完全托管云服务。它提供免费和付费计划。
- Cypher
-
Cypher 是 Neo4j 的图查询语言,允许您从数据库中检索数据。它类似于 SQL,但适用于图。
- APOC
-
Cypher 上的强大过程 (APOC) 是一个(许多)函数库,这些函数本身不容易用 Cypher 表示。
- Bolt
-
Bolt 是用于 Neo4j 实例和驱动程序之间交互的协议。它默认监听端口 7687。
- ACID
-
原子性、一致性、隔离性、持久性 (ACID) 是保证数据库事务可靠处理的属性。符合 ACID 的 DBMS 确保数据库中的数据即使在发生故障时也能保持准确和一致。
- 最终一致性
-
如果数据库保证所有集群成员将在某个时间点存储数据的最新版本,则该数据库最终一致。
- 因果一致性
-
如果读取和写入查询按相同的顺序由集群的每个成员看到,则数据库具有因果一致性。这比最终一致性更强。
- NULL
-
空标记不是类型,而是值不存在的占位符。有关更多信息,请参见 Cypher→使用
null
。 - 事务
-
事务是工作的单元,要么完全提交,要么在失败时回滚。例如银行转账:它涉及多个步骤,但它们必须全部成功或被撤消,以避免从一个账户中扣除资金但未添加到另一个账户中。
- 背压
-
背压是反对数据流动的力量。它确保客户端不会被数据淹没,速度快于其处理能力。
- 事务函数
-
事务函数是
executeRead
或executeWrite
调用执行的回调。如果服务器发生故障,驱动程序会自动重新执行回调。 - 驱动程序
-
Driver
对象包含建立与 Neo4j 数据库连接所需的详细信息。