在 neo4j 中,如何按日期索引并在日期范围内搜索?

Posted

技术标签:

【中文标题】在 neo4j 中,如何按日期索引并在日期范围内搜索?【英文标题】:In neo4j, how can I index by date and search in a date range? 【发布时间】:2012-02-26 16:09:39 【问题描述】:

在 neo4j 中,我如何按日期索引并在日期范围内搜索。有时,我也想在一个日期范围内搜索上午 8 点到 9 点之间。

【问题讨论】:

顺便说一句,为什么不使用 Cipher? cipher 将如何帮助我建立索引? 【参考方案1】:

将日期和时间索引为整数时间戳。然后,您可以轻松地在索引中搜索其他时间戳之间的日期。您还可以将时间戳的时间部分单独索引为另一个整数,允许您查询给定日期之间的特定时间。

示例: 存储的日期和时间是“2012-02-05 8:15 AM” 所以在你的索引中,存储“timestamp=1328447700”和“time=815”

现在您要查询 2012 年 2 月 1 日到 2012 年 2 月 10 日上午 8:00 到 9:00 之间发生的所有事件的索引。你可以通过查询索引来做到这一点 "timestamp>=1328072400 and timestamp=800 and time

执行此操作的确切语法取决于您连接到 Neo4j(REST 或嵌入式)的方式以及您使用的编程语言。但无论如何,想法都是一样的。

【讨论】:

你能解释一下为什么混合纪元日期和ISO8601时间是个好主意吗?如果我要实现它,我会选择201311241130138525120041400(午夜后的秒数:(11*60+30)*60),这样你可以连接部分并解析@987654327 @format OR 做Calendar.setTimeInMillis 需要显示时将两个值加在一起。 @Phil 似乎在这方面取得了一些进展,关于 GraphAware 的 TimeTree。这仍然是在neo4j中搜索一定范围内时间的最佳方式吗?这个答案似乎非常非常低效,因为我必须将每个值转换为时间戳,然后如果不添加额外的月/年复杂性,则将该值与图中的每个其他节点进行比较。 这可以通过一个简单的密码查询来证明吗?【参考方案2】:

这是对 Josh Adell 答案的扩展。为了可读性,我建议有两个 datetime 整数字段,如

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

int 数据类型最多可以存储2147483647。如果您喜欢冒险,long 数据类型最多可以存储9223372036854775807。 http://docs.neo4j.org/chunked/stable/graphdb-neo4j-properties.html


灵感来自ISO 8601 timestamps,如1997-07-16T19:20:30.45Z

免责声明:我对 Neo4J 的经验很少。

【讨论】:

那是毫秒而不是微秒。【参考方案3】:

有一个方便的 org.neo4j.index.lucene.LuceneTimeline 可以做到这一点(使用 neo4j 中的集成 lucene 索引)。

【讨论】:

【参考方案4】:
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;

【讨论】:

以上是关于在 neo4j 中,如何按日期索引并在日期范围内搜索?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中按日期范围过滤记录?

如何创建包含范围内但不在索引中的日期的 MultiIndex 的笛卡尔积

如何在 Neo4j 中根据日期顺序创建关系

遍历 Pandas Dataframe 中定义的日期时间索引范围

如何在 Hive SQL 中按日期范围独家加入?

如何按日期合并 DF,仅使用日期和月份,使用指定的日期范围