2012-02-04 120 views

回答

23

將日期和時間索引爲整數時間戳。然後,您可以輕鬆地在索引中搜索其他時間戳之間的日期。您還可以將時間戳的時間部分分別編入另一個整數,以便查詢給定日期之間的特定時間。

例子: 的日期和時間存儲爲「2012-02-05 8:15 AM」 所以在你的索引,存儲「時間戳= 1328447700」和「時間= 815」

現在,你想查詢2012年2月1日至2012年2月10日期間上午8:00至上午9:00發生的所有事件的索引。你這樣做,通過查詢索引 「時間戳> = 1328072400和時間戳< = 1328936399和時間> = 800和時間< = 900」

這樣做的確切語法取決於你如何連接到的Neo4j(REST或嵌入式)以及您正在使用的編程語言。但是這個想法在任何情況下都是一樣的。

+8

你能解釋爲什麼混合時代日期和ISO8601時間是個好主意嗎?如果我要實施它,我會選擇'20131124'和'1130'或'1385251200'和'41400'(午夜以後的秒數:'(11 * 60 + 30)* 60'),這樣您可以連接部件並解析'yyyyMMddHHmmss'格式,或者在需要顯示時將兩個值相加在一起的'Calendar.setTimeInMillis'。 – TWiStErRob 2013-11-24 11:36:03

+1

@Phil關於GraphAware的TimeTree,似乎有一些進展。這仍然是在neo4j中搜索特定範圍內時間的最佳方法嗎?這個答案似乎非常非常低效,因爲我必須將每個值轉換爲時間戳,然後將該值與圖中的每個其他節點進行比較,如果未添加額外的月/年複雜度。 – NumenorForLife 2015-06-12 01:21:45

4

這是Josh Adell的答案的擴展。爲了增強可讀性,我建議有兩個datetime整數領域,如

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

int數據類型可以存儲高達2147483647。如果你感覺冒險,long數據類型可以存儲高達9223372036854775807http://docs.neo4j.org/chunked/stable/graphdb-neo4j-properties.html


ISO 8601 timestamps靈感像1997-07-16T19:20:30.45Z

免責聲明:我對Neo4J的使用經驗很少。

+3

毫秒不微。 – TWiStErRob 2013-11-24 10:59:38

9

有一個方便的org.neo4j.index.lucene.LuceneTimeline這樣做(在neo4j中使用集成的lucene索引)。

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;