#131 - Added Spring Data Neo4j example.

Original pull requests: #129, #130.
This commit is contained in:
Luanne Misquitta
2015-09-03 16:41:27 +05:30
committed by Oliver Gierke
parent 0c1bee04b3
commit f90bed38e2
10 changed files with 425 additions and 0 deletions

View File

@@ -39,6 +39,10 @@ We have separate folders for the samples of individual modules:
* `example` - Example how to use basic text search, geo-spatial search and facets.
## Spring Data Neo4j
* `example` - Example to show basic node and relationship entities and repository usage.
## Spring Data web support
* `web` - Example for Spring Data web integration (binding `Pageable` instances to Spring MVC controller methods, using interfaces to bind Spring MVCrequest payloads).

71
neo4j/example/pom.xml Normal file
View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-data-neo4j-example</artifactId>
<name>Spring Data Neo4j - Example</name>
<properties>
<spring-data-neo4j.version>4.0.0.BUILD-SNAPSHOT</spring-data-neo4j.version>
<neo4j-ogm.version>1.1.2-SNAPSHOT</neo4j-ogm.version>
<neo4j.version>2.2.4</neo4j.version>
</properties>
<parent>
<groupId>org.springframework.data.examples</groupId>
<artifactId>spring-data-neo4j-examples</artifactId>
<version>1.0.0.BUILD-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>${spring-data-neo4j.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>${spring-data-neo4j.version}</version>
<type>test-jar</type>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm</artifactId>
<version>${neo4j-ogm.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.neo4j.app</groupId>
<artifactId>neo4j-server</artifactId>
<version>${neo4j.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.neo4j.test</groupId>
<artifactId>neo4j-harness</artifactId>
<version>${neo4j.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-libs-snapshot</id>
<name>Spring</name>
<url>http://repo.spring.io/libs-snapshot</url>
</repository>
</repositories>
</project>

View File

@@ -0,0 +1,68 @@
/*
* Copyright 2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example.springdata.neo4j.domain;
import java.util.HashSet;
import java.util.Set;
import org.neo4j.ogm.annotation.GraphId;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;
/**
* An Actor node entity.
*
* @author Luanne Misquitta
*/
@NodeEntity(label = "Actor")
public class Actor {
@GraphId private Long id;
private String name;
@Relationship(type = "ACTED_IN")
private Set<Role> roles = new HashSet<>();
public Actor() {
}
public Actor(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Long getId() {
return id;
}
public Set<Role> getRoles() {
return roles;
}
public void actedIn(Movie movie, String roleName) {
Role role = new Role();
role.setRole(roleName);
role.setActor(this);
role.setMovie(movie);
roles.add(role);
movie.getRoles().add(role);
}
}

View File

@@ -0,0 +1,60 @@
/*
* Copyright 2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example.springdata.neo4j.domain;
import java.util.HashSet;
import java.util.Set;
import org.neo4j.ogm.annotation.GraphId;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;
/**
* A Movie node entity.
*
* @author Luanne Misquitta
*/
@NodeEntity(label = "Movie")
public class Movie {
@GraphId private Long id;
private String title;
@Relationship(type = "ACTED_IN", direction = "INCOMING")
private Set<Role> roles = new HashSet<>();
public Movie() {
}
public Movie(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Relationship(type = "ACTED_IN", direction = "INCOMING")
public Set<Role> getRoles() {
return roles;
}
}

View File

@@ -0,0 +1,61 @@
/*
* Copyright 2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example.springdata.neo4j.domain;
import org.neo4j.ogm.annotation.EndNode;
import org.neo4j.ogm.annotation.GraphId;
import org.neo4j.ogm.annotation.RelationshipEntity;
import org.neo4j.ogm.annotation.StartNode;
/**
* A Role relationship entity between an actor and movie.
* @author Luanne Misquitta
*/
@RelationshipEntity(type = "ACTED_IN")
public class Role {
@GraphId private Long id;
@StartNode private Actor actor;
@EndNode private Movie movie;
private String role;
public Role() {
}
public Actor getActor() {
return actor;
}
public void setActor(Actor actor) {
this.actor = actor;
}
public Movie getMovie() {
return movie;
}
public void setMovie(Movie movie) {
this.movie = movie;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright 2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example.springdata.neo4j.repo;
import example.springdata.neo4j.domain.Actor;
import org.springframework.data.neo4j.repository.GraphRepository;
/**
* GraphRepository for Actors.
* @author Luanne Misquitta
*/
public interface ActorRepository extends GraphRepository<Actor> {
}

View File

@@ -0,0 +1,64 @@
/*
* Copyright 2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example.springdata.neo4j;
import static org.junit.Assert.*;
import example.springdata.neo4j.domain.Actor;
import example.springdata.neo4j.domain.Movie;
import example.springdata.neo4j.domain.Role;
import example.springdata.neo4j.repo.ActorRepository;
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.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Simple integration test demonstrating the use of the ActorRepository
* @author Luanne Misquitta
*/
@ContextConfiguration(classes = {ExampleConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class ActorRepositoryIntegrationTest {
@Autowired ActorRepository actorRepository;
/**
* @see DATAGRAPH-752
* Test case to demonstrate saving node and relationship entities, and loading them via the repository.
*/
@Test
public void shouldBeAbleToSaveAndLoadActor() {
Actor daniel = new Actor("Daniel Radcliffe");
Movie goblet = new Movie("Harry Potter and the Goblet of Fire");
daniel.actedIn(goblet,"Harry Potter");
actorRepository.save(daniel); //saves the actor and the movie
Actor actor = actorRepository.findOne(daniel.getId());
assertNotNull(actor);
assertEquals(daniel.getName(),actor.getName());
assertEquals(1,actor.getRoles().size());
Role role = actor.getRoles().iterator().next();
assertEquals("Harry Potter", role.getRole());
}
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright 2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package example.springdata.neo4j;
import org.neo4j.ogm.session.SessionFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.config.Neo4jConfiguration;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
import org.springframework.data.neo4j.server.InProcessServer;
import org.springframework.data.neo4j.server.Neo4jServer;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author Luanne Misquitta
*/
@Configuration
@EnableTransactionManagement
@EnableNeo4jRepositories("example.springdata.neo4j.repo")
public class ExampleConfig extends Neo4jConfiguration{
@Override
public Neo4jServer neo4jServer() {
return new InProcessServer();
}
@Override
public SessionFactory getSessionFactory() {
return new SessionFactory("example.springdata.neo4j.domain");
}
}

25
neo4j/pom.xml Normal file
View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-data-neo4j-examples</artifactId>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.data.examples</groupId>
<artifactId>spring-data-examples</artifactId>
<version>1.0.0.BUILD-SNAPSHOT</version>
</parent>
<name>Spring Data Neo4j 4 - Examples</name>
<description>Sample projects for Spring Data Neo4j 4</description>
<modules>
<module>example</module>
</modules>
</project>

View File

@@ -27,6 +27,7 @@
<module>elasticsearch</module>
<module>web</module>
<module>bom</module>
<module>neo4j</module>
</modules>
<properties>