Quarkus 与 Neo4j
文中所展示的所有代码均可在 quarkus-neo4j-intro-app Github 仓库中找到。
此应用程序使用了一个现成的演示数据库,其中包含 goodreads 数据集,该数据集由 Book(书籍)和 Author(作者)实体及其相互关联构成。

连接到数据库
要连接到 Neo4j,您需要凭据和连接详细信息。由于此示例使用公共数据库,因此无需进行任何更改即可连接。
连接到 Neo4j – src/main/resources/application.properties
# Neo4j config
quarkus.neo4j.uri=neo4j+s://demo.neo4jlabs.com
quarkus.neo4j.authentication.username=goodreads
quarkus.neo4j.authentication.password=goodreadsCode language: PHP (php)
领域类
领域类代表您领域中的数据。在本例中,将存在一个 Book 类和一个 Author 类。
领域类 – src/main/java/org/neo4j/Book.java
@NodeEntity
public class Book {
@Id
public String book_id;
public String title;
public String isbn;
public String isbn13;
@Relationship(value = "AUTHORED", direction = Relationship.Direction.INCOMING)
public List<Author> authors = new ArrayList<>();
public Book() {
}
public Book(String book_id, String title) {
this.book_id = book_id;
this.title = title;
}
//getters and setters
}Code language: Java (java)
这些注解来自 neo4j-ogm-quarkus 库,用于定义实体和属性,以便在 Neo4j 与应用程序之间映射数据。另一个示例可在该库的测试源代码中找到。请注意,上面的类指向了缺失的 Author 类,该类将在下一步创建。
领域类 – src/main/java/org/neo4j/Author.java
@NodeEntity
public class Author {
@Id
public String author_id;
public String name;
public Author() {
}
public Author(String author_id, String name) {
this.author_id = author_id;
this.name = name;
}
//getters and setters
}Code language: JavaScript (javascript)
Repository 接口
Repository 接口通常包含用于在应用程序和数据库之间检索和返回数据的方法与查询。
Repository – src/main/java/org/neo4j/BookRepository.java
@ApplicationScoped
public class BookRepository {
private final SessionFactory sessionFactory;
BookRepository(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
Iterable<Book> findBooks() {
return sessionFactory.openSession().query(Book.class,
"MATCH (book:Book)<-[rel:AUTHORED]-(author:Author) RETURN book, collect(rel), collect(author) LIMIT 10;",
Map.of());
}
Book findByTitle(String title) {
return sessionFactory.openSession().queryForObject(Book.class,
"MATCH (book:Book)<-[rel:AUTHORED]-(author:Author) WHERE book.title = $title RETURN book, collect(rel), collect(author);",
Map.of("title", title));
}
Iterable<Book> findBooksByAuthor(String name) {
return sessionFactory.openSession().query(Book.class,
"MATCH (book:Book)<-[rel:AUTHORED]-(author:Author) WHERE author.name = $name RETURN book, collect(rel), collect(author) LIMIT 10;",
Map.of("name", name));
}
}Code language: Java (java)
通过以下几个方法定义了检索逻辑:
- 查找 10 本书 – findBooks()
- 按书名查找书籍 – findByTitle(String title)
- 按作者姓名查找书籍 – findBooksByAuthor(String name)
控制器/资源类
控制器(在 Quarkus 术语中称为资源)将定义面向用户的端点以检索数据。此应用程序仅定义了 Book 资源。
资源 – src/main/java/org/neo4j/BookResource.java
@RequestScoped
@Path("/books")
public class BookResource {
private final BookRepository bookRepository;
@Inject
public BookResource(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public Iterable<Book> getBooks() {
return bookRepository.findBooks();
}
@GET
@Path("/{title}")
@Produces(MediaType.APPLICATION_JSON)
public Book getBookByTitle(@PathParam("title") String title) {
return bookRepository.findByTitle(title);
}
@GET
@Path("/author/{name}")
@Produces(MediaType.APPLICATION_JSON)
public Iterable<Book> getBooksByAuthor(@PathParam("name") String name) {
return bookRepository.findBooksByAuthor(name);
}
}Code language: Java (java)
前两个注解将 Bean 的作用域限定为每个请求,并设置了主端点 (/books)。每个方法都以 @GET 注解开头,将其定义为 GET 端点。最后两个方法使用路径变量将书名或作者姓名作为 URL 路径上的值进行传递。
运行并测试应用程序
您可以在命令行界面运行该应用程序,或者使用您首选的 IDE 中提供的“运行”(play)按钮。
./mvnw quarkus:devCode language: Shell Session (shell)
以下是一些可以尝试的请求。这些示例也可在 Github 仓库的 README 文件中找到。
http ":8080/books"
http ":8080/books/The Hobbit"
http ":8080/books/author/J.K. Rowling"Code language: Shell Session (shell)


