cancel
Showing results for 
Search instead for 
Did you mean: 

Creating a datetime native type with spring-data-neo4

leonard_panichi
Node Clone

I'm trying to create a neo4j native datetime type (Temporal (Date/Time) values - Neo4j Cypher Manual) with spring data neo4j. I have a rest controller which takes an object as parameter, this object is then directly saved to neo4j.
I skip the rest controller, I'll give later the implementation of the object.
I'm using

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.0.RELEASE</version>
	</parent>

and all packages with <groupId>org.neo4j</groupId> use version 3.2.2.

I'm using the following pieces of forum and documentation :

Based on this, I wrote an object and a no op converter:
MyObject:

public class MyObject{
    @Convert(NoOpZonedDateTimeConversion.class)
    private ZonedDateTime testDate;
// + getter and setter
}

NoOpZonedDateTimeConversion :

public class NoOpZonedDateTimeConversion implements AttributeConverter<LocalDateTime, LocalDateTime> {
  @Override
  public LocalDateTime toGraphProperty(LocalDateTime value) {
    return value;
  }

  @Override
  public LocalDateTime toEntityAttribute(LocalDateTime value) {
    return value;
  }
}

This registers a string in my database (neo 3.5.5-enterprise).
I tried a few converters with various native java date type, I tried without converter, simple question : is it suppose to work or am I missing something ?

1 ACCEPTED SOLUTION

Sorry it took me a while but just to close this thread :
I run now neo4j 4.1 with docker
I have added in my pom

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-neo4j</artifactId>
      <version>5.3.2.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.neo4j</groupId>
      <artifactId>neo4j-ogm-bolt-native-types</artifactId>
      <version>3.2.14</version>
      <scope>runtime</scope>
    </dependency>

In application.yml :

 spring:
    data:
        neo4j:
            use-native-types: "true"

I have a property in a node entity with getters and setters
LocalDateTime date;

And I can now register LocalDateTime directly in my DB which is great necause I have access to all methods and tools of Date and Time in neo4j (better than String imo)

Thanks for the good job.

View solution in original post

3 REPLIES 3

gerrit_meier
Neo4j
Neo4j

You have to opt-in to enable the native type support. More details in this great blog post (section Native types support) written by @michael.simons.
The key ingredient is to add (assuming you are using bolt protocol) the native type support dependency

<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-ogm-bolt-native-types</artifactId>
    <version>3.2.2</version>
    <scope>runtime</scope>
</dependency>

and enable it either via ogm.properties,

use-native-types=true

the Configuration definition

Configuration configuration = new Configuration.Builder()
        .uri("bolt://neo4j:password@localhost")
        .useNativeTypes()
        .build()

or if you are using Spring Boot for your application you can do this (starting from Spring Boot 2.2) via the application.properties.

spring.data.neo4j.use-native-types=true

Thanks for the help, so far I did not succeed to register a ZonedDateTime native java object in the database as a neo4j DateTime.
I'm using spring boot and I enabled native types in my application.yml. I also added the maven dependancy neo4j-ogm-bolt-native-types.

My NodeEntity has a ZonedateTime private parameter with accessors.
I'm posting a json with this date : "1996-10-15T00:05:32.000Z" and I end up with 1996-10-15T00:05:32[UTC] in the database. I suspect that it might also be a problem with spring boot deserialization of java date types, I'll have to investigate but that will be for another time I'm afraid.

Thanks for the help 🙂

Sorry it took me a while but just to close this thread :
I run now neo4j 4.1 with docker
I have added in my pom

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-neo4j</artifactId>
      <version>5.3.2.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.neo4j</groupId>
      <artifactId>neo4j-ogm-bolt-native-types</artifactId>
      <version>3.2.14</version>
      <scope>runtime</scope>
    </dependency>

In application.yml :

 spring:
    data:
        neo4j:
            use-native-types: "true"

I have a property in a node entity with getters and setters
LocalDateTime date;

And I can now register LocalDateTime directly in my DB which is great necause I have access to all methods and tools of Date and Time in neo4j (better than String imo)

Thanks for the good job.

Nodes 2022
Nodes
NODES 2022, Neo4j Online Education Summit

On November 16 and 17 for 24 hours across all timezones, you’ll learn about best practices for beginners and experts alike.