Pengenalan kepada Spring Data Neo4j

1. Gambaran keseluruhan

Artikel ini adalah pengenalan kepada Spring Data Neo4j , pangkalan data grafik yang popular.

Spring Data Neo4j membolehkan pengembangan berasaskan POJO untuk Pangkalan Data Grafik Neo4j dan menggunakan konsep Spring yang sudah biasa seperti kelas templat untuk penggunaan API teras dan menyediakan model pengaturcaraan berasaskan anotasi.

Juga, banyak pembangun tidak tahu sama ada Neo4j sebenarnya akan sesuai dengan keperluan khusus mereka; inilah gambaran keseluruhan yang kukuh mengenai Stackoverflow membincangkan mengapa menggunakan Neo4j dan kebaikan dan keburukan.

2. Pergantungan Maven

Mari mulakan dengan menyatakan pergantungan Spring Data Neo4j di pom.xml. Modul Spring yang disebutkan di bawah juga diperlukan untuk Spring Data Neo4j:

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

Ketergantungan ini merangkumi modul yang diperlukan untuk ujian juga.

Perhatikan bahawa kebergantungan terakhir adalah 'ujian'. Tetapi perhatikan juga bahawa, dalam pengembangan aplikasi dunia nyata, anda cenderung menjalankan pelayan Neo4J penuh.

Sekiranya kita ingin menggunakan pelayan tertanam, kita juga harus menambahkan kebergantungan:

 org.neo4j neo4j-ogm-embedded-driver 3.1.2 

Pergantungan pemacu-data-neo4j, neo4j-ogm dan neo4j-ogm-driver tersedia di Maven Central.

3. Konfigurasi Neo4Jj

Konfigurasi Neo4j sangat lurus ke hadapan dan menentukan tetapan sambungan agar aplikasi disambungkan ke pelayan. Mirip dengan kebanyakan modul data spring yang lain, ini adalah konfigurasi spring yang boleh didefinisikan sebagai konfigurasi XML atau Java.

Dalam tutorial ini, kami hanya akan menggunakan konfigurasi berasaskan 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()); }

Seperti yang disebutkan di atas, konfigurasi itu sederhana dan hanya berisi dua pengaturan. Pertama - SessionFactory merujuk model yang kami buat untuk mewakili objek data. Kemudian, sifat sambungan dengan titik akhir pelayan dan kelayakan akses.

Neo4j akan menyimpulkan kelas pemandu berdasarkan protokol URI, dalam kes kami "http".

Harap maklum bahawa dalam contoh ini, sifat berkaitan sambungan dikonfigurasikan terus ke pelayan; namun dalam aplikasi produksi, ini harus dilekatkan dengan betul dan merupakan sebahagian daripada konfigurasi standard projek.

4. Repositori Neo4j

Menyelaraskan dengan rangka kerja Spring Data, Neo4j menyokong tingkah laku abstraksi repositori Spring Data. Ini bermakna mengakses mekanisme berterusan yang berterusan disingkirkan dalam Neo4jRepository yang terbina di mana projek dapat secara langsung memperluasnya dan menggunakan operasi yang disediakan di luar kotak.

Repositori dapat diperluas dengan kaedah pencari yang dijelaskan, diberi nama atau berasal. Sokongan untuk Spring Data Neo4j Repositori juga berdasarkan Neo4jTemplate , jadi fungsi yang mendasari adalah serupa.

4.1. Mewujudkan MovieRepository & PersonRepository

Kami menggunakan dua repositori dalam tutorial ini untuk ketekunan data:

@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); } 

Seperti yang anda boleh, repositori mengandungi beberapa operasi tersuai dan juga operasi standard yang diwarisi dari kelas asas.

Seterusnya kita mempunyai PersonRepository yang lebih sederhana , yang hanya mempunyai operasi standard:

@Repository public interface PersonRepository extends Neo4jRepository  { // }

Anda mungkin telah menyedari bahawa PersonRepository hanyalah antara muka Spring Data standard. Ini kerana, dalam contoh sederhana ini, hampir memadai untuk menggunakan operasi inbuilt pada dasarnya kerana set operasi kami berkaitan dengan entiti Filem . Walau bagaimanapun, anda selalu dapat menambahkan operasi khusus di sini yang mungkin membungkus operasi tunggal / berbilang.

4.2. Mengkonfigurasi Repositori Neo4j

Sebagai langkah seterusnya, kita harus membiarkan Spring mengetahui repositori yang relevan yang menunjukkannya di kelas Konfigurasi Neo4j yang dibuat di bahagian 3:

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

5. Model Data Penuh

Kami sudah mula melihat model data, jadi sekarang mari kita susun semuanya - Filem, Peranan dan Peribadi yang lengkap . The Orang rujukan entiti Movie entiti melalui Peranan hubungan.

@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 }

Perhatikan bagaimana kami memberi anotasi Filem dengan @NodeEntity untuk menunjukkan bahawa kelas ini dipetakan secara langsung ke nod di 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 }

Sudah tentu, ini Pasangan terakhir kelas yang sama dijelaskan dan -movies - rujukan menghubungkan Orang untuk Movie kelas oleh "ACTED_IN" hubungan.

6. Akses Data Menggunakan MovieRepository

6.1. Menyimpan Objek Filem Baru

Mari simpan beberapa data - pertama, Filem baru, kemudian Orang dan tentu saja Peranan - termasuk semua data hubungan yang kita miliki juga:

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. Mengambil Objek Filem Yang Ada mengikut Tajuk

Sekarang mari kita sahkan filem yang disisipkan dengan mengambilnya menggunakan tajuk yang ditentukan yang merupakan operasi tersuai:

Movie result = movieRepository.findByTitle(title);

6.3. Mengambil Objek Filem Yang Ada dengan Bahagian Tajuk

Adalah mungkin untuk mencari untuk mencari filem yang ada menggunakan bahagian tajuk:

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

6.4. Mengambil Semua Filem

Semua filem boleh diambil sekali dan dapat memeriksa jumlah yang betul:

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

Walau bagaimanapun, terdapat banyak kaedah mencari yang dilengkapi dengan tingkah laku lalai yang berguna untuk keperluan kastam dan tidak semuanya dijelaskan di sini.

6.5. Hitung Objek Filem Yang Ada

Setelah memasukkan beberapa objek filem, kita dapat keluar dari jumlah filem:

long movieCount = movieRepository.count();

6.6. Memadamkan Filem Sedia Ada

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

Setelah menghapus filem yang disisipkan, kami dapat mencari objek filem dan mengesahkan hasilnya tidak sah:

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

6.7. Padam Semua Data yang Dimasukkan

Adalah mungkin untuk menghapus semua elemen dalam pangkalan data menjadikan pangkalan data kosong:

movieRepository.deleteAll();

Hasil operasi ini dengan cepat membuang semua data dari jadual.

7. Kesimpulannya

Dalam tutorial ini, kami membaca asas-asas Spring Data Neo4j menggunakan contoh yang sangat mudah.

Namun Neo4j mampu memenuhi aplikasi yang sangat maju dan kompleks yang mempunyai rangkaian hubungan dan rangkaian yang besar. Dan Spring Data Neo4j juga menawarkan ciri-ciri canggih untuk memetakan kelas entiti yang diberi anotasi ke Pangkalan Data Grafik Neo4j.

Pelaksanaan potongan kode dan contoh di atas boleh didapati di projek GitHub - ini adalah projek berasaskan Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.