diff --git a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java b/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java deleted file mode 100644 index 8591dd3a8d..0000000000 --- a/persistence-modules/neo4j/src/test/java/com/baeldung/neo4j/Neo4jLiveTest.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.baeldung.neo4j; - - -import static org.neo4j.configuration.GraphDatabaseSettings.DEFAULT_DATABASE_NAME; - -import java.io.File; -import java.time.Duration; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.neo4j.configuration.GraphDatabaseSettings; -import org.neo4j.dbms.api.DatabaseManagementService; -import org.neo4j.dbms.api.DatabaseManagementServiceBuilder; -import org.neo4j.graphdb.GraphDatabaseService; -import org.neo4j.graphdb.Label; -import org.neo4j.graphdb.Node; -import org.neo4j.graphdb.NotFoundException; -import org.neo4j.graphdb.RelationshipType; -import org.neo4j.graphdb.Result; -import org.neo4j.graphdb.Transaction; - -/** - * To run this test you will need to have an instance of the docker running on your machine (Docker desktop - for Windows and Docker instance for linux) - * After your docker instance is up run this test - */ -public class Neo4jLiveTest { - - private static GraphDatabaseService graphDb; - private static Transaction transaction; - private static DatabaseManagementService managementService; - - @Before - public void setUp() { - managementService = new DatabaseManagementServiceBuilder(new File("data/cars").toPath()) - .setConfig( GraphDatabaseSettings.transaction_timeout, Duration.ofSeconds( 60 ) ) - .setConfig( GraphDatabaseSettings.preallocate_logical_logs, false ).build(); - graphDb = managementService.database( DEFAULT_DATABASE_NAME ); - } - - @After - public void tearDown() { - managementService.shutdown(); - } - - @Test - public void testPersonCar() { - transaction = graphDb.beginTx(); - Node car = transaction.createNode(Label.label("Car")); - car.setProperty("make", "tesla"); - car.setProperty("model", "model3"); - - Node owner = transaction.createNode(Label.label("Person")); - owner.setProperty("firstName", "baeldung"); - owner.setProperty("lastName", "baeldung"); - - owner.createRelationshipTo(car, RelationshipType.withName("owner")); - - Result result = transaction.execute("MATCH (c:Car) <-[owner]- (p:Person) " + - "WHERE c.make = 'tesla'" + - "RETURN p.firstName, p.lastName"); - - Map firstResult = result.next(); - - Assert.assertEquals("baeldung", firstResult.get("p.firstName")); - } - - @Test - public void testCreateNode() { - transaction = graphDb.beginTx(); - Result result = transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"})" + - "RETURN baeldung"); - - Map firstResult = result.next(); - Node firstNode = (Node) firstResult.get("baeldung"); - - Assert.assertEquals(firstNode.getProperty("name"), "Baeldung"); - } - - @Test - public void testCreateNodeAndLink() { - transaction = graphDb.beginTx(); - Result result = transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + - "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + - "RETURN baeldung, tesla"); - - Map firstResult = result.next(); - - Assert.assertTrue(firstResult.containsKey("baeldung")); - Assert.assertTrue(firstResult.containsKey("tesla")); - } - - @Test - public void testFindAndReturn() { - transaction = graphDb.beginTx(); - transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + - "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + - "RETURN baeldung, tesla"); - - Result result = transaction.execute("MATCH (company:Company)-[:owns]-> (car:Car)" + - "WHERE car.make='tesla' and car.model='modelX'" + - "RETURN company.name"); - - Map firstResult = result.next(); - - Assert.assertEquals(firstResult.get("company.name"), "Baeldung"); - } - - @Test - public void testUpdate() { - transaction = graphDb.beginTx(); - transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + - "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + - "RETURN baeldung, tesla"); - - Result result = transaction.execute("MATCH (car:Car)" + - "WHERE car.make='tesla'" + - " SET car.milage=120" + - " SET car :Car:Electro" + - " SET car.model=NULL" + - " RETURN car"); - - Map firstResult = result.next(); - Node car = (Node) firstResult.get("car"); - - Assert.assertEquals(car.getProperty("milage"), 120L); - Assert.assertEquals(car.getLabels(), Arrays.asList(Label.label("Car"), Label.label("Electro"))); - - try { - car.getProperty("model"); - Assert.fail(); - } catch (NotFoundException e) { - // expected - } - } - - @Test - public void testDelete() { - transaction = graphDb.beginTx(); - transaction.execute("CREATE (baeldung:Company {name:\"Baeldung\"}) " + - "-[:owns]-> (tesla:Car {make: 'tesla', model: 'modelX'})" + - "RETURN baeldung, tesla"); - - transaction.execute("MATCH (company:Company)" + - " WHERE company.name='Baeldung'" + - " DELETE company"); - - Result result = transaction.execute("MATCH (company:Company)" + - " WHERE company.name='Baeldung'" + - " RETURN company"); - - Assert.assertFalse(result.hasNext()); - } - - @Test - public void testBindings() { - transaction = graphDb.beginTx(); - Map params = new HashMap<>(); - params.put("name", "baeldung"); - params.put("make", "tesla"); - params.put("model", "modelS"); - - Result result = transaction.execute("CREATE (baeldung:Company {name:$name}) " + - "-[:owns]-> (tesla:Car {make: $make, model: $model})" + - "RETURN baeldung, tesla", params); - - Map firstResult = result.next(); - Assert.assertTrue(firstResult.containsKey("baeldung")); - Assert.assertTrue(firstResult.containsKey("tesla")); - - Node car = (Node) firstResult.get("tesla"); - Assert.assertEquals(car.getProperty("model"), "modelS"); - } -} diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index 33f2966db3..8a0a9ff464 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -15,53 +15,39 @@ - org.neo4j - neo4j-ogm-embedded-driver - ${neo4j-ogm.version} + org.neo4j.test + neo4j-harness + ${neo4j-harness.version} + test - org.springframework.data - spring-data-neo4j - ${spring-data-neo4j.version} - - - com.voodoodyne.jackson.jsog - jackson-jsog - ${jackson-jsog.version} - compile + org.springframework.boot + spring-boot-starter-data-neo4j + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-logging + + org.springframework.boot spring-boot-starter-test ${spring-boot.version} test - - - org.neo4j - neo4j-ogm-test - ${neo4j-ogm.version} - test - - - org.neo4j.test - neo4j-harness - ${neo4j.version} - test - - - org.springframework - spring-test - ${spring-test.version} + + + org.springframework.boot + spring-boot-starter-logging + + - 3.4.6 - 5.0.1.RELEASE - 1.1 - 2.0.1.RELEASE - 5.0.1.RELEASE - 3.1.2 + 2.7.14 + 5.10.0 \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/Neo4JApplication.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/Neo4JApplication.java new file mode 100644 index 0000000000..8e1f104be5 --- /dev/null +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/Neo4JApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.spring.data.neo4j; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Neo4JApplication { + + public static void main(String[] args) { + SpringApplication.run(Neo4JApplication.class, args); + } +} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java deleted file mode 100644 index 4e87c24614..0000000000 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.spring.data.neo4j.config; - -import org.neo4j.ogm.config.Configuration.Builder; -import org.neo4j.ogm.session.SessionFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories; - -@ComponentScan(basePackages = { "com.baeldung.spring.data.neo4j.services" }) -@Configuration -@EnableNeo4jRepositories(basePackages = "com.baeldung.spring.data.neo4j.repository") -public class MovieDatabaseNeo4jConfiguration { - - public static final String URL = System.getenv("NEO4J_URL") != null ? System.getenv("NEO4J_URL") : "http://neo4j:movies@localhost: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"); - } -} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java deleted file mode 100644 index a4cbe4b809..0000000000 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.spring.data.neo4j.config; - -import org.neo4j.ogm.config.Configuration.Builder; -import org.neo4j.ogm.session.SessionFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories; -import org.springframework.data.neo4j.transaction.Neo4jTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@Configuration -@EnableTransactionManagement -@ComponentScan(basePackages = { "com.baeldung.spring.data.neo4j.services" }) -@EnableNeo4jRepositories(basePackages = "com.baeldung.spring.data.neo4j.repository") -@Profile({ "embedded", "test" }) -public class MovieDatabaseNeo4jTestConfiguration { - - @Bean - public org.neo4j.ogm.config.Configuration getConfiguration() { - org.neo4j.ogm.config.Configuration config = new Builder().build(); - return config; - } - - @Bean - public SessionFactory getSessionFactory() { - return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain"); - } - - @Bean - public Neo4jTransactionManager transactionManager() { - return new Neo4jTransactionManager(getSessionFactory()); - } - -} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/Neo4jConfig.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/Neo4jConfig.java new file mode 100644 index 0000000000..7571d01c68 --- /dev/null +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/Neo4jConfig.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.data.neo4j.config; + +import org.neo4j.cypherdsl.core.renderer.Dialect; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class Neo4jConfig { + @Bean + org.neo4j.cypherdsl.core.renderer.Configuration cypherDslConfiguration() { + return org.neo4j.cypherdsl.core.renderer.Configuration.newConfig() + .withDialect(Dialect.NEO4J_5).build(); + } +} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Author.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Author.java new file mode 100644 index 0000000000..69f035dcae --- /dev/null +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Author.java @@ -0,0 +1,48 @@ +package com.baeldung.spring.data.neo4j.domain; + + +import org.springframework.data.neo4j.core.schema.Id; +import org.springframework.data.neo4j.core.schema.Node; +import org.springframework.data.neo4j.core.schema.Relationship; + +import java.util.List; + +@Node("Author") +public class Author { + @Id + private Long id; + + private String name; + + @Relationship(type = "WRITTEN_BY", direction = Relationship.Direction.INCOMING) + private List books; + + public Author(Long id, String name) { + this.id = id; + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getBooks() { + return books; + } + + public void setBooks(List books) { + this.books = books; + } +} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Book.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Book.java new file mode 100644 index 0000000000..4e6aff6798 --- /dev/null +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Book.java @@ -0,0 +1,58 @@ +package com.baeldung.spring.data.neo4j.domain; + +import org.springframework.data.neo4j.core.schema.Id; +import org.springframework.data.neo4j.core.schema.Node; +import org.springframework.data.neo4j.core.schema.Property; +import org.springframework.data.neo4j.core.schema.Relationship; + +@Node("Book") +public class Book { + @Id + private String isbn; + + @Property("name") + private String title; + + private Integer year; + + @Relationship(type = "WRITTEN_BY", direction = Relationship.Direction.OUTGOING) + private Author author; + + public Book(String isbn, String title, Integer year) { + this.isbn = isbn; + this.title = title; + this.year = year; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer getYear() { + return year; + } + + public void setYear(Integer year) { + this.year = year; + } + + public Author getAuthor() { + return author; + } + + public void setAuthor(Author author) { + this.author = author; + } +} \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java deleted file mode 100644 index 455407a92b..0000000000 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Car.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.spring.data.neo4j.domain; - -import org.neo4j.ogm.annotation.GeneratedValue; -import org.neo4j.ogm.annotation.Id; -import org.neo4j.ogm.annotation.NodeEntity; -import org.neo4j.ogm.annotation.Relationship; - -@NodeEntity -public class Car { - @Id @GeneratedValue - private Long id; - - private String make; - - @Relationship(direction = "INCOMING") - private Company company; - - public Car(String make, String model) { - this.make = make; - this.model = model; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getMake() { - return make; - } - - public void setMake(String make) { - this.make = make; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - private String model; -} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Company.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Company.java deleted file mode 100644 index 4422ade44f..0000000000 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Company.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.spring.data.neo4j.domain; - -import org.neo4j.ogm.annotation.NodeEntity; -import org.neo4j.ogm.annotation.Relationship; - -@NodeEntity -public class Company { - private Long id; - - private String name; - - @Relationship(type="owns") - private Car car; - - public Company(String name) { - this.name = name; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Car getCar() { - return car; - } - - public void setCar(Car car) { - this.car = car; - } -} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java deleted file mode 100644 index 996a661b07..0000000000 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.baeldung.spring.data.neo4j.domain; - -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.voodoodyne.jackson.jsog.JSOGGenerator; - -import org.neo4j.ogm.annotation.GeneratedValue; -import org.neo4j.ogm.annotation.Id; -import org.neo4j.ogm.annotation.NodeEntity; -import org.neo4j.ogm.annotation.Relationship; - -import java.util.Collection; -import java.util.List; - -@JsonIdentityInfo(generator = JSOGGenerator.class) - -@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; - - public Movie() { - } - - public String getTitle() { - return title; - } - - public int getReleased() { - return released; - } - - public String getTagline() { - return tagline; - } - - public Collection getRoles() { - return roles; - } - - public void setTitle(String title) { - this.title = title; - } - - public void setReleased(int released) { - this.released = released; - } - - public void setTagline(String tagline) { - this.tagline = tagline; - } - - public void setRoles(List roles) { - this.roles = roles; - } - -} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Person.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Person.java deleted file mode 100644 index 453ca1c3f3..0000000000 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Person.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.spring.data.neo4j.domain; - -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.voodoodyne.jackson.jsog.JSOGGenerator; - -import org.neo4j.ogm.annotation.GeneratedValue; -import org.neo4j.ogm.annotation.Id; -import org.neo4j.ogm.annotation.NodeEntity; -import org.neo4j.ogm.annotation.Relationship; - -import java.util.List; - -@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; - - public Person() { - } - - public String getName() { - return name; - } - - public int getBorn() { - return born; - } - - public List getMovies() { - return movies; - } - - public void setName(String name) { - this.name = name; - } - - public void setBorn(int born) { - this.born = born; - } - - public void setMovies(List movies) { - this.movies = movies; - } - -} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Role.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Role.java deleted file mode 100644 index 5a18837dae..0000000000 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Role.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.spring.data.neo4j.domain; - -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.voodoodyne.jackson.jsog.JSOGGenerator; -import org.neo4j.ogm.annotation.EndNode; -import org.neo4j.ogm.annotation.GeneratedValue; -import org.neo4j.ogm.annotation.Id; -import org.neo4j.ogm.annotation.RelationshipEntity; -import org.neo4j.ogm.annotation.StartNode; - -import java.util.Collection; - -@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; - - public Role() { - } - - public Collection getRoles() { - return roles; - } - - public Person getPerson() { - return person; - } - - public Movie getMovie() { - return movie; - } - - public void setRoles(Collection roles) { - this.roles = roles; - } - - public void setPerson(Person person) { - this.person = person; - } - - public void setMovie(Movie movie) { - this.movie = movie; - } -} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/AuthorRepository.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/AuthorRepository.java new file mode 100644 index 0000000000..16949dfeef --- /dev/null +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/AuthorRepository.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.data.neo4j.repository; + +import com.baeldung.spring.data.neo4j.domain.Author; +import com.baeldung.spring.data.neo4j.domain.Book; +import org.springframework.data.neo4j.repository.Neo4jRepository; +import org.springframework.data.neo4j.repository.query.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface AuthorRepository extends Neo4jRepository { + @Query("MATCH (b:Book)-[:WRITTEN_BY]->(a:Author) WHERE a.name = $name AND b.year > $year RETURN b") + List findBooksAfterYear(@Param("name") String name, @Param("year") Integer year); +} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/BookRepository.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/BookRepository.java new file mode 100644 index 0000000000..0489ff3c30 --- /dev/null +++ b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/BookRepository.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.data.neo4j.repository; + + +import com.baeldung.spring.data.neo4j.domain.Book; +import org.springframework.data.neo4j.repository.Neo4jRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface BookRepository extends Neo4jRepository { + Book findOneByTitle(String title); + List findAllByYear(Integer year); +} \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java deleted file mode 100644 index dde946ea73..0000000000 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/MovieRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.spring.data.neo4j.repository; - -import com.baeldung.spring.data.neo4j.domain.Movie; -import org.springframework.data.neo4j.annotation.Query; -import org.springframework.data.neo4j.repository.Neo4jRepository; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -@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); -} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/PersonRepository.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/PersonRepository.java deleted file mode 100644 index 22094d26b6..0000000000 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repository/PersonRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.spring.data.neo4j.repository; - -import com.baeldung.spring.data.neo4j.domain.Person; -import org.springframework.data.neo4j.repository.Neo4jRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface PersonRepository extends Neo4jRepository { -} diff --git a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java b/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java deleted file mode 100644 index 086bf48bfa..0000000000 --- a/persistence-modules/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/services/MovieService.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung.spring.data.neo4j.services; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.baeldung.spring.data.neo4j.repository.MovieRepository; - -import java.util.*; - -@Service -@Transactional -public class MovieService { - - @Autowired - private MovieRepository movieRepository; - - private Map toD3Format(Iterator> result) { - List> nodes = new ArrayList<>(); - List> rels = new ArrayList<>(); - int i = 0; - while (result.hasNext()) { - Map row = result.next(); - nodes.add(map("title", row.get("movie"), "label", "movie")); - int target = i; - i++; - for (Object name : (Collection) row.get("cast")) { - Map actor = map("title", name, "label", "actor"); - int source = nodes.indexOf(actor); - if (source == -1) { - nodes.add(actor); - source = i++; - } - rels.add(map("source", source, "target", target)); - } - } - return map("nodes", nodes, "links", rels); - } - - private Map map(String key1, Object value1, String key2, Object value2) { - Map result = new HashMap<>(2); - result.put(key1, value1); - result.put(key2, value2); - return result; - } - - public Map graph(int limit) { - Iterator> result = movieRepository.graph(limit).iterator(); - return toD3Format(result); - } -} diff --git a/persistence-modules/spring-data-neo4j/src/main/resources/application.properties b/persistence-modules/spring-data-neo4j/src/main/resources/application.properties new file mode 100644 index 0000000000..6a0b6712fd --- /dev/null +++ b/persistence-modules/spring-data-neo4j/src/main/resources/application.properties @@ -0,0 +1,3 @@ +spring.neo4j.uri=bolt://localhost:7687 +spring.neo4j.authentication.username=neo4j +spring.neo4j.authentication.password=password \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/main/resources/test.png b/persistence-modules/spring-data-neo4j/src/main/resources/test.png deleted file mode 100644 index c3b5e80276..0000000000 Binary files a/persistence-modules/spring-data-neo4j/src/main/resources/test.png and /dev/null differ diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java deleted file mode 100644 index 7029905c49..0000000000 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/SpringContextTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.baeldung.spring.data.neo4j.config.MovieDatabaseNeo4jTestConfiguration; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = MovieDatabaseNeo4jTestConfiguration.class) -@ActiveProfiles(profiles = "test") -public class SpringContextTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/BookAndAuthorRepositoryIntegrationTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/BookAndAuthorRepositoryIntegrationTest.java new file mode 100644 index 0000000000..f08af19825 --- /dev/null +++ b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/BookAndAuthorRepositoryIntegrationTest.java @@ -0,0 +1,69 @@ +package com.baeldung.spring.data.neo4j; + +import com.baeldung.spring.data.neo4j.domain.Book; +import com.baeldung.spring.data.neo4j.repository.AuthorRepository; +import com.baeldung.spring.data.neo4j.repository.BookRepository; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.neo4j.harness.Neo4j; +import org.neo4j.harness.Neo4jBuilders; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; + +import java.util.List; + +@DataNeo4jTest +public class BookAndAuthorRepositoryIntegrationTest { + + private static Neo4j newServer; + + @BeforeAll + static void initializeNeo4j() { + newServer = Neo4jBuilders.newInProcessBuilder() + .withDisabledServer() + .withFixture("CREATE (b:Book {isbn: '978-0547928210', name: 'The Fellowship of the Ring', year: 1954})" + + "-[:WRITTEN_BY]->(a:Author {id: 1, name: 'J. R. R. Tolkien'})" + + "CREATE (b2:Book {isbn: '978-0547928203', name: 'The Two Towers', year: 1956})-[:WRITTEN_BY]->(a)") + .build(); + } + + @AfterAll + static void stopNeo4j() { + newServer.close(); + } + + @DynamicPropertySource + static void neo4jProperties(DynamicPropertyRegistry registry) { + registry.add("spring.neo4j.uri", newServer::boltURI); + registry.add("spring.neo4j.authentication.username", () -> "neo4j"); + registry.add("spring.neo4j.authentication.password", () -> "null"); + } + + @Autowired + private BookRepository bookRepository; + + @Autowired + private AuthorRepository authorRepository; + + @Test + void givenBookExists_whenFindOneByTitle_thenBookIsReturned() { + Book book = bookRepository.findOneByTitle("The Two Towers"); + Assertions.assertEquals("978-0547928203", book.getIsbn()); + } + + @Test + void givenOneBookExistsForYear_whenFindAllByYear_thenOneBookIsReturned() { + List books = bookRepository.findAllByYear(1954); + Assertions.assertEquals(1, books.size()); + } + + @Test + void givenOneBookExistsAfterYear_whenFindBooksAfterYear_thenOneBookIsReturned() { + List books = authorRepository.findBooksAfterYear("J. R. R. Tolkien", 1955); + Assertions.assertEquals(1, books.size()); + } +} \ No newline at end of file diff --git a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java b/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java deleted file mode 100644 index 3d9215f32f..0000000000 --- a/persistence-modules/spring-data-neo4j/src/test/java/com/baeldung/spring/data/neo4j/MovieRepositoryIntegrationTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.baeldung.spring.data.neo4j; - -import com.baeldung.spring.data.neo4j.config.MovieDatabaseNeo4jTestConfiguration; -import com.baeldung.spring.data.neo4j.domain.Movie; -import com.baeldung.spring.data.neo4j.domain.Person; -import com.baeldung.spring.data.neo4j.domain.Role; -import com.baeldung.spring.data.neo4j.repository.MovieRepository; -import com.baeldung.spring.data.neo4j.repository.PersonRepository; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import java.util.*; - -import static junit.framework.TestCase.assertNull; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = MovieDatabaseNeo4jTestConfiguration.class) -@ActiveProfiles(profiles = "test") -public class MovieRepositoryIntegrationTest { - - @Autowired - private MovieRepository movieRepository; - - @Autowired - private PersonRepository personRepository; - - public MovieRepositoryIntegrationTest() { - } - - @Before - public void initializeDatabase() { - System.out.println("seeding embedded database"); - 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); - } - - @Test - @DirtiesContext - public void testFindByTitle() { - System.out.println("findByTitle"); - String title = "The Italian Job"; - Movie result = movieRepository.findByTitle(title); - assertNotNull(result); - assertEquals(1999, result.getReleased()); - } - - @Test - @DirtiesContext - public void testCount() { - System.out.println("count"); - long movieCount = movieRepository.count(); - assertNotNull(movieCount); - assertEquals(1, movieCount); - } - - @Test - @DirtiesContext - public void testFindAll() { - System.out.println("findAll"); - Collection result = (Collection) movieRepository.findAll(); - assertNotNull(result); - assertEquals(1, result.size()); - } - - @Test - @DirtiesContext - public void testFindByTitleContaining() { - System.out.println("findByTitleContaining"); - String title = "Italian"; - Collection result = movieRepository.findByTitleContaining(title); - assertNotNull(result); - assertEquals(1, result.size()); - } - - @Test - @DirtiesContext - public void testGraph() { - System.out.println("graph"); - List> graph = movieRepository.graph(5); - assertEquals(1, graph.size()); - Map map = graph.get(0); - assertEquals(2, map.size()); - String[] cast = (String[]) map.get("cast"); - String movie = (String) map.get("movie"); - assertEquals("The Italian Job", movie); - assertEquals("Mark Wahlberg", cast[0]); - } - - @Test - @DirtiesContext - public void testDeleteMovie() { - System.out.println("deleteMovie"); - movieRepository.delete(movieRepository.findByTitle("The Italian Job")); - assertNull(movieRepository.findByTitle("The Italian Job")); - } - - @Test - @DirtiesContext - public void testDeleteAll() { - System.out.println("deleteAll"); - movieRepository.deleteAll(); - Collection result = (Collection) movieRepository.findAll(); - assertEquals(0, result.size()); - } -} diff --git a/pom.xml b/pom.xml index cd3c6bfa33..17daf26278 100644 --- a/pom.xml +++ b/pom.xml @@ -368,7 +368,6 @@ persistence-modules/hibernate-ogm persistence-modules/java-cassandra persistence-modules/spring-data-cassandra-reactive - persistence-modules/spring-data-neo4j java-nashorn jeromq @@ -545,7 +544,6 @@ persistence-modules/hibernate-ogm persistence-modules/java-cassandra persistence-modules/spring-data-cassandra-reactive - persistence-modules/spring-data-neo4j java-nashorn @@ -940,6 +938,7 @@ image-processing language-interop gradle-modules/gradle/maven-to-gradle + persistence-modules/spring-data-neo4j @@ -1211,6 +1210,7 @@ image-processing language-interop gradle-modules/gradle/maven-to-gradle + persistence-modules/spring-data-neo4j