Skip to content

Commit 41cbb93

Browse files
authored
Update Neo4j extension to use Spring Data Neo4j. (#125)
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.
1 parent 42093bc commit 41cbb93

File tree

11 files changed

+1383
-1199
lines changed

11 files changed

+1383
-1199
lines changed

.github/workflows/spring-batch-neo4j.yml

+5-4
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ jobs:
1111
runs-on: ubuntu-latest
1212
steps:
1313
- name: Checkout source code
14-
uses: actions/checkout@v2
15-
- name: Set up JDK 1.8
16-
uses: actions/setup-java@v1
14+
uses: actions/checkout@v4
15+
- name: Set up JDK 17
16+
uses: actions/setup-java@v4
1717
with:
18-
java-version: 1.8
18+
distribution: 'temurin'
19+
java-version: 17
1920
- name: Build with Maven
2021
run: mvn -B package --file pom.xml
2122
working-directory: spring-batch-neo4j

spring-batch-neo4j/README.md

+93-13
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,105 @@ This extension contains an `ItemReader` and `ItemWriter` implementations for [Ne
77
The `Neo4jItemReader` can be configured as follows:
88

99
```java
10-
SessionFactory sessionFactory = ...
11-
Neo4jItemReader<String> itemReader = new Neo4jItemReaderBuilder<String>()
12-
.sessionFactory(sessionFactory)
13-
.name("itemReader")
14-
.targetType(String.class)
15-
.startStatement("n=node(*)")
16-
.orderByStatement("n.age")
17-
.matchStatement("n -- m")
18-
.whereStatement("has(n.name)")
19-
.returnStatement("m")
10+
Neo4jItemReader<User> reader = new Neo4jItemReaderBuilder<User>()
11+
.neo4jTemplate(neo4jTemplate)
12+
.name("userReader")
13+
.statement(Cypher.match(userNode).returning(userNode))
14+
.targetType(User.class)
2015
.pageSize(50)
2116
.build();
2217
```
2318

2419
The `Neo4jItemWriter` can be configured as follows:
2520

2621
```java
27-
SessionFactory sessionFactory = ...
28-
Neo4jItemWriter<String> writer = new Neo4jItemWriterBuilder<String>()
29-
.sessionFactory(sessionFactory)
22+
Neo4jItemWriter<User> writer = new Neo4jItemWriterBuilder<User>()
23+
.neo4jTemplate(neo4jTemplate)
24+
.neo4jDriver(driver)
25+
.neo4jMappingContext(mappingContext)
3026
.build();
27+
```
28+
29+
## Minimal Spring Boot example
30+
31+
Additional to the already existing dependencies in a new Spring Boot application,
32+
`spring-boot-starter-data-neo4j`, `spring-batch-neo4j` and the `spring-boot-starter-batch` are needed
33+
but `spring-jdbc` and `spring-boot-starter-jdbc` must be explicitly excluded.
34+
The exclusions are mandatory to avoid any need for JDBC-based connections, like JDBC URI etc.
35+
36+
See the following _build.gradle_ dependency definition for a minimal example.
37+
38+
```groovy
39+
dependencies {
40+
implementation ('org.springframework.boot:spring-boot-starter-batch') {
41+
exclude group: 'org.springframework', module: 'spring-jdbc'
42+
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-jdbc'
43+
}
44+
// current development version 0.2.0-SNAPSHOT
45+
implementation 'org.springframework.batch.extensions:spring-batch-neo4j'
46+
implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'
47+
testImplementation 'org.springframework.boot:spring-boot-starter-test'
48+
testImplementation 'org.springframework.batch:spring-batch-test'
49+
}
50+
```
51+
52+
An example of the usage can be seen in the following example, implementing the `CommandLineRunner` interface.
53+
54+
```java
55+
@SpringBootApplication
56+
public class TestSpringBatchApplication implements CommandLineRunner {
57+
// those dependencies are created by Spring Boot's
58+
// spring-data-neo4j autoconfiguration
59+
@Autowired
60+
private Driver driver;
61+
@Autowired
62+
private Neo4jMappingContext mappingContext;
63+
@Autowired
64+
private Neo4jTemplate neo4jTemplate;
65+
66+
public static void main(String[] args) {
67+
SpringApplication.run(TestSpringBatchApplication.class, args);
68+
}
69+
70+
@Override
71+
public void run(String... args) {
72+
// writing
73+
Neo4jItemWriter<User> writer = new Neo4jItemWriterBuilder<User>()
74+
.neo4jTemplate(neo4jTemplate)
75+
.neo4jDriver(driver)
76+
.neo4jMappingContext(mappingContext)
77+
.build();
78+
writer.write(Chunk.of(new User("id1", "ab"), new User("id2", "bb")));
79+
80+
// reading
81+
org.neo4j.cypherdsl.core.Node userNode = Cypher.node("User");
82+
Neo4jItemReader<User> reader = new Neo4jItemReaderBuilder<User>()
83+
.neo4jTemplate(neo4jTemplate)
84+
.name("userReader")
85+
.statement(Cypher.match(userNode).returning(userNode))
86+
.targetType(User.class)
87+
.build();
88+
List<User> allUsers = new ArrayList<>();
89+
User user = null;
90+
while ((user = reader.read()) != null) {
91+
System.out.printf("Found user: %s%n", user.name);
92+
allUsers.add(user);
93+
}
94+
95+
// deleting
96+
writer.setDelete(true);
97+
writer.write(Chunk.of(allUsers.toArray(new User[]{})));
98+
}
99+
100+
@Node("User")
101+
public static class User {
102+
@Id public final String id;
103+
public final String name;
104+
105+
public User(String id, String name) {
106+
this.id = id;
107+
this.name = name;
108+
}
109+
}
110+
}
31111
```

spring-batch-neo4j/pom.xml

+11-11
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,19 @@
5454
<properties>
5555
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
5656
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
57-
<java.version>1.8</java.version>
57+
<java.version>17</java.version>
5858

5959
<!-- Production dependencies-->
60-
<spring.batch.version>4.3.3</spring.batch.version>
61-
<neo4j-ogm-core.version>3.2.21</neo4j-ogm-core.version>
60+
<spring.batch.version>5.1.2</spring.batch.version>
61+
<spring-data-neo4j.version>7.2.1</spring-data-neo4j.version>
6262

6363
<!-- Test Dependencies -->
6464
<assertj.version>3.18.1</assertj.version>
65-
<junit.version>4.13.2</junit.version>
66-
<mockito.version>3.6.0</mockito.version>
65+
<junit.version>5.11.0</junit.version>
66+
<mockito.version>5.12.0</mockito.version>
6767

6868
<!-- Maven plugins -->
69-
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
69+
<maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
7070
<maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version>
7171
<maven-source-plugin.version>3.2.1</maven-source-plugin.version>
7272
</properties>
@@ -83,15 +83,15 @@
8383
<version>${spring.batch.version}</version>
8484
</dependency>
8585
<dependency>
86-
<groupId>org.neo4j</groupId>
87-
<artifactId>neo4j-ogm-core</artifactId>
88-
<version>${neo4j-ogm-core.version}</version>
86+
<groupId>org.springframework.data</groupId>
87+
<artifactId>spring-data-neo4j</artifactId>
88+
<version>${spring-data-neo4j.version}</version>
8989
</dependency>
9090

9191
<!-- Test Dependencies -->
9292
<dependency>
93-
<groupId>junit</groupId>
94-
<artifactId>junit</artifactId>
93+
<groupId>org.junit.jupiter</groupId>
94+
<artifactId>junit-jupiter-engine</artifactId>
9595
<version>${junit.version}</version>
9696
<scope>test</scope>
9797
</dependency>

0 commit comments

Comments
 (0)