在 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
时间是个好主意吗?如果我要实现它,我会选择20131124
和1130
或1385251200
和41400
(午夜后的秒数:(11*60+30)*60
),这样你可以连接部分并解析@987654327 @format OR 做Calendar.setTimeInMillis
需要显示时将两个值加在一起。
@Phil 似乎在这方面取得了一些进展,关于 GraphAware 的 TimeTree。这仍然是在neo4j中搜索一定范围内时间的最佳方式吗?这个答案似乎非常非常低效,因为我必须将每个值转换为时间戳,然后如果不添加额外的月/年复杂性,则将该值与图中的每个其他节点进行比较。
这可以通过一个简单的密码查询来证明吗?【参考方案2】:
这是对 Josh Adell 答案的扩展。为了可读性,我建议有两个 date
和 time
整数字段,如
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 中,如何按日期索引并在日期范围内搜索?的主要内容,如果未能解决你的问题,请参考以下文章
如何创建包含范围内但不在索引中的日期的 MultiIndex 的笛卡尔积