Skip to content

Commit 1ea5205

Browse files
author
Eugen
authored
Merge pull request #467 from sameira/master
Adding Spring Data Neo4J Code Sample
2 parents 0ab6270 + d4c2d50 commit 1ea5205

13 files changed

Lines changed: 575 additions & 0 deletions

File tree

spring-data-neo4j/README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
## Spring Data Neo4j
2+
3+
### Relevant Articles:
4+
- [Introduction to Spring Data Neo4j](http://www.baeldung.com/spring-data-neo4j-tutorial)
5+
6+
### Build the Project with Tests Running
7+
```
8+
mvn clean install
9+
```
10+
11+
### Run Tests Directly
12+
```
13+
mvn test
14+
```
15+

spring-data-neo4j/pom.xml

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
4+
<modelVersion>4.0.0</modelVersion>
5+
<groupId>com.baeldung</groupId>
6+
<artifactId>spring-data-neo4j</artifactId>
7+
<version>1.0</version>
8+
<packaging>jar</packaging>
9+
10+
<properties>
11+
<java.version>1.8</java.version>
12+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
13+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
14+
<neo4j.version>3.0.1</neo4j.version>
15+
<spring-data-neo4j.version>4.1.1.RELEASE</spring-data-neo4j.version>
16+
</properties>
17+
18+
<dependencies>
19+
<dependency>
20+
<groupId>org.springframework.data</groupId>
21+
<artifactId>spring-data-neo4j</artifactId>
22+
<version>${spring-data-neo4j.version}</version>
23+
</dependency>
24+
25+
<dependency>
26+
<groupId>com.voodoodyne.jackson.jsog</groupId>
27+
<artifactId>jackson-jsog</artifactId>
28+
<version>1.1</version>
29+
<scope>compile</scope>
30+
</dependency>
31+
32+
<dependency>
33+
<groupId>org.springframework.boot</groupId>
34+
<artifactId>spring-boot-starter-test</artifactId>
35+
<scope>test</scope>
36+
</dependency>
37+
38+
<dependency>
39+
<groupId>org.springframework.data</groupId>
40+
<artifactId>spring-data-neo4j</artifactId>
41+
<version>${spring-data-neo4j.version}</version>
42+
<type>test-jar</type>
43+
</dependency>
44+
45+
<dependency>
46+
<groupId>org.neo4j</groupId>
47+
<artifactId>neo4j-kernel</artifactId>
48+
<version>${neo4j.version}</version>
49+
<type>test-jar</type>
50+
</dependency>
51+
52+
<dependency>
53+
<groupId>org.neo4j.app</groupId>
54+
<artifactId>neo4j-server</artifactId>
55+
<version>${neo4j.version}</version>
56+
<type>test-jar</type>
57+
</dependency>
58+
59+
<dependency>
60+
<groupId>org.neo4j</groupId>
61+
<artifactId>neo4j-ogm-test</artifactId>
62+
<version>2.0.2</version>
63+
<scope>test</scope>
64+
</dependency>
65+
66+
<dependency>
67+
<groupId>org.neo4j.test</groupId>
68+
<artifactId>neo4j-harness</artifactId>
69+
<version>${neo4j.version}</version>
70+
<scope>test</scope>
71+
</dependency>
72+
<dependency>
73+
<groupId>junit</groupId>
74+
<artifactId>junit</artifactId>
75+
<version>4.12</version>
76+
</dependency>
77+
<dependency>
78+
<groupId>org.springframework</groupId>
79+
<artifactId>spring-test</artifactId>
80+
<version>4.2.3.RELEASE</version>
81+
</dependency>
82+
83+
</dependencies>
84+
85+
<build>
86+
<plugins>
87+
<plugin>
88+
<artifactId>maven-compiler-plugin</artifactId>
89+
</plugin>
90+
</plugins>
91+
</build>
92+
93+
</project>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.baeldung.spring.data.neo4j.config;
2+
3+
import org.neo4j.ogm.session.SessionFactory;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.ComponentScan;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.data.neo4j.config.Neo4jConfiguration;
8+
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
9+
import org.springframework.scheduling.annotation.EnableScheduling;
10+
import org.springframework.transaction.annotation.EnableTransactionManagement;
11+
12+
13+
@ComponentScan(basePackages = {"com.baeldung.spring.data.neo4j.services"})
14+
@Configuration
15+
@EnableNeo4jRepositories(basePackages = "com.baeldung.spring.data.neo4j.repostory")
16+
public class MovieDatabaseNeo4jConfiguration extends Neo4jConfiguration {
17+
18+
public static final String URL = System.getenv("NEO4J_URL") != null ? System.getenv("NEO4J_URL") : "http://neo4j:movies@localhost:7474";
19+
20+
@Bean
21+
public org.neo4j.ogm.config.Configuration getConfiguration() {
22+
org.neo4j.ogm.config.Configuration config = new org.neo4j.ogm.config.Configuration();
23+
config
24+
.driverConfiguration()
25+
.setDriverClassName("org.neo4j.ogm.drivers.http.driver.HttpDriver")
26+
.setURI(URL);
27+
return config;
28+
}
29+
30+
@Override
31+
public SessionFactory getSessionFactory() {
32+
return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain");
33+
}
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.baeldung.spring.data.neo4j.config;
2+
3+
import org.neo4j.ogm.session.SessionFactory;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.ComponentScan;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.context.annotation.Profile;
8+
import org.springframework.data.neo4j.config.Neo4jConfiguration;
9+
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
10+
import org.springframework.data.neo4j.server.Neo4jServer;
11+
import org.springframework.transaction.annotation.EnableTransactionManagement;
12+
13+
14+
@EnableTransactionManagement
15+
@ComponentScan(basePackages = {"com.baeldung.spring.data.neo4j.services"})
16+
@Configuration
17+
@EnableNeo4jRepositories(basePackages = "com.baeldung.spring.data.neo4j.repostory")
18+
@Profile({"embedded", "test"})
19+
public class MovieDatabaseNeo4jTestConfiguration extends Neo4jConfiguration {
20+
21+
@Bean
22+
public org.neo4j.ogm.config.Configuration getConfiguration() {
23+
org.neo4j.ogm.config.Configuration config = new org.neo4j.ogm.config.Configuration();
24+
config
25+
.driverConfiguration()
26+
.setDriverClassName("org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver");
27+
return config;
28+
}
29+
30+
@Override
31+
public SessionFactory getSessionFactory() {
32+
return new SessionFactory(getConfiguration(), "com.baeldung.spring.data.neo4j.domain");
33+
}
34+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.baeldung.spring.data.neo4j.domain;
2+
3+
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
4+
import com.voodoodyne.jackson.jsog.JSOGGenerator;
5+
import org.neo4j.ogm.annotation.GraphId;
6+
import org.neo4j.ogm.annotation.NodeEntity;
7+
import org.neo4j.ogm.annotation.Relationship;
8+
9+
import java.util.Collection;
10+
import java.util.List;
11+
12+
@JsonIdentityInfo(generator=JSOGGenerator.class)
13+
14+
@NodeEntity
15+
public class Movie {
16+
@GraphId
17+
Long id;
18+
19+
private String title;
20+
21+
private int released;
22+
private String tagline;
23+
24+
@Relationship(type="ACTED_IN", direction = Relationship.INCOMING) private List<Role> roles;
25+
26+
public Movie() { }
27+
28+
public String getTitle() {
29+
return title;
30+
}
31+
32+
public int getReleased() {
33+
return released;
34+
}
35+
36+
public String getTagline() {
37+
return tagline;
38+
}
39+
40+
public Collection<Role> getRoles() {
41+
return roles;
42+
}
43+
44+
public void setTitle(String title) {
45+
this.title = title;
46+
}
47+
48+
public void setReleased(int released) {
49+
this.released = released;
50+
}
51+
52+
public void setTagline(String tagline) {
53+
this.tagline = tagline;
54+
}
55+
56+
public void setRoles(List<Role> roles) {
57+
this.roles = roles;
58+
}
59+
60+
61+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.baeldung.spring.data.neo4j.domain;
2+
3+
4+
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
5+
import com.voodoodyne.jackson.jsog.JSOGGenerator;
6+
import org.neo4j.ogm.annotation.GraphId;
7+
import org.neo4j.ogm.annotation.NodeEntity;
8+
import org.neo4j.ogm.annotation.Relationship;
9+
10+
import java.util.List;
11+
12+
@JsonIdentityInfo(generator=JSOGGenerator.class)
13+
@NodeEntity
14+
public class Person {
15+
@GraphId
16+
Long id;
17+
18+
private String name;
19+
private int born;
20+
21+
@Relationship(type = "ACTED_IN")
22+
private List<Movie> movies;
23+
24+
public Person() { }
25+
26+
public String getName() {
27+
return name;
28+
}
29+
30+
public int getBorn() {
31+
return born;
32+
}
33+
34+
public List<Movie> getMovies() {
35+
return movies;
36+
}
37+
38+
public void setName(String name) {
39+
this.name = name;
40+
}
41+
42+
public void setBorn(int born) {
43+
this.born = born;
44+
}
45+
46+
public void setMovies(List<Movie> movies) {
47+
this.movies = movies;
48+
}
49+
50+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.baeldung.spring.data.neo4j.domain;
2+
3+
4+
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
5+
import com.voodoodyne.jackson.jsog.JSOGGenerator;
6+
import org.neo4j.ogm.annotation.EndNode;
7+
import org.neo4j.ogm.annotation.GraphId;
8+
import org.neo4j.ogm.annotation.RelationshipEntity;
9+
import org.neo4j.ogm.annotation.StartNode;
10+
11+
import java.util.Collection;
12+
13+
@JsonIdentityInfo(generator=JSOGGenerator.class)
14+
@RelationshipEntity(type = "ACTED_IN")
15+
public class Role {
16+
@GraphId
17+
Long id;
18+
private Collection<String> roles;
19+
@StartNode
20+
private Person person;
21+
@EndNode
22+
private Movie movie;
23+
24+
public Role() {
25+
}
26+
27+
public Collection<String> getRoles() {
28+
return roles;
29+
}
30+
31+
public Person getPerson() {
32+
return person;
33+
}
34+
35+
public Movie getMovie() {
36+
return movie;
37+
}
38+
39+
public void setRoles(Collection<String> roles) {
40+
this.roles = roles;
41+
}
42+
43+
public void setPerson(Person person) {
44+
this.person = person;
45+
}
46+
47+
public void setMovie(Movie movie) {
48+
this.movie = movie;
49+
}
50+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.baeldung.spring.data.neo4j.repostory;
2+
3+
import com.baeldung.spring.data.neo4j.domain.Movie;
4+
import org.springframework.data.neo4j.annotation.Query;
5+
import org.springframework.data.neo4j.repository.GraphRepository;
6+
import org.springframework.data.repository.query.Param;
7+
import org.springframework.stereotype.Repository;
8+
9+
import java.util.Collection;
10+
import java.util.List;
11+
import java.util.Map;
12+
13+
@Repository
14+
public interface MovieRepository extends GraphRepository<Movie> {
15+
Movie findByTitle(@Param("title") String title);
16+
17+
@Query("MATCH (m:Movie) WHERE m.title =~ ('(?i).*'+{title}+'.*') RETURN m")
18+
Collection<Movie> findByTitleContaining(@Param("title") String title);
19+
20+
@Query("MATCH (m:Movie)<-[:ACTED_IN]-(a:Person) RETURN m.title as movie, collect(a.name) as cast LIMIT {limit}")
21+
List<Map<String,Object>> graph(@Param("limit") int limit);
22+
}
23+
24+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.baeldung.spring.data.neo4j.repostory;
2+
3+
import com.baeldung.spring.data.neo4j.domain.Person;
4+
import org.springframework.data.neo4j.repository.GraphRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
8+
@Repository
9+
public interface PersonRepository extends GraphRepository<Person> {
10+
11+
}

0 commit comments

Comments
 (0)