diff --git a/spring-data-neo4j/pom.xml b/spring-data-neo4j/pom.xml
index 72e17250db..320b6ce019 100644
--- a/spring-data-neo4j/pom.xml
+++ b/spring-data-neo4j/pom.xml
@@ -8,12 +8,20 @@
jar
+ 1.8
UTF-8
- 4.2.5.RELEASE
- 4.0.0.RELEASE
- 0.8.0
+ UTF-8
+ 3.0.1
+ 4.1.1.RELEASE
+ Hopper-SR1
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.3.0.RELEASE
+
+
org.springframework.data
@@ -22,15 +30,8 @@
- org.springframework
- spring-core
- ${spring.version}
-
-
-
- org.springframework
- spring-context
- ${spring.version}
+ org.springframework.boot
+ spring-boot-starter-data-rest
@@ -40,23 +41,95 @@
compile
+
+
+
- log4j
- log4j
- 1.2.16
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+ org.springframework.data
+ spring-data-neo4j
+ ${spring-data-neo4j.version}
+ test-jar
+
+
+
+ org.neo4j
+ neo4j-kernel
+ ${neo4j.version}
+ test-jar
+
+
+
+ org.neo4j.app
+ neo4j-server
+ ${neo4j.version}
+ test-jar
+
+
+
+ org.neo4j
+ neo4j-ogm-test
+ 2.0.2
+ test
+
+
+
+ org.neo4j.test
+ neo4j-harness
+ ${neo4j.version}
+ test
+
+
+ junit
+ junit
+ 4.12
+
junit
junit
4.12
-
org.springframework
spring-test
- ${spring.version}
+ 4.2.3.RELEASE
+
-
+
+
+
+
+ maven-compiler-plugin
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
+ spring-milestones
+ http://repo.spring.io/libs-snapshot
+
+ true
+
+
+
+
+
+ spring-milestones
+ http://repo.spring.io/libs-snapshot
+
+ true
+
+
+
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/LibraryNeo4jConfiguration.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/LibraryNeo4jConfiguration.java
deleted file mode 100644
index c497c944d1..0000000000
--- a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/LibraryNeo4jConfiguration.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.baeldung.spring.data.neo4j.config;
-
-
-import org.neo4j.ogm.session.SessionFactory;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-import org.springframework.data.neo4j.config.Neo4jConfiguration;
-import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
-import org.springframework.data.neo4j.server.Neo4jServer;
-import org.springframework.data.neo4j.server.RemoteServer;
-import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-
-@Configuration
-@ComponentScan("com.baeldung.spring.data.neo4j")
-@EnableNeo4jRepositories(basePackages = "com.baeldung.spring.data.neo4j.repostory")
-public class LibraryNeo4jConfiguration extends Neo4jConfiguration {
-
- public static final String URL = System.getenv("NEO4J_URL") != null ? System.getenv("NEO4J_URL") : "http://localhost:7474";
-
- @Override
- public Neo4jServer neo4jServer() {
- return new RemoteServer(URL,"neo4j","password");
- }
-
- @Override
- public SessionFactory getSessionFactory() {
- return new SessionFactory("com.baeldung.spring.data.neo4j.model");
- }
-}
\ No newline at end of file
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java
new file mode 100644
index 0000000000..6e57eb1f36
--- /dev/null
+++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.java
@@ -0,0 +1,38 @@
+package com.baeldung.spring.data.neo4j.config;
+
+import org.neo4j.ogm.session.SessionFactory;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.neo4j.config.Neo4jConfiguration;
+import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@EnableTransactionManagement
+@EnableScheduling
+@EnableAutoConfiguration
+@ComponentScan(basePackages = {"com.baeldung.spring.data.neo4j.services"})
+@Configuration
+@EnableNeo4jRepositories(basePackages = "com.baeldung.spring.data.neo4j.repostory")
+public class MovieDatabaseNeo4jConfiguration extends Neo4jConfiguration {
+
+ 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() {
+ org.neo4j.ogm.config.Configuration config = new org.neo4j.ogm.config.Configuration();
+ config
+ .driverConfiguration()
+ .setDriverClassName("org.neo4j.ogm.drivers.http.driver.HttpDriver")
+ .setURI(URL);
+ return config;
+ }
+
+ @Override
+ public SessionFactory getSessionFactory() {
+ return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain");
+ }
+}
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java
new file mode 100644
index 0000000000..2b6394184d
--- /dev/null
+++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jTestConfiguration.java
@@ -0,0 +1,34 @@
+package com.baeldung.spring.data.neo4j.config;
+
+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.config.Neo4jConfiguration;
+import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
+import org.springframework.data.neo4j.server.Neo4jServer;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@EnableTransactionManagement
+@ComponentScan(basePackages = {"com.baeldung.spring.data.neo4j.services"})
+@Configuration
+@EnableNeo4jRepositories(basePackages = "com.baeldung.spring.data.neo4j.repostory")
+@Profile({"embedded", "test"})
+public class MovieDatabaseNeo4jTestConfiguration extends Neo4jConfiguration {
+
+ @Bean
+ public org.neo4j.ogm.config.Configuration getConfiguration() {
+ org.neo4j.ogm.config.Configuration config = new org.neo4j.ogm.config.Configuration();
+ config
+ .driverConfiguration()
+ .setDriverClassName("org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver");
+ return config;
+ }
+
+ @Override
+ public SessionFactory getSessionFactory() {
+ return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain");
+ }
+}
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java
new file mode 100644
index 0000000000..8d68b69c05
--- /dev/null
+++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java
@@ -0,0 +1,63 @@
+package com.baeldung.spring.data.neo4j.domain;
+
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.voodoodyne.jackson.jsog.JSOGGenerator;
+import org.neo4j.ogm.annotation.GraphId;
+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 {
+ @GraphId
+ Long id;
+
+ private String title;
+
+ private int released;
+ private String tagline;
+
+ @Relationship(type="ACTED_IN", direction = Relationship.INCOMING) private List roles;
+
+// end::movie[]
+
+ 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/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Person.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Person.java
new file mode 100644
index 0000000000..d96dc07530
--- /dev/null
+++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Person.java
@@ -0,0 +1,50 @@
+package com.baeldung.spring.data.neo4j.domain;
+
+
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.voodoodyne.jackson.jsog.JSOGGenerator;
+import org.neo4j.ogm.annotation.GraphId;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.List;
+
+@JsonIdentityInfo(generator=JSOGGenerator.class)
+@NodeEntity
+public class Person {
+ @GraphId
+ 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/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Role.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Role.java
new file mode 100644
index 0000000000..20512a10ad
--- /dev/null
+++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Role.java
@@ -0,0 +1,50 @@
+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.GraphId;
+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 {
+ @GraphId
+ 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/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/model/Book.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/model/Book.java
deleted file mode 100644
index 2c643a4b7c..0000000000
--- a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/model/Book.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.baeldung.spring.data.neo4j.model;
-
-import org.neo4j.graphdb.Direction;
-import org.neo4j.ogm.annotation.*;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicLong;
-
-@NodeEntity
-public class Book {
-
- private static final AtomicLong TS = new AtomicLong();
-
- @GraphId
- private Long id;
- private String title;
- private int released;
-
- @Relationship(type="AUTHORED_BY", direction = Relationship.INCOMING)
- private Person person;
-
- public Book() {
- this.id = TS.getAndIncrement();
- }
-
- public Long getId() {
- return id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public int getReleased() {
- return released;
- }
-
- public void setReleased(int released) {
- this.released = released;
- }
-
- public Person getPerson() {
- return person;
- }
-
- public void setPerson(Person person) {
- this.person = person;
- }
-}
\ No newline at end of file
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/model/Person.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/model/Person.java
deleted file mode 100644
index 53444c8f6c..0000000000
--- a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/model/Person.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.baeldung.spring.data.neo4j.model;
-
-import org.neo4j.ogm.annotation.*;
-
-import java.util.List;
-import java.util.concurrent.atomic.AtomicLong;
-
-@NodeEntity
-public class Person {
-
- private static final AtomicLong TS = new AtomicLong();
-
- @GraphId
- private Long id;
- private String name;
- private int born;
-
- @Relationship(type = "AUTHORED_BY")
- private List books;
-
- public Person() {
- this.id = TS.incrementAndGet();
- }
-
- public Long getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int getBorn() {
- return born;
- }
-
- public void setBorn(int born) {
- this.born = born;
- }
-
- public List getBooks() {
- return books;
- }
-
- public void setBooks(List books) {
- this.books = books;
- }
-}
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/BookRepository.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/BookRepository.java
deleted file mode 100644
index c76d2862fc..0000000000
--- a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/BookRepository.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.baeldung.spring.data.neo4j.repostory;
-
-import com.baeldung.spring.data.neo4j.model.Book;
-import org.springframework.data.neo4j.annotation.Query;
-import org.springframework.data.neo4j.repository.GraphRepository;
-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 BookRepository extends GraphRepository {
-
-}
\ No newline at end of file
diff --git a/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java
new file mode 100644
index 0000000000..3c5953eff3
--- /dev/null
+++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java
@@ -0,0 +1,25 @@
+package com.baeldung.spring.data.neo4j.repostory;
+
+import com.baeldung.spring.data.neo4j.domain.Movie;
+import org.springframework.data.neo4j.annotation.Query;
+import org.springframework.data.neo4j.repository.GraphRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.data.rest.core.annotation.RepositoryRestResource;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+
+@RepositoryRestResource(collectionResourceRel = "movies", path = "movies")
+public interface MovieRepository extends GraphRepository {
+ 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