diff --git a/README.md b/README.md index a341eebc..c3680371 100644 --- a/README.md +++ b/README.md @@ -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). diff --git a/neo4j/example/pom.xml b/neo4j/example/pom.xml new file mode 100644 index 00000000..a4a14e9d --- /dev/null +++ b/neo4j/example/pom.xml @@ -0,0 +1,71 @@ + + + + + 4.0.0 + + spring-data-neo4j-example + Spring Data Neo4j - Example + + 4.0.0.BUILD-SNAPSHOT + 1.1.2-SNAPSHOT + 2.2.4 + + + + org.springframework.data.examples + spring-data-neo4j-examples + 1.0.0.BUILD-SNAPSHOT + ../pom.xml + + + + + + org.springframework.data + spring-data-neo4j + ${spring-data-neo4j.version} + + + + org.springframework.data + spring-data-neo4j + ${spring-data-neo4j.version} + test-jar + + + org.neo4j + neo4j-ogm + ${neo4j-ogm.version} + test-jar + test + + + org.neo4j.app + neo4j-server + ${neo4j.version} + + + junit + junit + 4.12 + test + + + org.neo4j.test + neo4j-harness + ${neo4j.version} + test + + + + + + spring-libs-snapshot + Spring + http://repo.spring.io/libs-snapshot + + + \ No newline at end of file diff --git a/neo4j/example/src/main/java/example/springdata/neo4j/domain/Actor.java b/neo4j/example/src/main/java/example/springdata/neo4j/domain/Actor.java new file mode 100644 index 00000000..c45ef0ea --- /dev/null +++ b/neo4j/example/src/main/java/example/springdata/neo4j/domain/Actor.java @@ -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 roles = new HashSet<>(); + + public Actor() { + } + + public Actor(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public Long getId() { + return id; + } + + public Set 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); + } +} diff --git a/neo4j/example/src/main/java/example/springdata/neo4j/domain/Movie.java b/neo4j/example/src/main/java/example/springdata/neo4j/domain/Movie.java new file mode 100644 index 00000000..33e581e3 --- /dev/null +++ b/neo4j/example/src/main/java/example/springdata/neo4j/domain/Movie.java @@ -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 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 getRoles() { + return roles; + } + +} diff --git a/neo4j/example/src/main/java/example/springdata/neo4j/domain/Role.java b/neo4j/example/src/main/java/example/springdata/neo4j/domain/Role.java new file mode 100644 index 00000000..9a7f3e7e --- /dev/null +++ b/neo4j/example/src/main/java/example/springdata/neo4j/domain/Role.java @@ -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; + } +} diff --git a/neo4j/example/src/main/java/example/springdata/neo4j/repo/ActorRepository.java b/neo4j/example/src/main/java/example/springdata/neo4j/repo/ActorRepository.java new file mode 100644 index 00000000..f8acdf4a --- /dev/null +++ b/neo4j/example/src/main/java/example/springdata/neo4j/repo/ActorRepository.java @@ -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 { + +} diff --git a/neo4j/example/src/test/java/example/springdata/neo4j/ActorRepositoryIntegrationTest.java b/neo4j/example/src/test/java/example/springdata/neo4j/ActorRepositoryIntegrationTest.java new file mode 100644 index 00000000..ecc6e2fa --- /dev/null +++ b/neo4j/example/src/test/java/example/springdata/neo4j/ActorRepositoryIntegrationTest.java @@ -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()); + } + +} diff --git a/neo4j/example/src/test/java/example/springdata/neo4j/ExampleConfig.java b/neo4j/example/src/test/java/example/springdata/neo4j/ExampleConfig.java new file mode 100644 index 00000000..18bab351 --- /dev/null +++ b/neo4j/example/src/test/java/example/springdata/neo4j/ExampleConfig.java @@ -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"); + } +} diff --git a/neo4j/pom.xml b/neo4j/pom.xml new file mode 100644 index 00000000..9b28ccb1 --- /dev/null +++ b/neo4j/pom.xml @@ -0,0 +1,25 @@ + + + + + 4.0.0 + + spring-data-neo4j-examples + pom + + + org.springframework.data.examples + spring-data-examples + 1.0.0.BUILD-SNAPSHOT + + + Spring Data Neo4j 4 - Examples + Sample projects for Spring Data Neo4j 4 + + + example + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index e1f0027b..7effc720 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,7 @@ elasticsearch web bom + neo4j