2012-02-04 9 views

Odpowiedz

23

Indeksuj daty i godziny jako znaczniki czasu w liczbach całkowitych. Następnie możesz łatwo wyszukać w indeksie daty między innymi znacznikami czasowymi. Możesz również indeksować część czasu znacznika czasu jako inną liczbę całkowitą, co pozwala na zapytanie o określone czasy między podanymi datami.

Przykład: Data i czas przechowywania jest "2012-02-05 08:15" Więc w indeksie, sklep "timestamp = 1328447700" i "time = 815"

Teraz chcesz zapytanie o indeks dla wszystkich zdarzeń między 2012-02-01 a 2012-02-10, które miały miejsce w godzinach od 8:00 do 9:00. To zrobić poprzez odpytywanie indeks „datownik> = 1328072400 i datownik < = 1328936399 i czasu> = 800 i czas < = 900”

Dokładna składnia robi to zależy od sposobu łączenia się Neo4j (REST lub osadzone) i jakiego języka programowania używasz. Ale pomysł jest taki sam w każdym przypadku.

+8

Czy możesz wyjaśnić, dlaczego mieszanie daty epoki i "ISO8601" jest dobrym pomysłem? Gdybym to zaimplementował, wybrałbym '20131124' i' 1130' lub '1385251200' oraz' 41400' (sekundy od północy: '(11 * 60 + 30) * 60'), w ten sposób możesz albo połącz części i parsuj format 'yyyyMMddHHmmss' LUB wykonaj' Calendar.setTimeInMillis' z dwiema wartościami dodanymi razem, gdy musi zostać wyświetlony. – TWiStErRob

+1

@Phil Wydaje się, że osiągnięto pewien postęp w zakresie TimeTree firmy GraphAware. Czy nadal jest to optymalny sposób na wyszukiwanie czasów w określonym zakresie w neo4j? Ta odpowiedź wydaje się być bardzo, bardzo nieefektywna, ponieważ będę musiał przekonwertować każdą wartość na znacznik czasu, a następnie porównać tę wartość z każdym innym węzłem na wykresie, jeśli nie zostanie dodana dodatkowa złożoność miesiąca/roku. – NumenorForLife

4

To jest przedłużenie odpowiedzi Josha Adell'a. Dla czytelności, proponuję posiadające dwa date i time pól całkowitych jak

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

int typ danych można przechowywać do połowy 2147483647. Jeśli masz ochotę na przygodę, typ danych long może przechowywać do 9223372036854775807. http://docs.neo4j.org/chunked/stable/graphdb-neo4j-properties.html


Zainspirowany od ISO 8601 timestamps jak 1997-07-16T19:20:30.45Z.

Oświadczenie: Mam tylko minimalne doświadczenie z Neo4J.

+3

To milisekunda, a nie mikro. – TWiStErRob

9

Istnieje wygodny org.neo4j.index.lucene.LuceneTimeline, który to robi (przy użyciu zintegrowanego indeksu lucene w 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;