Skip to content

Commit

Permalink
Update Neo4j extension to use Spring Data Neo4j. (#125)
Browse files Browse the repository at this point in the history
Move away from the Neo4j OGM usage because Spring Data Neo4j
fits better in the ecosystem, spring-batch is settled in.

Previously there was no visible difference to users because Spring Data Neo4j
was based on Neo4j OGM which isn't the case anymore.
  • Loading branch information
meistermeier authored Aug 20, 2024
1 parent 42093bc commit 41cbb93
Show file tree
Hide file tree
Showing 11 changed files with 1,383 additions and 1,199 deletions.
9 changes: 5 additions & 4 deletions .github/workflows/spring-batch-neo4j.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 1.8
distribution: 'temurin'
java-version: 17
- name: Build with Maven
run: mvn -B package --file pom.xml
working-directory: spring-batch-neo4j
106 changes: 93 additions & 13 deletions spring-batch-neo4j/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,105 @@ This extension contains an `ItemReader` and `ItemWriter` implementations for [Ne
The `Neo4jItemReader` can be configured as follows:

```java
SessionFactory sessionFactory = ...
Neo4jItemReader<String> itemReader = new Neo4jItemReaderBuilder<String>()
.sessionFactory(sessionFactory)
.name("itemReader")
.targetType(String.class)
.startStatement("n=node(*)")
.orderByStatement("n.age")
.matchStatement("n -- m")
.whereStatement("has(n.name)")
.returnStatement("m")
Neo4jItemReader<User> reader = new Neo4jItemReaderBuilder<User>()
.neo4jTemplate(neo4jTemplate)
.name("userReader")
.statement(Cypher.match(userNode).returning(userNode))
.targetType(User.class)
.pageSize(50)
.build();
```

The `Neo4jItemWriter` can be configured as follows:

```java
SessionFactory sessionFactory = ...
Neo4jItemWriter<String> writer = new Neo4jItemWriterBuilder<String>()
.sessionFactory(sessionFactory)
Neo4jItemWriter<User> writer = new Neo4jItemWriterBuilder<User>()
.neo4jTemplate(neo4jTemplate)
.neo4jDriver(driver)
.neo4jMappingContext(mappingContext)
.build();
```

## Minimal Spring Boot example

Additional to the already existing dependencies in a new Spring Boot application,
`spring-boot-starter-data-neo4j`, `spring-batch-neo4j` and the `spring-boot-starter-batch` are needed
but `spring-jdbc` and `spring-boot-starter-jdbc` must be explicitly excluded.
The exclusions are mandatory to avoid any need for JDBC-based connections, like JDBC URI etc.

See the following _build.gradle_ dependency definition for a minimal example.

```groovy
dependencies {
implementation ('org.springframework.boot:spring-boot-starter-batch') {
exclude group: 'org.springframework', module: 'spring-jdbc'
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-jdbc'
}
// current development version 0.2.0-SNAPSHOT
implementation 'org.springframework.batch.extensions:spring-batch-neo4j'
implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.batch:spring-batch-test'
}
```

An example of the usage can be seen in the following example, implementing the `CommandLineRunner` interface.

```java
@SpringBootApplication
public class TestSpringBatchApplication implements CommandLineRunner {
// those dependencies are created by Spring Boot's
// spring-data-neo4j autoconfiguration
@Autowired
private Driver driver;
@Autowired
private Neo4jMappingContext mappingContext;
@Autowired
private Neo4jTemplate neo4jTemplate;

public static void main(String[] args) {
SpringApplication.run(TestSpringBatchApplication.class, args);
}

@Override
public void run(String... args) {
// writing
Neo4jItemWriter<User> writer = new Neo4jItemWriterBuilder<User>()
.neo4jTemplate(neo4jTemplate)
.neo4jDriver(driver)
.neo4jMappingContext(mappingContext)
.build();
writer.write(Chunk.of(new User("id1", "ab"), new User("id2", "bb")));

// reading
org.neo4j.cypherdsl.core.Node userNode = Cypher.node("User");
Neo4jItemReader<User> reader = new Neo4jItemReaderBuilder<User>()
.neo4jTemplate(neo4jTemplate)
.name("userReader")
.statement(Cypher.match(userNode).returning(userNode))
.targetType(User.class)
.build();
List<User> allUsers = new ArrayList<>();
User user = null;
while ((user = reader.read()) != null) {
System.out.printf("Found user: %s%n", user.name);
allUsers.add(user);
}

// deleting
writer.setDelete(true);
writer.write(Chunk.of(allUsers.toArray(new User[]{})));
}

@Node("User")
public static class User {
@Id public final String id;
public final String name;

public User(String id, String name) {
this.id = id;
this.name = name;
}
}
}
```
22 changes: 11 additions & 11 deletions spring-batch-neo4j/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -54,19 +54,19 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<java.version>17</java.version>

<!-- Production dependencies-->
<spring.batch.version>4.3.3</spring.batch.version>
<neo4j-ogm-core.version>3.2.21</neo4j-ogm-core.version>
<spring.batch.version>5.1.2</spring.batch.version>
<spring-data-neo4j.version>7.2.1</spring-data-neo4j.version>

<!-- Test Dependencies -->
<assertj.version>3.18.1</assertj.version>
<junit.version>4.13.2</junit.version>
<mockito.version>3.6.0</mockito.version>
<junit.version>5.11.0</junit.version>
<mockito.version>5.12.0</mockito.version>

<!-- Maven plugins -->
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
<maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version>
<maven-source-plugin.version>3.2.1</maven-source-plugin.version>
</properties>
Expand All @@ -83,15 +83,15 @@
<version>${spring.batch.version}</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-core</artifactId>
<version>${neo4j-ogm-core.version}</version>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>${spring-data-neo4j.version}</version>
</dependency>

<!-- Test Dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
Expand Down
Loading

0 comments on commit 41cbb93

Please sign in to comment.