使用 Neo4j 和 Java 构建应用程序
Neo4j Java 驱动程序是用于通过 Java 应用程序与 Neo4j 实例交互的官方库。
Neo4j 的核心是 Cypher,这是用于与 Neo4j 数据库交互的查询语言。虽然本指南不要求您是经验丰富的 Cypher 查询者,但如果您已经了解一些 Cypher,那么更容易专注于 Java 特定的部分。因此,尽管本指南也提供了 Cypher 的简要介绍,但如果这是您第一次接触,请考虑查看入门 → Cypher,以获取图数据库建模和查询的更详细说明。然后,您可以按照本指南开发您的 Java 应用程序时应用这些知识。
安装
将 Neo4j Java 驱动程序添加到 Maven 项目的 pom.xml
文件中的依赖项列表
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>5.28.5</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://localhost", "neo4j+s://xxx.databases.neo4j.io"
final String dbUri = "{neo4j-database-uri}";
final String dbUser = "{neo4j-username}";
final String dbPassword = "{neo4j-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("neo4j").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
的 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("neo4j").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
-
长期支持版本是保证支持数年的版本。Neo4j 4.4 是 LTS,Neo4j 5 也将有 LTS 版本。
- Aura
-
Aura 是 Neo4j 的完全托管云服务。它提供免费和付费计划。
- Cypher
-
Cypher 是 Neo4j 的图查询语言,可让您从数据库中检索数据。它类似于 SQL,但适用于图。
- APOC
-
Awesome Procedures On Cypher (APOC) 是一个(许多)函数库,这些函数本身无法轻松地在 Cypher 中表达。
- Bolt
-
Bolt 是 Neo4j 实例和驱动程序之间交互所使用的协议。它默认监听端口 7687。
- ACID
-
原子性、一致性、隔离性和持久性 (ACID) 是确保数据库事务可靠处理的属性。符合 ACID 的 DBMS 确保数据库中的数据即使在发生故障时也能保持准确和一致。
- 最终一致性
-
如果数据库提供所有集群成员将在某个时间点存储最新版本数据的保证,则它是最终一致的。
- 因果一致性
-
如果集群中的每个成员都以相同的顺序看到读写查询,则数据库是因果一致的。这比最终一致性更强。
- NULL
-
空标记不是一种类型,而是缺少值的占位符。有关更多信息,请参阅 Cypher → 使用
null
。 - 事务
-
事务是一个工作单元,它要么整体提交,要么在失败时回滚。一个例子是银行转账:它涉及多个步骤,但它们必须全部成功或被撤销,以避免资金从一个账户中扣除但未添加到另一个账户中。
- 背压
-
背压是阻碍数据流动的力。它确保客户端不会被比其处理速度更快的数据所淹没。
- 事务函数
-
事务函数是由
executeRead
或executeWrite
调用执行的回调。驱动程序在服务器故障时会自动重新执行该回调。 - 驱动程序
-
一个
Driver
对象包含与 Neo4j 数据库建立连接所需的详细信息。