Pengantar Spring Data Neo4j

1. Ikhtisar

Artikel ini merupakan pengantar Spring Data Neo4j , database grafik yang populer.

Spring Data Neo4j memungkinkan pengembangan berbasis POJO untuk Database Grafik Neo4j dan menggunakan konsep Spring yang sudah dikenal seperti kelas template untuk penggunaan API inti dan menyediakan model pemrograman berbasis anotasi.

Juga, banyak pengembang tidak benar-benar tahu apakah Neo4j benar-benar cocok untuk kebutuhan spesifik mereka; berikut adalah gambaran umum yang solid tentang Stackoverflow yang membahas mengapa menggunakan Neo4j serta pro dan kontranya.

2. Ketergantungan Maven

Mari kita mulai dengan mendeklarasikan dependensi Spring Data Neo4j di pom.xml. Modul Musim Semi yang disebutkan di bawah ini 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 mencakup modul yang diperlukan untuk pengujian juga.

Perhatikan bahwa dependensi terakhir memiliki cakupan sebagai 'test'. Tetapi perhatikan juga bahwa, dalam pengembangan aplikasi dunia nyata, Anda lebih cenderung menjalankan server Neo4J penuh.

Jika kita ingin menggunakan server tertanam, kita juga harus menambahkan ketergantungan:

 org.neo4j neo4j-ogm-embedded-driver 3.1.2 

Dependensi spring-data-neo4j, neo4j-ogm-test dan neo4j-ogm-embedded-driver tersedia di Maven Central.

3. Konfigurasi Neo4Jj

Konfigurasi Neo4j sangat lurus ke depan dan menentukan pengaturan koneksi untuk aplikasi agar terhubung ke server. Mirip dengan kebanyakan modul data pegas lainnya, ini adalah konfigurasi pegas yang dapat didefinisikan sebagai konfigurasi XML atau Java.

Dalam tutorial ini, kami hanya akan menggunakan konfigurasi berbasis 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 disebutkan di atas, konfigurasinya sederhana dan hanya berisi dua pengaturan. Pertama - SessionFactory mereferensikan model yang kita buat untuk mewakili objek data. Kemudian, properti koneksi dengan titik akhir server dan kredensial akses.

Neo4j akan menyimpulkan kelas driver berdasarkan protokol URI, dalam kasus kami "http".

Harap dicatat bahwa dalam contoh ini, properti terkait koneksi dikonfigurasi langsung ke server; namun dalam aplikasi produksi, ini harus dikeluarkan dengan benar dan menjadi bagian dari konfigurasi standar proyek.

4. Repositori Neo4j

Selaras dengan framework Spring Data, Neo4j mendukung perilaku abstraksi repositori Data Spring. Itu berarti mengakses mekanisme persisten yang mendasari diabstraksi di Neo4jRepository bawaan di mana proyek dapat secara langsung memperluasnya dan menggunakan operasi yang disediakan di luar kotak.

Repositori dapat dikembangkan dengan metode finder yang dianotasi, dinamai, atau diturunkan. Dukungan untuk Repositori Neo4j Spring Data juga didasarkan pada Neo4jTemplate , jadi fungsionalitas dasarnya sama.

4.1. Membuat MovieRepository & PersonRepository

Kami menggunakan dua repositori dalam tutorial ini untuk persistensi 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 bisa, repositori berisi beberapa operasi kustom serta operasi standar yang diwarisi dari kelas dasar.

Selanjutnya kita memiliki PersonRepository yang lebih sederhana , yang hanya memiliki operasi standar:

@Repository public interface PersonRepository extends Neo4jRepository  { // }

Anda mungkin telah memperhatikan bahwa PersonRepository hanyalah antarmuka Data Musim Semi standar. Ini karena, dalam contoh sederhana ini, pada dasarnya cukup menggunakan operasi bawaan karena set operasi kami terkait dengan entitas Film . Namun Anda selalu dapat menambahkan operasi kustom di sini yang dapat menggabungkan satu / beberapa operasi inbuilt.

4.2. Mengonfigurasi Repositori Neo4j

Sebagai langkah selanjutnya, kita harus memberi tahu Spring tentang repositori relevan yang menunjukkannya di kelas Neo4jConfiguration yang dibuat di bagian 3:

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

5. Model Data Lengkap

Kami sudah mulai melihat model datanya, jadi sekarang mari kita paparkan semuanya - Film, Peran, dan Orang secara lengkap . The Orang entitas referensi yang Film entitas melalui Peran 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 kita telah memberi anotasi Film dengan @NodeEntity untuk menunjukkan bahwa kelas ini secara langsung dipetakan ke node 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 }

Tentu saja, beberapa kelas terakhir ini diberi anotasi serupa dan referensi -film - menghubungkan Orang ke kelas Film dengan hubungan "ACTED_IN".

6. Akses Data Menggunakan MovieRepository

6.1. Menyimpan Objek Film Baru

Mari kita simpan beberapa data - pertama, Film baru, lalu Orang dan tentu saja Peran - 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 Film yang Ada Berdasarkan Judul

Sekarang mari kita verifikasi film yang dimasukkan dengan mengambilnya menggunakan judul yang ditentukan yang merupakan operasi khusus:

Movie result = movieRepository.findByTitle(title);

6.3. Mengambil Objek Film yang Ada dengan Sebagian Judul

Dimungkinkan untuk mencari untuk mencari film yang ada menggunakan bagian dari judul:

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

6.4. Mengambil Semua Film

Semua film dapat diambil sekali dan dapat diperiksa untuk hitungan yang benar:

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

Namun ada sejumlah metode find yang disediakan dengan perilaku default yang berguna untuk persyaratan bea cukai dan tidak semuanya dijelaskan di sini.

6.5. Hitung Objek Film yang Ada

Setelah memasukkan beberapa objek film, kita bisa keluar dari jumlah film:

long movieCount = movieRepository.count();

6.6. Menghapus Film yang Ada

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

Setelah menghapus film yang dimasukkan, kita dapat mencari objek film dan memverifikasi bahwa hasilnya null:

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

6.7. Hapus Semua Data yang Disisipkan

Dimungkinkan untuk menghapus semua elemen dalam database membuat database kosong:

movieRepository.deleteAll();

Hasil dari operasi ini dengan cepat menghapus semua data dari tabel.

7. Kesimpulan

Dalam tutorial ini, kami membahas dasar-dasar Spring Data Neo4j menggunakan contoh yang sangat sederhana.

Namun Neo4j mampu melayani aplikasi yang sangat canggih dan kompleks yang memiliki sekumpulan besar relasi dan jaringan. Dan Spring Data Neo4j juga menawarkan fitur-fitur canggih untuk memetakan kelas entitas beranotasi ke Database Grafik Neo4j.

Penerapan potongan kode dan contoh di atas dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.