Quarkus
对于使用 Quarkus 的 Java 开发人员,他们希望利用预配置的 Java 驱动程序实例以及与 OGM 的集成。 请参阅链接文档以了解更多信息。
-
具备 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 应用程序,该应用程序将在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.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 依赖项
<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 类中的代码来理解各个用例。
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.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 规范)依赖项。
<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 扩展可用,我们建议使用它,除非您有充分的理由不使用它。
<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;