neo4jcypherspring-data-neo4jneo4j-ogmspring-data-neo4j-5

SDN5/OGM3 compare java.util.Date at Cypher query


I have the following entity:

@NodeEntity
public class Action {

...

    @Index(unique = false)
    private Date createDate;

...

}

I need to get the last Action that was created during some previous period of time.

In order to do this I have implemented the following repository method:

@Repository
public interface ActionRepository {

    @Query("MATCH (a:Action)-[:CREATED_BY]->(u:User) WHERE a.entityType = {entityType} AND a.createDate <= {minCreateDate} AND u.id = {userId} RETURN a ORDER BY a.createDate DESC LIMIT 1")
    Action findLastByEntityTypeForUser(@Param("entityType") String entityType, @Param("minCreateDate") Date minCreateDate, @Param("userId") Long userId);

}

I use the following code to test this method:

decisionDao.create("Decision2", "Decision2 description", null, false, null, user1);

Date minStartDate = DateUtils.addMilliseconds(new Date(), -1000 * 60);

Action user1LastAction = actionRepository.findLastByEntityTypeForUser(Decision.class.getSimpleName(), minStartDate, user1.getId());

assertNotNull(user1LastAction); // test fails here because of NPE

but without this part of the Cypher query AND a.createDate <= {minCreateDate} I can successfully find Action instance.

At Neo4j level my data looks like:

{
   "updateDate":"2017-10-08T12:21:39.15
3Z",
   "entityName":"General",
   "en
tityType":"CriterionGroup",
   "entityId":1,
   "id":1,
   "type":"CREATE",
   "createDate":"2017-10-08T12:21:39.153Z"
}

What am I doing wrong and how to properly compare the dates with SDN/OGM and Cypher?

Also, is there any way to tell SDN/OGM to store java.util.Date object as long milliseconds and as String?


Solution

  • the minCreateDate parameter you use for your find-Method is of type Date and the createDate property is a String. So, this part a.createDate <= {minCreateDate} is basically comparing the String representation of minCreateDate and the String property createDate.

    In my projects, I usually save the dates and timestamps as long both in the database and in my code.

    Or even better, if the date attributes are crucial for my application, I'm using the "Time Tree Model" approach: https://graphaware.com/neo4j/2014/08/20/graphaware-neo4j-timetree.html