使用 Neo4j 和 Java 构建应用程序
Neo4j Java 驱动是通过 Java 应用程序与 Neo4j 实例交互的官方库。
在 Neo4j 的核心是 Cypher,用于与 Neo4j 数据库交互的查询语言。虽然本指南并不 要求 你是经验丰富的 Cypher 查询者,但如果你已经了解一些 Cypher,专注于 Java 相关部分会更容易。你还将在这些页面中获得对 Cypher 的 温和 入门介绍,但如果这是你的首次尝试,请查看 入门 → Cypher,以获得对图数据库建模和查询更详细的指南。
安装
在 Maven 项目的 pom.xml 中将 Neo4j Java 驱动添加到依赖列表。
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>6.0.4</version>
</dependency>
连接到数据库
通过创建 Driver 对象并提供 URL 与身份验证令牌来连接数据库。获取到 Driver 实例后,使用 .verifyConnectivity() 方法确保能够建立有效的连接。
package demo;
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.GraphDatabase;
public class App {
public static void main(String... args) {
// URI examples: "neo4j://", "neo4j+s://xxx.databases.neo4j.io"
final String dbUri = "<database-uri>";
final String dbUser = "<username>";
final String dbPassword = "<password>";
try (var driver = GraphDatabase.driver(dbUri, AuthTokens.basic(dbUser, dbPassword))) {
driver.verifyConnectivity();
System.out.println("Connection established.");
}
}
}
创建示例图
使用 Driver.executableQuery() 方法运行 Cypher 查询。不要硬编码或拼接参数:请使用占位符,并通过 .withParameters() 方法将参数指定为映射。
Person 节点以及它们之间的 KNOWS 关系// import java.util.Map;
// import java.util.concurrent.TimeUnit;
// import org.neo4j.driver.QueryConfig;
var result = driver.executableQuery("""
CREATE (a:Person {name: $name})
CREATE (b:Person {name: $friendName})
CREATE (a)-[:KNOWS]->(b)
""")
.withParameters(Map.of("name", "Alice", "friendName", "David"))
.withConfig(QueryConfig.builder().withDatabase("<database-name>").build())
.execute();
// Summary information
var summary = result.summary();
System.out.printf("Created %d records in %d ms.%n",
summary.counters().nodesCreated(),
summary.resultAvailableAfter(TimeUnit.MILLISECONDS));
查询图
要从数据库检索信息,请使用 Cypher 子句 MATCH
Person 节点// import java.util.concurrent.TimeUnit;
// import org.neo4j.driver.QueryConfig;
var result = driver.executableQuery("""
MATCH (p:Person)-[:KNOWS]->(:Person)
RETURN p.name AS name
""")
.withConfig(QueryConfig.builder().withDatabase("<database-name>").build())
.execute();
// Loop through results and do something with them
var records = result.records();
records.forEach(r -> {
System.out.println(r); // or r.get("name").asString()
});
// Summary information
var summary = result.summary();
System.out.printf("The query %s returned %d records in %d ms.%n",
summary.query(), records.size(),
summary.resultAvailableAfter(TimeUnit.MILLISECONDS));
关闭连接和会话
除非你使用 try-with-resources 语句创建它们,否则请对所有 Driver 和 Session 实例调用 .close() 方法,以释放它们仍然持有的资源。
session.close();
driver.close();
术语表
- LTS (长期支持版)
-
长期支持 (Long Term Support) 版本是保证在若干年内得到支持的版本。Neo4j 4.4 和 5.26 是 LTS 版本。
- Aura
-
Aura 是 Neo4j 的全托管云服务。它提供免费和付费计划。
- Cypher
-
Cypher 是 Neo4j 的图查询语言,允许您从数据库中检索数据。它就像 SQL,但专用于图数据库。
- APOC
-
Awesome Procedures On Cypher (APOC) 是一个包含(许多)函数的库,这些函数在 Cypher 本身中难以轻松实现。
- Bolt
-
Bolt 是用于 Neo4j 实例和驱动程序之间交互的协议。默认监听 7687 端口。
- ACID
-
原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation)、持久性 (Durability) (ACID) 是保证数据库事务可靠处理的属性。符合 ACID 的 DBMS 确保即使发生故障,数据库中的数据也能保持准确和一致。
- 最终一致性
-
如果一个数据库能保证所有集群成员在某个时间点都存储了数据的最新版本,则该数据库具有最终一致性。
- 因果一致性
-
如果读写查询被集群中的每个成员以相同的顺序看到,则数据库具有因果一致性。这比最终一致性更强。
- NULL
-
空标记不是一种类型,而是缺失值的占位符。更多信息,请参阅 Cypher → 使用
null。 - 事务
-
事务是一个工作单元,要么被提交,要么在失败时被回滚。例如银行转账:它涉及多个步骤,但它们必须全部成功或全部撤销,以避免钱从一个账户扣除却未存入另一个账户的情况。
- 背压
-
背压是对数据流的抵抗力。它确保客户端不会被过快发送的数据压垮,从而超出其处理能力。
- 书签
-
书签是代表数据库某种状态的标记。通过将一个或多个书签与查询一起传递,服务器将确保在所表示的状态建立之前,该查询不会被执行。
- 事务函数
-
事务函数是由
executeRead或executeWrite调用执行的回调。如果发生服务器故障,驱动程序会自动重新执行该回调。 - 驱动程序 (Driver)
-
Driver对象保存了与 Neo4j 数据库建立连接所需的详细信息。