Quarkus

对于使用 Quarkus 的 Java 开发人员,他们希望利用预配置的 Java 驱动程序实例以及与 OGM 的集成。 请参阅链接文档以了解更多信息。

我们将涵盖的内容

  • 电影示例应用程序

  • Quarkus Neo4j 驱动程序集成

  • Neo4j OGM 集成

  • 健康和指标支持

入门

在接下来的几个部分中,我们将逐步介绍创建使用 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 应用程序,该应用程序将在http://localhost: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 应用程序.properties
quarkus.neo4j.uri=bolt://localhost: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 依赖项

Neo4j-OGM Quarkus 依赖项
<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。

您可以按照MovieResourceSearchResourceActorsResourceGraphResource JAX-RS 类中的代码来理解各个用例。

4.0 中添加的另一个有用的 OGM 功能是 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 应用程序.properties
quarkus.neo4j.uri = bolt://localhost: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 规范)依赖项。

MicroMeter(Prometheus)依赖项
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-micrometer-registry-prometheus</artifactId>
</dependency>

必须在application.properties中手动启用 Neo4j 的指标。

quarkus.neo4j.pool.metrics-enabled = true

OGM 集成

您的 Quarkus 应用程序可以与 Neo4j 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;

资源

Quarkus 文档

Neo4j 集成配置属性指南

Neo4j-OGM Quarkus 扩展

GitHub

示例

Quarkus 示例Quarkus 电影示例应用程序