diff --git a/spring-data-neo4j/README.md b/spring-data-neo4j/README.md
new file mode 100644
index 0000000000..e62c69f8b9
--- /dev/null
+++ b/spring-data-neo4j/README.md
@@ -0,0 +1,15 @@
+## Spring Data Neo4j
+
+### Relevant Articles:
+- [Introduction to Spring Data Neo4j](http://www.baeldung.com/spring-data-neo4j-tutorial)
+
+### Build the Project with Tests Running
+```
+mvn clean install
+```
+
+### Run Tests Directly
+```
+mvn test
+```
+
diff --git a/spring-data-neo4j/pom.xml b/spring-data-neo4j/pom.xml
new file mode 100644
index 0000000000..a5a2e9220a
--- /dev/null
+++ b/spring-data-neo4j/pom.xml
@@ -0,0 +1,93 @@
+
+
+ 4.0.0
+ com.baeldung
+ spring-data-neo4j
+ 1.0
+ jar
+
+
+ 1.8
+ UTF-8
+ UTF-8
+ 3.0.1
+ 4.1.1.RELEASE
+
+
+
+
+ org.springframework.data
+ spring-data-neo4j
+ ${spring-data-neo4j.version}
+
+
+
+ com.voodoodyne.jackson.jsog
+ jackson-jsog
+ 1.1
+ compile
+
+
+
+ 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
+
+
+ org.springframework
+ spring-test
+ 4.2.3.RELEASE
+
+
+
+
+
+
+
+ maven-compiler-plugin
+
+
+
+
+
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..ac9a7260be
--- /dev/null
+++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/config/MovieDatabaseNeo4jConfiguration.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.data.neo4j.config.Neo4jConfiguration;
+import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@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..e48dfaf276
--- /dev/null
+++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/domain/Movie.java
@@ -0,0 +1,61 @@
+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;
+
+ 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/repostory/MovieRepository.java b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java
new file mode 100644
index 0000000000..850d2336ba
--- /dev/null
+++ b/spring-data-neo4j/src/main/java/com/baeldung/spring/data/neo4j/repostory/MovieRepository.java
@@ -0,0 +1,24 @@
+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.stereotype.Repository;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+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