2012-02-04 118 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;