Giới thiệu về Spring Data Neo4j

1. Khái quát chung

Bài viết này giới thiệu về Spring Data Neo4j , cơ sở dữ liệu đồ thị phổ biến.

Dữ liệu mùa xuân Neo4j cho phép phát triển dựa trên POJO cho Cơ sở dữ liệu đồ thị Neo4j và sử dụng các khái niệm Spring quen thuộc như lớp mẫu để sử dụng API cốt lõi và cung cấp mô hình lập trình dựa trên chú thích.

Ngoài ra, nhiều nhà phát triển không thực sự biết liệu Neo4j có thực sự phù hợp với nhu cầu cụ thể của họ hay không; đây là tổng quan vững chắc về Stackoverflow thảo luận lý do tại sao sử dụng Neo4j và những ưu và nhược điểm.

2. Sự phụ thuộc của Maven

Hãy bắt đầu bằng cách khai báo các phụ thuộc Spring Data Neo4j trong pom.xml. Các mô-đun Spring được đề cập dưới đây cũng được yêu cầu cho Spring Data Neo4j:

 org.springframework.data spring-data-neo4j 5.0.1.RELEASE   org.neo4j neo4j-ogm-test 3.1.2 test 

Những phụ thuộc này cũng bao gồm các mô-đun bắt buộc để kiểm tra.

Lưu ý rằng phần phụ thuộc cuối cùng có phạm vi là 'thử nghiệm'. Nhưng cũng lưu ý rằng, trong quá trình phát triển ứng dụng trong thế giới thực, nhiều khả năng bạn sẽ có một máy chủ Neo4J đầy đủ đang chạy.

Nếu chúng ta muốn sử dụng máy chủ nhúng, chúng ta cũng phải thêm phần phụ thuộc:

 org.neo4j neo4j-ogm-embedded-driver 3.1.2 

Các phần phụ thuộc trình điều khiển nhúng vào Spring-data-neo4j, neo4j-ogm và neo4j-ogm có sẵn trên Maven Central.

3. Cấu hình Neo4Jj

Cấu hình Neo4j rất đơn giản và xác định cài đặt kết nối để ứng dụng kết nối với máy chủ. Tương tự như hầu hết các mô-đun dữ liệu mùa xuân khác, đây là cấu hình mùa xuân có thể được định nghĩa là cấu hình XML hoặc Java.

Trong hướng dẫn này, chúng tôi sẽ chỉ sử dụng cấu hình dựa trên Java:

public static final String URL = System.getenv("NEO4J_URL") != null ? System.getenv("NEO4J_URL") : "//neo4j:[email protected]:7474"; @Bean public org.neo4j.ogm.config.Configuration getConfiguration() { return new Builder().uri(URL).build(); } @Bean public SessionFactory getSessionFactory() { return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain"); } @Bean public Neo4jTransactionManager transactionManager() { return new Neo4jTransactionManager(getSessionFactory()); }

Như đã đề cập ở trên, cấu hình đơn giản và chỉ chứa hai cài đặt. Đầu tiên - SessionFactory đang tham chiếu đến các mô hình mà chúng tôi đã tạo để đại diện cho các đối tượng dữ liệu. Sau đó, thuộc tính kết nối với điểm cuối máy chủ và thông tin xác thực truy cập.

Neo4j sẽ suy ra lớp trình điều khiển dựa trên giao thức của URI, trong trường hợp của chúng tôi là “http”.

Xin lưu ý rằng trong ví dụ này, các thuộc tính liên quan đến kết nối được định cấu hình trực tiếp đến máy chủ; tuy nhiên trong một ứng dụng sản xuất, chúng phải được ngoại hóa đúng cách và là một phần của cấu hình tiêu chuẩn của dự án.

4. Kho lưu trữ Neo4j

Phù hợp với khung dữ liệu Spring, Neo4j hỗ trợ hành vi trừu tượng hóa kho lưu trữ Dữ liệu mùa xuân. Điều đó có nghĩa là việc truy cập cơ chế liên tục cơ bản được trừu tượng hóa trong Neo4jRepository có sẵn , nơi một dự án có thể trực tiếp mở rộng nó và sử dụng các hoạt động được cung cấp bên ngoài.

Các kho lưu trữ có thể mở rộng bằng các phương pháp tìm chú thích, đặt tên hoặc dẫn xuất. Hỗ trợ cho Kho lưu trữ Neo4j Dữ liệu mùa xuân cũng dựa trên Neo4jTemplate , vì vậy chức năng cơ bản là giống hệt nhau.

4.1. Tạo MovieRepository & PersonRepository

Chúng tôi sử dụng hai kho lưu trữ trong hướng dẫn này để đảm bảo tính ổn định của dữ liệu:

@Repository public interface MovieRepository extends Neo4jRepository { Movie findByTitle(@Param("title") String title); @Query("MATCH (m:Movie) WHERE m.title =~ ('(?i).*'+{title}+'.*') RETURN m") Collection findByTitleContaining(@Param("title") String title); @Query("MATCH (m:Movie)<-[:ACTED_IN]-(a:Person) RETURN m.title as movie, collect(a.name) as cast LIMIT {limit}") List graph(@Param("limit") int limit); } 

Như bạn có thể, kho chứa một số thao tác tùy chỉnh cũng như các thao tác tiêu chuẩn được kế thừa từ lớp cơ sở.

Tiếp theo, chúng ta có PersonRepository đơn giản hơn , chỉ có các hoạt động tiêu chuẩn:

@Repository public interface PersonRepository extends Neo4jRepository  { // }

Bạn có thể đã nhận thấy rằng PersonRepository chỉ là giao diện Spring Data tiêu chuẩn. Điều này là do, trong ví dụ đơn giản này, gần như là đủ để sử dụng các hoạt động có sẵn về cơ bản vì tập hợp hoạt động của chúng ta có liên quan đến thực thể Phim . Tuy nhiên, bạn luôn có thể thêm các thao tác tùy chỉnh ở đây có thể bao gồm một / nhiều thao tác có sẵn.

4.2. Định cấu hình Kho lưu trữ Neo4j

Bước tiếp theo, chúng ta phải cho Spring biết kho lưu trữ có liên quan chỉ ra nó trong lớp Neo4jConfiguration được tạo trong phần 3:

@Configuration @ComponentScan("com.baeldung.spring.data.neo4j") @EnableNeo4jRepositories( basePackages = "com.baeldung.spring.data.neo4j.repository") public class MovieDatabaseNeo4jConfiguration { // }

5. Mô hình dữ liệu đầy đủ

Chúng tôi đã bắt đầu xem xét mô hình dữ liệu, vì vậy bây giờ chúng ta hãy trình bày tất cả - Phim, VaiNgười đầy đủ . Thực thể Người tham chiếu đến thực thể Phim thông qua mối quan hệ Vai trò .

@NodeEntity public class Movie { @Id @GeneratedValue Long id; private String title; private int released; private String tagline; @Relationship(type="ACTED_IN", direction = Relationship.INCOMING) private List roles; // standard constructor, getters and setters }

Lưu ý cách chúng tôi đã chú thích Movie với @NodeEntity để chỉ ra rằng lớp này được ánh xạ trực tiếp đến một nút trong Neo4j.

@JsonIdentityInfo(generator=JSOGGenerator.class) @NodeEntity public class Person { @Id @GeneratedValue Long id; private String name; private int born; @Relationship(type = "ACTED_IN") private List movies; // standard constructor, getters and setters } @JsonIdentityInfo(generator=JSOGGenerator.class) @RelationshipEntity(type = "ACTED_IN") public class Role { @Id @GeneratedValue Long id; private Collection roles; @StartNode private Person person; @EndNode private Movie movie; // standard constructor, getters and setters }

Tất nhiên, vài lớp cuối cùng này được chú thích tương tự và tham chiếu -movies - đang liên kết lớp Người với lớp Phim bằng quan hệ “ACTED_IN”.

6. Truy cập dữ liệu bằng MovieRepository

6.1. Lưu đối tượng phim mới

Hãy lưu một số dữ liệu - đầu tiên là Phim mới, sau đó là Người và tất nhiên là Vai trò - bao gồm tất cả dữ liệu quan hệ mà chúng ta có:

Movie italianJob = new Movie(); italianJob.setTitle("The Italian Job"); italianJob.setReleased(1999); movieRepository.save(italianJob); Person mark = new Person(); mark.setName("Mark Wahlberg"); personRepository.save(mark); Role charlie = new Role(); charlie.setMovie(italianJob); charlie.setPerson(mark); Collection roleNames = new HashSet(); roleNames.add("Charlie Croker"); charlie.setRoles(roleNames); List roles = new ArrayList(); roles.add(charlie); italianJob.setRoles(roles); movieRepository.save(italianJob);

6.2. Lấy một đối tượng phim hiện có theo tiêu đề

Bây giờ chúng ta hãy xác minh phim đã chèn bằng cách truy xuất phim bằng cách sử dụng tiêu đề đã xác định là thao tác tùy chỉnh:

Movie result = movieRepository.findByTitle(title);

6.3. Lấy một đối tượng phim hiện có theo một phần của tiêu đề

Có thể tìm kiếm để tìm kiếm phim hiện có bằng cách sử dụng một phần của tiêu đề:

Collection result = movieRepository.findByTitleContaining("Italian");

6.4. Truy xuất tất cả các bộ phim

Tất cả các phim có thể được truy xuất một lần và có thể kiểm tra số lượng chính xác:

Collection result = (Collection) movieRepository.findAll();

Tuy nhiên, có một số phương pháp tìm được cung cấp với hành vi mặc định hữu ích cho các yêu cầu hải quan và không phải tất cả đều được mô tả ở đây.

6.5. Đếm các đối tượng phim hiện có

Sau khi chèn một số đối tượng phim, chúng ta có thể nhận được số lượng phim thoát:

long movieCount = movieRepository.count();

6.6. Xóa phim hiện có

movieRepository.delete(movieRepository.findByTitle("The Italian Job"));

Sau khi xóa phim đã chèn, chúng tôi có thể tìm kiếm đối tượng phim và xác minh kết quả là null:

assertNull(movieRepository.findByTitle("The Italian Job"));

6,7. Xóa tất cả dữ liệu đã chèn

Có thể xóa tất cả các phần tử trong cơ sở dữ liệu làm cho cơ sở dữ liệu trống:

movieRepository.deleteAll();

Kết quả của thao tác này nhanh chóng xóa tất cả dữ liệu khỏi bảng.

7. Kết luận

Trong hướng dẫn này, chúng tôi đã đi qua các khái niệm cơ bản về Spring Data Neo4j bằng một ví dụ rất đơn giản.

Tuy nhiên Neo4j có khả năng đáp ứng các ứng dụng rất cao cấp và phức tạp có một tập hợp các mối quan hệ và mạng lưới khổng lồ. Và Spring Data Neo4j cũng cung cấp các tính năng nâng cao để ánh xạ các lớp thực thể có chú thích vào Cơ sở dữ liệu đồ thị Neo4j.

Việc triển khai các đoạn mã và ví dụ ở trên có thể được tìm thấy trong dự án GitHub - đây là một dự án dựa trên Maven, vì vậy nó sẽ dễ dàng nhập và chạy như nó vốn có.