2012-02-04 33 views

Respuesta

23

Indique las fechas y horas como marcas de tiempo enteras. Luego puede buscar fácilmente en un índice las fechas entre otras marcas de tiempo. También puede indexar la parte de tiempo de la marca de tiempo por separado como otro entero, lo que le permite consultar tiempos específicos entre fechas determinadas.

Ejemplo: La fecha y la hora de almacenar es "2012-02-05 08:15 AM" Así que en su índice, tienda "marca de tiempo = 1328447700" y "tiempo = 815"

Ahora quiere para consultar el índice de todos los eventos entre 2012-02-01 y 2012-02-10 que ocurrió de 8:00 a.m. a 9:00 a.m. Usted lo hace mediante la consulta del índice para "marca de tiempo> = 1328072400 y marca de tiempo < = 1328936399 y hora> = 800 y la hora < = 900"

La sintaxis exacta para hacer esto depende de cómo se va a conectar a Neo4j (REST o incrustado) y qué lenguaje de programación está utilizando. Pero la idea es la misma en cualquier caso.

+8

¿Puede explicar por qué es una buena idea mezclar la fecha de época y el tiempo 'ISO8601'? Si tuviera que implementarlo iría con '20131124' y' 1130' O '1385251200' y' 41400' (segundos desde la medianoche: '(11 * 60 + 30) * 60'), de esta manera usted puede Concatenar las partes y analizar un formato 'aaaamMMddHHmmss' O hacer' Calendar.setTimeInMillis' con los dos valores agregados cuando se necesita mostrar. – TWiStErRob

+1

@Phil parece haber habido algún progreso en esto, con respecto al TimeTree de GraphAware. ¿Sigue siendo esta la mejor manera de buscar tiempos dentro de cierto rango en neo4j? Esta respuesta parece ser muy, muy ineficiente, porque tendré que convertir cada valor a una marca de tiempo, y luego comparar ese valor con cada otro nodo en el gráfico si no se agrega complejidad adicional de mes/año. – NumenorForLife

4

Esta es una extensión de la respuesta de Josh Adell. Para facilitar la lectura, Sugiero tener dos date y time campos enteros como

date:19970716 (YYYYMMDD) 
time:203045000 (HHmmssuuu): last three digits for microseconds. 

El tipo de datos puede almacenar hasta int2147483647. Si te sientes aventurero, el tipo de datos long puede almacenar hasta 9223372036854775807. http://docs.neo4j.org/chunked/stable/graphdb-neo4j-properties.html


inspirado en ISO 8601 timestamps como 1997-07-16T19:20:30.45Z.

Descargo de responsabilidad: Tengo solo una experiencia mínima con Neo4J.

+3

Eso es milisegundo no micro. – TWiStErRob

9

Hay una conveniente org.neo4j.index.lucene.LuceneTimeline que hace esto (usando un índice lucene integrado en neo4j).

1
with Spring data neo4j 

    public List<Email> getAllEmailData(Date startDate, Date endDate) { 
      List<Email> list = new ArrayList<Email>(); 
      if (startDate == null || endDate == null) { 
       return null; 
      }    
      long first = ConversionsUtils.convertDateToLong(startDate); 
      long second = ConversionsUtils.convertDateToLong(endDate);   

      try { 
       list = emailRepository.searchAllData(first, second); 
       // System.out.println("List size " +list.size()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return list; 
     } 


     @Query(
       "START email=node:__types__(className='com.backend.core.neo.entities.Email') "    
       + "WHERE email.searchDate > {0} and email.searchDate < {1}" 
       + "RETURN email") 
     List<Email> searchAllData(long startDate, long endDate); 

email entity 

@NodeEntity 
public class Email implements Serializable { 

    private static final long serialVersionUID = 1L; 
    public static final String CC = "CC"; 
    public static final String TO = "TO"; 

    @GraphId 
    private Long id; 

    @GraphProperty 
    private Long senderId; 

    @GraphProperty 
    private String subject;  

    @Indexed 
    // @GraphProperty(propertyType = java.util.Date.class) 
    private String dateSent; 

    @Indexed  
    private long searchDate; 

    @GraphProperty 
    private String emailTxt; 
    @GraphProperty 
    private String emailHtml; 
    @GraphProperty 
    private String emailId; 
    //mail to 
    @Fetch 
    @RelatedTo(elementClass = User.class, type = TO, direction = Direction.OUTGOING) 
    private Set<User> intoUsers; 
    //mail shared 
    @Fetch 
    @RelatedTo(elementClass = User.class, type = CC, direction = Direction.OUTGOING) 
    private Set<User> sharedUsers; 
Cuestiones relacionadas