Introduksjon til Spring Data Neo4j

1. Oversikt

Denne artikkelen er en introduksjon til Spring Data Neo4j, den populære grafdatabasen.

Spring Data Neo4j muliggjør POJO-basert utvikling for Neo4j Graph Database og bruker velkjente Spring-konsepter, for eksempel malklasser for kjerne-API-bruk, og gir en kommentarbasert programmeringsmodell.

Også mange utviklere vet ikke helt om Neo4j faktisk vil være en god kamp for deres spesifikke behov; her er en solid oversikt over Stackoverflow som diskuterer hvorfor du bruker Neo4j og fordeler og ulemper.

2. Maven-avhengigheter

La oss starte med å erklære Spring Data Neo4j avhengigheter i pom.xml. De nevnte vårmodulene er også nødvendige for Spring Data Neo4j:

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

Disse avhengighetene inkluderer også de nødvendige modulene for testing.

Legg merke til at den siste avhengigheten er brukt som 'test'. Men legg også merke til at du i en virkelig applikasjonsutvikling er mer sannsynlig å ha en full Neo4J-server som kjører.

Hvis vi vil bruke den innebygde serveren, må vi også legge til avhengigheten:

 org.neo4j neo4j-ogm-innebygd-driver 3.1.2 

Vår-data-neo4j, neo4j-ogm-test og neo4j-ogm-innebygd driveravhengighet er tilgjengelig på Maven Central.

3. Neo4Jj-konfigurasjon

Neo4j-konfigurasjonen er veldig rett frem og definerer tilkoblingsinnstillingen for applikasjonen for å koble til serveren. I likhet med de fleste andre fjærdatamodulene, er dette en fjærkonfigurasjon som kan defineres som XML- eller Java-konfigurasjon.

I denne opplæringen bruker vi bare Java-basert konfigurasjon:

offentlig statisk endelig String URL = System.getenv ("NEO4J_URL")! = null? System.getenv ("NEO4J_URL"): "// neo4j: [e-postbeskyttet]: 7474"; @Bean offentlig org.neo4j.ogm.config.Configuration getConfiguration () {return new 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 nevnt ovenfor er konfigurasjonen enkel og inneholder bare to innstillinger. Først - den SessionFactory er refererer til modellene vi opprettet for å representere dataobjektene. Deretter tilkoblingsegenskapene med serverens endepunkter og tilgangsinformasjon.

Neo4j vil utlede førerklassen basert på protokollen til URI, i vårt tilfelle "http".

Vær oppmerksom på at i dette eksemplet er de tilkoblingsrelaterte egenskapene konfigurert direkte til serveren. i en produksjonsapplikasjon bør disse imidlertid være eksternalisert og være en del av standardkonfigurasjonen av prosjektet.

4. Neo4j Repositories

I tråd med Spring Data-rammeverket støtter Neo4j atferden for abstraksjon av Spring Data-arkiv. Det betyr at tilgang til den underliggende vedvarende mekanismen er abstrahert i den innebygde Neo4jRepository der et prosjekt kan utvide det direkte og bruke de medfølgende operasjonene utenom boksen.

Repositoriene kan utvides med merkede, navngitte eller avledede finder-metoder. Støtte for Spring Data Neo4j Repositories er også basert på Neo4jTemplate, så den underliggende funksjonaliteten er identisk.

4.1. Opprette MovieRepository & PersonRepository

Vi bruker to arkiver i denne opplæringen for vedvarende data:

@Repository offentlig grensesnitt MovieRepository utvider Neo4jRepository {Movie findByTitle (@Param ("title") String title); @Query ("MATCH (m: Movie) WHERE m.title = ~ ('(? I). *' + {Title} + '. *') RETURN m") Collection findByTitleContaining (@Param ("title") String tittel); @Query ("MATCH (m: Movie) <- [: ACTED_IN] - (a: Person) RETURN m.title as movie, collect (a.name) as cast LIMIT {limit}") Liste graf (@Param ("limit") int-grense); } 

Som du kan, inneholder depotet noen tilpassede operasjoner, så vel som standardene som er arvet fra basisklassen.

Neste har vi det enklere PersonRepository, som bare har standardoperasjoner:

@Repository offentlig grensesnitt PersonRepository utvider Neo4jRepository {//}

Du har kanskje allerede lagt merke til det PersonRepository er bare standard Spring Data-grensesnitt. Dette er fordi det i dette enkle eksemplet nesten er tilstrekkelig å bruke den innebygde operasjonen i utgangspunktet da vårt operasjonssett er relatert til Film enhet. Du kan imidlertid alltid legge til egendefinerte operasjoner her som kan pakke enkelt / flere innebygde operasjoner.

4.2. Konfigurere Neo4jDatalagre

Som neste trinn må vi gi Spring beskjed om det aktuelle depotet som indikerer det i Neo4jConfiguration klasse opprettet i seksjon 3:

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

5. Fulldatamodellen

Vi begynte allerede å se på datamodellen, så la oss nå legge alt ut - det fulle Film, rolle og Person. De Person enhet refererer til Film enhet gjennom Roll forhold.

@NodeEntity offentlig klassefilm {@Id @GeneratedValue Lang id; privat strengetittel; privat int utgitt; private String tagline; @Relationship (type = "ACTED_IN", direction = Relationship.INCOMING) private Listeroller; // standard konstruktør, getters og setters}

Legg merke til hvordan vi har kommentert Film med @NodeEntity for å indikere at denne klassen er direkte kartlagt 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 listefilmer; // standard konstruktør, getters og setters} @JsonIdentityInfo (generator = JSOGGenerator.class) @RelationshipEntity (type = "ACTED_IN") offentlig klasse rolle {@Id @GeneratedValue Lang id; private Collection-roller; @StartNode privat person person; @EndNode privat filmfilm; // standard konstruktør, getters og setters}

Selvfølgelig er disse siste par klassene tilsvarende kommenterte og -filmene referanse er lenke Person til Film klasse av forholdet "ACTED_IN".

6. Datatilgang ved hjelp av MovieRepository

6.1. Lagre et nytt filmobjekt

La oss lagre litt data - først en ny film, deretter en person og selvfølgelig en rolle - inkludert alle relasjonsdataene vi også har:

Film italianJob = ny film (); italianJob.setTitle ("Den italienske jobben"); italianJob.setReleased (1999); movieRepository.save (italianJob); Personmerke = ny person (); mark.setName ("Mark Wahlberg"); personRepository.save (merke); Rollen charlie = ny rolle (); charlie.setMovie (italianJob); charlie.setPerson (merke); Samling roleNames = nye 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 etter tittel

La oss nå bekrefte den innsatte filmen ved å hente den ved hjelp av den definerte tittelen som er en tilpasset operasjon:

Filmresultat = movieRepository.findByTitle (tittel);

6.3. Henter et eksisterende filmobjekt med en del av tittelen

Det er mulig å søke for å søke i en eksisterende film ved å bruke en del av tittelen:

Samlingsresultat = movieRepository.findByTitleContaining ("italiensk");

6.4. Henter alle filmene

Alle filmene kan hentes en gang og kan kontrolleres for riktig antall:

Samlingsresultat = (Samling) movieRepository.findAll ();

Imidlertid er det mange funnmetoder som leveres med standardadferd som er nyttige for tollkrav, og ikke alle er beskrevet her.

6.5. Telle de eksisterende filmobjektene

Etter å ha satt inn flere filmobjekter, kan vi få spennende filmantall:

lang movieCount = movieRepository.count ();

6.6. Slette en eksisterende film

movieRepository.delete (movieRepository.findByTitle ("Den italienske jobben"));

Etter å ha slettet den innsatte filmen, kan vi søke etter filmobjektet og kontrollere at resultatet er null:

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

6.7. Slett alle innsatte data

Det er mulig å slette alle elementene i databasen og gjøre databasen tom:

movieRepository.deleteAll ();

Resultatet av denne operasjonen fjerner raskt alle data fra en tabell.

7. Konklusjon

I denne opplæringen gikk vi gjennom det grunnleggende om Spring Data Neo4j ved hjelp av et veldig enkelt eksempel.

Imidlertid er Neo4j i stand til å imøtekomme svært avanserte og komplekse applikasjoner med et stort sett med relasjoner og nettverk. Og Spring Data Neo4j tilbyr også avanserte funksjoner for å kartlegge merkede entitetsklasser til Neo4j-grafdatabasen.

Implementeringen av de ovennevnte kodebitene og eksemplene finnes i GitHub-prosjektet - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


$config[zx-auto] not found$config[zx-overlay] not found