在neo4j中,如何按日期索引并在日期范围内搜索。有时候,我想在日期范围内的早上8点到9点之间进行搜索。
答案 0 :(得分:23)
将日期和时间索引为整数时间戳。然后,您可以轻松地在索引中搜索其他时间戳之间的日期。您还可以将时间戳的时间部分分别索引为另一个整数,以便查询给定日期之间的特定时间。
实施例: 存储的日期和时间是“2012-02-05 8:15 AM” 因此,在索引中,存储“timestamp = 1328447700”和“time = 815”
现在,您要查询2012-02-01和2012-02-10之间从上午8:00到上午9:00发生的所有事件的索引。您可以通过查询索引来实现 “timestamp> = 1328072400,时间戳< = 1328936399,时间> = 800,时间< = 900”
执行此操作的确切语法取决于您如何连接到Neo4j(REST或嵌入式)以及您正在使用的编程语言。但无论如何,这个想法都是一样的。
答案 1 :(得分:9)
有一个方便的org.neo4j.index.lucene.LuceneTimeline可以做到这一点(在neo4j中使用集成的lucene索引)。
答案 2 :(得分:4)
这是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 :(得分: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;