Introduktion til Spring Data Neo4j

1. Oversigt

Denne artikel er en introduktion til Spring Data Neo4j, den populære grafdatabase.

Spring Data Neo4j muliggør POJO-baseret udvikling til Neo4j-grafdatabasen og bruger velkendte Spring-koncepter såsom skabelonklasser til kernen i API-brug og giver en annotationsbaseret programmeringsmodel.

En masse udviklere ved heller ikke rigtig, om Neo4j rent faktisk vil være et godt match for deres specifikke behov; her er en solid oversigt over Stackoverflow, der diskuterer, hvorfor man bruger Neo4j og fordele og ulemper.

2. Maven-afhængigheder

Lad os starte med at erklære Spring Data Neo4j afhængigheder i pom.xml. De nedenstående fjedermoduler er også påkrævet til Spring Data Neo4j:

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

Disse afhængigheder inkluderer også de nødvendige moduler til test.

Bemærk, at den sidste afhængighed er omfattet som 'test'. Men bemærk også, at du i en rigtig verden applikationsudvikling mere sandsynligt har en fuld Neo4J-server kørende.

Hvis vi vil bruge den integrerede server, skal vi også tilføje afhængigheden:

 org.neo4j neo4j-ogm-embedded-driver 3.1.2 

Spring-data-neo4j, neo4j-ogm-test og neo4j-ogm-embedded-driver afhængigheder er tilgængelige på Maven Central.

3. Neo4Jj-konfiguration

Neo4j-konfigurationen er meget ligetil og definerer forbindelsesindstillingen for applikationen til at oprette forbindelse til serveren. I lighed med de fleste andre fjederdatamoduler er dette en fjederkonfiguration, der kan defineres som XML- eller Java-konfiguration.

I denne vejledning bruger vi kun Java-baseret konfiguration:

offentlig statisk endelig String URL = System.getenv ("NEO4J_URL")! = null? System.getenv ("NEO4J_URL"): "// neo4j: [e-mailbeskyttet]: 7474"; @Bean offentlig org.neo4j.ogm.config.Configuration getConfiguration () {returner ny Builder (). Uri (URL) .build (); } @Bean offentlig SessionFactory getSessionFactory () {returner ny SessionFactory (getConfiguration (), "com.baeldung.spring.data.neo4j.domain"); } @Bean public Neo4jTransactionManager transactionManager () {returner ny Neo4jTransactionManager (getSessionFactory ()); }

Som nævnt ovenfor er konfigurationen enkel og indeholder kun to indstillinger. Først - den SessionFactory er der henviser til de modeller, som vi oprettede for at repræsentere dataobjekterne. Derefter forbindelsesegenskaberne med serverens slutpunkter og adgangsoplysninger.

Neo4j vil udlede førerklassen baseret på URI-protokollen, i vores tilfælde "http".

Bemærk, at i dette eksempel er de forbindelsesrelaterede egenskaber konfigureret direkte til serveren; i en produktionsapplikation skal disse dog være eksternaliseret korrekt og være en del af projektets standardkonfiguration.

4. Neo4j-arkiver

Tilpasning til Spring Data-rammen understøtter Neo4j Spring Data-arkivets abstraktionsadfærd. Det betyder, at adgang til den underliggende vedvarende mekanisme er abstraheret i den indbyggede Neo4jRepository hvor et projekt direkte kan udvide det og bruge de leverede operationer uden for kassen.

Opbevaringsstederne kan udvides ved hjælp af annoterede, navngivne eller afledte finder-metoder. Understøttelse af Spring Data Neo4j Repositories er også baseret på Neo4jTemplate, så den underliggende funktionalitet er identisk.

4.1. Oprettelse af MovieRepository & Personopbevaring

Vi bruger to opbevaringssteder i denne vejledning til vedholdenhed af data:

@Repository offentlig grænseflade MovieRepository udvider Neo4jRepository {Movie findByTitle (@Param ("title") String title); @Query ("MATCH (m: Movie) WHERE m.title = ~ ('(? I). *' + {Title} + '. *') RETURN m") Samling findByTitleContaining (@Param ("title") String titel); @Query ("MATCH (m: Film) <- [: ACTED_IN] - (a: Person) TILBAGE m.titel som film, saml (a.name) som rollebesætning LIMIT {limit}") Liste graf (@Param ("grænse") int-grænse); } 

Som du kan, indeholder lageret nogle brugerdefinerede operationer såvel som de standarder, der er arvet fra basisklassen.

Dernæst har vi det enklere Personopbevaring, der netop har standardoperationer:

@Repository offentlig grænseflade PersonRepository udvider Neo4jRepository {//}

Det har du måske allerede bemærket Personopbevaring er bare standard Spring Data interface. Dette skyldes, at det i dette enkle eksempel er næsten tilstrækkeligt at bruge de indbyggede operationer grundlæggende, da vores operationssæt er relateret til Film enhed. Du kan dog altid tilføje brugerdefinerede operationer her, som kan pakke enkelt / flere indbyggede operationer.

4.2. Konfiguration af Neo4jOpbevaringssteder

Som det næste trin er vi nødt til at lade Spring kende det relevante lager, der angiver det i Neo4jConfiguration klasse oprettet i afsnit 3:

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

5. Den fulde datamodel

Vi begyndte allerede at se på datamodellen, så lad os nu lægge det hele ud - det fulde Film, rolle og Person. Det Person enhed henviser til Film enhed gennem Rolle forhold.

@NodeEntity offentlig klassefilm {@Id @GeneratedValue Lang id; privat streng titel; privat int frigivet; private String tagline; @Relationship (type = "ACTED_IN", retning = Relationship.INCOMING) private Roller; // standard konstruktør, getters og setter}

Læg mærke til, hvordan vi har kommenteret Film med @NodeEntity for at angive, at denne klasse er kortlagt direkte til en node i Neo4j.

@JsonIdentityInfo (generator = JSOGGenerator.class) @NodeEntity offentlig klasse Person {@Id @GeneratedValue Lang id; privat strengnavn; privat int født @Relationship (type = "ACTED_IN") private listefilm; // standardkonstruktør, getters og settere} @JsonIdentityInfo (generator = JSOGGenerator.class) @RelationshipEntity (type = "ACTED_IN") offentlig klasse rolle {@Id @GeneratedValue Lang id; private indsamlingsroller; @StartNode privat person person; @EndNode privat film film; // standard konstruktør, getters og setter}

Selvfølgelig er disse sidste par klasser tilsvarende kommenteret og -filmene reference er sammenkædning Person til Film klasse af forholdet "ACTED_IN".

6. Dataadgang ved hjælp af MovieRepository

6.1. Gemme et nyt filmobjekt

Lad os gemme nogle data - først en ny film, derefter en person og selvfølgelig en rolle - inklusive alle de forholdsdata, vi også har:

Film italianJob = ny film (); italianJob.setTitle ("Det italienske job"); italianJob.setReleased (1999); movieRepository.save (italianJob); Personmærke = ny person (); mark.setName ("Mark Wahlberg"); personRepository.save (mark); Roll charlie = ny rolle (); charlie.setMovie (italianJob); charlie.setPerson (mærke); Samling roleNames = nyt HashSet (); roleNames.add ("Charlie Croker"); charlie.setRoles (roleNames); Listeroller = ny ArrayList (); roller.add (charlie); italianJob.setRoles (roller); movieRepository.save (italianJob);

6.2. Henter et eksisterende filmobjekt efter titel

Lad os nu kontrollere den indsatte film ved at hente den ved hjælp af den definerede titel, som er en brugerdefineret handling:

Filmresultat = movieRepository.findByTitle (titel);

6.3. Henter et eksisterende filmobjekt med en del af titlen

Det er muligt at søge for at søge i en eksisterende film ved hjælp af en del af titlen:

Samlingsresultat = movieRepository.findByTitleContaining ("italiensk");

6.4. Henter alle film

Alle film kan hentes en gang og kan kontrolleres for det korrekte antal:

Samlingsresultat = (Samling) movieRepository.findAll ();

Der er dog en række findmetoder forsynet med standardadfærd, som er nyttige til toldkrav, og ikke alle er beskrevet her.

6.5. Tæl de eksisterende filmobjekter

Efter indsættelse af flere filmobjekter kan vi få spændende filmantal:

lang movieCount = movieRepository.count ();

6.6. Sletning af en eksisterende film

movieRepository.delete (movieRepository.findByTitle ("Det italienske job"));

Efter sletning af den indsatte film kan vi søge efter filmobjektet og kontrollere, at resultatet er nul:

assertNull (movieRepository.findByTitle ("Det italienske job"));

6.7. Slet alle indsatte data

Det er muligt at slette alle elementerne i databasen, hvilket gør databasen tom:

movieRepository.deleteAll ();

Resultatet af denne operation fjerner hurtigt alle data fra en tabel.

7. Konklusion

I denne vejledning gik vi gennem det grundlæggende i Spring Data Neo4j ved hjælp af et meget simpelt eksempel.

Neo4j er dog i stand til at imødekomme meget avancerede og komplekse applikationer med et stort sæt forbindelser og netværk. Og Spring Data Neo4j tilbyder også avancerede funktioner til at kortlægge annoterede enhedsklasser til Neo4j Graph Database.

Implementeringen af ​​ovenstående kodestykker og eksempler findes i GitHub-projektet - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.