1

Ich habe die folgende Einheit:SDN5/OGM3 vergleichen java.util.Date bei Cypher Abfrage

@NodeEntity 
public class Action { 

... 

    @Index(unique = false) 
    private Date createDate; 

... 

} 

ich die letzten Action erhalten muß, die während eines früheren Zeitraums erstellt wurden.

Um dies ich die folgenden Repository-Methode implementiert haben zu tun:

@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); 

} 

ich den folgenden Code verwenden diese Methode zu testen:

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 

aber ohne diesen Teil der Cypher Abfrage AND a.createDate <= {minCreateDate} Ich kann Action Instanz finden.

Auf Neo4j Ebene meine Daten wie folgt aussieht:

{ 
    "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" 
} 

Was mache ich falsch und wie man richtig die Termine mit SDN/OGM und Cypher vergleichen?

Gibt es auch eine Möglichkeit, SDN/OGM mitzuteilen, java.util.Date Objekt als long Millisekunden und als String zu speichern?

Antwort

2

Der minCreateDate Parameter, den Sie für Ihre find-Methode verwenden, ist vom Typ Date und die createDate Eigenschaft ist ein String. So vergleicht dieser Teil a.createDate <= {minCreateDate} im Grunde die String-Darstellung von minCreateDate und die String-Eigenschaft createDate.

In meinen Projekten speichern ich die Daten und Zeitstempel normalerweise sowohl in der Datenbank als auch in meinem Code.

Oder noch besser, wenn die Datumsattribute für meine Anwendung von entscheidender Bedeutung sind, bin ich mit dem Ansatz „Time Tree Model“: https://graphaware.com/neo4j/2014/08/20/graphaware-neo4j-timetree.html

+1

Vielen Dank für Ihre Antwort. Gibt es eine Möglichkeit, SDN/OGM mitzuteilen, dass das Objekt 'java.util.Date' als' lange' Millisekunden gespeichert werden soll? – alexanoid

+0

Nicht zu meinem Wissen –

+2

Ja kannst du: '' '@Index (einzigartig = falsch) @DateLong public Date createDate;' '' – nmervaillie