Quarkus
适用于使用 Quarkus 并希望利用预配置的 Java 驱动程序实例以及与 OGM 集成的 Java 开发者。有关更多信息,请查阅相关文档。
-
具备 Quarkus 相关知识/经验。
-
对于此库,请使用 JDK 17 或更高版本、最新的 Maven 安装以及您喜欢的 IDE。
-
如果您想在本地运行 Neo4j 数据库,还需要安装 Docker。
入门
在接下来的几个章节中,我们将逐步介绍使用 Neo4j 创建 Quarkus 应用程序的所有步骤。
您可以从 GitHub 获取电影示例项目
git clone https://github.com/sdaschner/movies-java-quarkus/
cd movies-java-quarkus/
本地构建与运行
您可以通过 Maven 构建项目
mvn package
此外,您可以执行集成测试,该测试通过 Testcontainers 启动本地 Neo4j 实例
mvn test-compile failsafe:integration-test failsafe:verify
您可以通过可执行 JAR 运行 Quarkus 应用程序
java -jar target/quarkus-app/quarkus-run.jar
这将启动您的 Quarkus 应用程序,然后您可以通过 https://:8080/ 访问它
现在,您可以尝试并探索电影查询示例。
在本地运行数据库
默认情况下,该示例使用位于 https://demo.neo4jlabs.com:7473 的通用数据库运行
您还可以将示例项目作为 Docker 容器运行本地 Neo4j 数据库。为此,请执行 ./run-graph-db.sh
脚本,并修改 src/main/resources/application.properties 下的 Quarkus 应用程序属性。
# run in a separate shell, starts up a Docker container from neo4j:4.4.12
./run-graph-db.sh
quarkus.neo4j.uri=bolt://:7687
quarkus.neo4j.authentication.username=neo4j
quarkus.neo4j.authentication.password=test
Quarkus 开发模式
为了改善开发体验并快速修改代码,您可以使用 Quarkus 的开发模式,该模式与 Neo4j 和 Neo4j OGM 扩展兼容
mvn quarkus:dev
这也会启动您的应用程序在 8080 端口,但会保持与源代码的连接并允许快速重新部署。
恭喜!现在您已具备使用 Neo4j 开发 Quarkus 应用程序所需的一切。
以下解释了我们的 Quarkus 应用程序如何访问 Neo4j 数据库,以及 OGM 映射是如何集成的。
理解示例
我们的 Quarkus 应用程序使用 Neo4j-OGM Quarkus 扩展,如果您想使用 对象图映射器,我们推荐使用此扩展。
pom.xml 包含此依赖项,它会传递性地添加 Neo4j Quarkus 扩展和 OGM 依赖项
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-quarkus</artifactId>
<version>1.5.1</version>
</dependency>
包含此依赖后,您的 Quarkus 应用程序会配置 Neo4j 驱动程序,并将 OGM 映射会话工厂设置为可注入的 Bean。
您可以在以下类中了解 OGM 会话工厂的使用方式
@ApplicationScoped
public class Searches {
@Inject
SessionFactory sessionFactory;
public List<Movie> searchMoviesByTitle(String title) {
Session session = sessionFactory.openSession();
Iterable<Movie> iterable = session.query(Movie.class, "MATCH (movie:Movie) WHERE movie.title CONTAINS $title RETURN movie", Map.of("title", title));
// [...]
}
}
域实体,例如 Movie 被声明为 OGM 节点实体类
@NodeEntity
public class Movie {
@Id
public String title;
public String tagline;
public Integer released;
public int votes;
@Relationship(value = "DIRECTED", direction = INCOMING)
@JsonbTypeSerializer(PersonNamesSerializer.class)
public Set<Person> directors = new HashSet<>();
@Relationship(value = "WROTE", direction = INCOMING)
@JsonbTypeSerializer(PersonNamesSerializer.class)
public Set<Person> writers = new HashSet<>();
@Relationship(value = "PRODUCED", direction = INCOMING)
@JsonbTypeSerializer(PersonNamesSerializer.class)
public Set<Person> producers = new HashSet<>();
@Relationship(value = "REVIEWED", direction = INCOMING)
@JsonbTypeSerializer(ReviewsSerializer.class)
public Set<Review> reviewers = new HashSet<>();
@Relationship(value = "ACTED_IN", direction = INCOMING)
@JsonbTypeSerializer(ActsSerializer.class)
public Set<Act> actors = new HashSet<>();
}
有关更详细的解释,请查阅对象图映射器文档。@JsonbTypeSerializer
注解控制实体对象如何映射到 JAX-RS REST 端点的 JSON。
您可以查看 MovieResource
、SearchResource
、ActorsResource
和 GraphResource
JAX-RS 类中的代码,以理解各个用例。
OGM 4.0
中添加的另一个有用的功能是 DTO 类和 Java 记录的映射。这些类型从任意查询结果中映射,并且相应的类无需进行注解。例如,请参见 Persons
类和 session.queryDto()
方法的使用。
@ApplicationScoped
public class Persons {
@Inject
SessionFactory sessionFactory;
public List<ActorRecommendation> recommendCoActor(String name) {
Session session = sessionFactory.openSession();
return session.queryDto(" MATCH (actor:Person {name: $name}) [...] " +
" [...] " +
" RETURN cocoActors.name AS actor, count(*) AS strength ORDER BY strength DESC",
Map.of("name", name), ActorRecommendation.class);
}
}
public record ActorRecommendation(String actor, long strength) {
}
Quarkus Neo4j 功能
接下来,我们来看看 Quarkus 和 Neo4j 可用的集成功能。
驱动程序集成
Quarkus Neo4j 集成的目标是提供对获取 Neo4j 驱动程序托管实例的支持。您可以通过 Quarkus 配置机制(通常在 application.properties 文件中)提供驱动程序属性来配置您的应用程序。最终您将拥有一个可注入的驱动程序实例,可与
@Inject
Driver driver;
在业务操作代码库中使用。
您可能注意到,在我们的电影示例中我们没有使用此注入,而是注入了 OGM 会话工厂。两者都可行,这取决于您的用例和应用程序设置,选择哪种方式。 |
除了托管驱动程序 Bean 的创建之外,这些集成还公开了驱动程序和与 Neo4j 实例连接的健康指标。
在现有的 Quarkus 应用程序中,您需要将 quarkus-neo4j
依赖项添加到您的项目中。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-neo4j</artifactId>
</dependency>
如果您使用的是 Neo4j-OGM 扩展,则此依赖项将传递性地包含在内,不应显式声明。 |
您可以根据需要配置基本连接参数。
quarkus.neo4j.uri = bolt://:7687
quarkus.neo4j.authentication.username = neo4j
quarkus.neo4j.authentication.password = secret
健康检查集成
如果您想使用健康检查,则需要额外的 quarkus-smallrye-health
依赖项。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-health</artifactId>
</dependency>
指标集成
为了支持指标,您需要声明 MicroMeter(Quarkus 推荐)或 SmallRye Metrics(仅当您确实需要 MicroProfile 规范时)依赖项。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-micrometer-registry-prometheus</artifactId>
</dependency>
Neo4j 的指标必须在 application.properties 中手动启用。
quarkus.neo4j.pool.metrics-enabled = true
OGM 集成
您的 Quarkus 应用程序可以与 Neo4j OGM 集成,以为您的域实体提供声明式对象映射。有一个官方的 Quarkus 扩展可用,除非您有特殊原因,否则我们建议使用它。
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-quarkus</artifactId>
<version>1.5.1</version>
</dependency>
<!-- with this, you can remove io.quarkus:quarkus-neo4j from your pom.xml again -->
此依赖项传递性地包含 Neo4j OGM 和 Quarkus Neo4j 依赖项,因此它是您 pom.xml 中唯一需要的 Neo4j 依赖项。
Neo4j-OGM Quarkus 依赖项配置 OGM 会话工厂并使其可作为 Bean 注入
@Inject
SessionFactory sessionFactory;