2016-12-27 7 views
1

Прямо сейчас я разрабатываю систему с базой данных Neo4j, где я должен иметь возможность проверки запроса, если свойство в узле до, равное или после предоставленного Date.Neo4j Cypher, сравнивая даты в запросе Cypher

Как я должен хранить Date внутри Neo4j узла недвижимости, чтобы иметь возможность сделать сравнение с Cypher запроса на основе, например простых операторов, как ==, >, <

Это хорошо хранить Date как Long timestamp? Будет ли это работать таким образом? Если нет, предложите лучшее решение.

ОБНОВЛЕНО

запросов я пытался не повезло:

MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) WHERE id(parentD) = {decisionId} MATCH (childD)<-[:SET_FOR]-(filterValue153:Value)-[:SET_ON]->(filterCharacteristic153:Characteristic) WHERE id(filterCharacteristic153) = 153 WITH filterValue153, childD, ru, u WHERE (filterValue153.value = '60305027689736') 

MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) WHERE id(parentD) = {decisionId} MATCH (childD)<-[:SET_FOR]-(filterValue153:Value)-[:SET_ON]->(filterCharacteristic153:Characteristic) WHERE id(filterCharacteristic153) = 153 WITH filterValue153, childD, ru, u WHERE (filterValue153.value = 'Mon Dec 27 22:35:56 EET 3880') 

Где filterValue153.value хранился как java.util.Date объекта в Value.value узла собственности

@NodeEntity 
public class Value extends Authorable { 

    public final static String NODE_NAME = "Value"; 

    private final static String SET_FOR = "SET_FOR"; 
    private final static String SET_ON = "SET_ON"; 

    @Relationship(type = SET_FOR, direction = Relationship.OUTGOING) 
    private Decision decision; 

    @Relationship(type = SET_ON, direction = Relationship.OUTGOING) 
    private Characteristic characteristic; 

    private Object value; 

... 

} 

на уровне базы данных для Value У меня есть fo llowing данные:

id: 848013 
value: 1482873001556 

ОБНОВЛЕНО

Этот запрос работает отлично

MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) WHERE id(parentD) = {decisionId} MATCH (childD)<-[:SET_FOR]-(filterValue153:Value)-[:SET_ON]->(filterCharacteristic153:Characteristic) WHERE id(filterCharacteristic153) = 153 WITH filterValue153, childD, ru, u WHERE (filterValue153.value = 60305030539682) 

но как иметь дело с датами до 1 января 1970 года, 00:00:00 GMT? Также можно ли применять =, >, < операции в этом запросе Cypher по датам?

ответ

1

Связанный вопрос:

Однако, этот вопрос восходит к 2012 году С тех пор, мы имеем АПБЫ с поддержкой date/time conversion. Это позволяет конвертировать значения даты/времени в форматы, описанные в Javadoc of the SimpleDateFormat class.

Даты до 1970/01/01 будут работать, они будут просто представлены negative numbers. Например:

CALL apoc.date.parseDefault('1969-07-21 02:56:15', 's') 
YIELD value 

арифметических операторов сравнения (=, <>, < ...) будет работать на временных меток.

+0

Спасибо за ваш ответ. Я уточнил свой вопрос с более подробной информацией. Не могли бы вы рассказать, что я делаю неправильно? Кроме того, не могли бы вы показать пример того, как это можно сделать с помощью старых и новых (с APOC) подходов? – alexanoid

+0

Если вы просто вернете узел с этим запросом, какой результат вы получите? 'MATCH (filterCharacteristic153: Characteristic) WHERE id (filterCharacteristic153) = 153 RETURN *' –

+0

Я добавил вывод из моего Neo4j для узла 'Value' – alexanoid