cancel
Showing results for 
Search instead for 
Did you mean: 

How to use Neo4J native types with SDN and OGM

p_suettner
Node

Hi,

I wonder how to setup SDN with OGM to use native types instead of converting e.g. temporal fields to string properties.

Currently I'm using Spring Boot version 2.1.0.RELEASE and org.springframework.data:spring-data-neo4j:5.1.2.RELEASE, which declares a dependency to org.neo4j:neo4j-ogm-bolt-driver:3.1.4

The SDN documentation does not mention using native types at all. However, the OGM documentation (https://neo4j.com/docs/ogm-manual/current/reference/#reference:native-property-types) states declaring a dependency to org.neo4j:neo4j-ogm-bolt-native-types:x.x.x and configuring the driver to use native types.

But searching maven central, there are no corresponding versions available, see:
https://search.maven.org/search?q=a:neo4j-ogm-bolt-native-types

In the end, I would like to be able to execute queries using the org.neo4j.ogm.session.Session with parameter binding, e.g.

ImmutableMap<String, Object> parameterMap = ImmutableMap.<String, Object>of("creationTimeParam", Instant.now());
session.query(Product.class, "MATCH (p:Product) WHERE p.creationTime < {creationTimeParam} RETURN p",parameterMap);

where creationTime is defined as Instant in the Product class. But this kind of query with parameter bindings won't work without native type support I guess...

Is this currently not supported or am I missing something?

Greetings,

Peter

2 REPLIES 2

Hi Peter.
Thanks for your question.

Currently, the Neo4j-OGM documentation points to Version 3.2 which has not been released yet. This is an error on our site.

Regarding the parameter binding: This is also a current bug in Neo4j-OGM on our site. Neo4j-OGM uses Jacksons ObjectMapper to convert parameters and that one doesn't know how do deal with JDK 8 types out of the box.

I solved this in my demo projects in the following way at the moment:

First of all: Fix the ObjectMapper. This will be done in 3.2 automatically:

To make this work, please add https://github.com/FasterXML/jackson-modules-java8 to your classpath.
It should be automatically available with your Spring Boot 2.1.x setup anyway.

Second step, tell Neo4j-OGM to keep away from data types it can actually pass along to embedded and Bolt instances:

ParameterConversionMode is an undocumented feature for the most recent Neo4j-OGM version 3.1.6 that allows such a thing.

And last but not least, fix all the conversion mappings by providing No-Op converters that Spring Data Neo4j should keep alone:

Use it like this:

I'm really sorry for that hassle, but this is the only solution.

Things will improve greatly with Spring Data Neo4j Moore (5.2) and Neo4j-OGM (3.2) which will be released with Spring Boot 2.2.
Opt-in to native types will be a simple property you'll set in your Spring Config.

Best,
Michael.

Hi Michael,

thanks for your detailed answer. Currently all timestamps are stored in UTC anyways, so I' m fine with keeping the long values for the time being. But I'll give your solution a try...

Greetings,

Peter

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.