В neo4j, как я могу индексировать по дате и искать в диапазоне дат?
В neo4j, как я могу индексировать по дате и искать в диапазоне дат. Кроме того, на время я хотел бы искать между 8 утра и 9 утра в диапазоне дат.
Ответы
Ответ 1
Укажите даты и время как целые временные метки. Затем вы можете легко искать в индексе для дат между другими отметками времени. Вы также можете индексировать временную часть метки времени отдельно как другое целое число, позволяя запрашивать определенное время между заданными датами.
Пример:
Дата и время для хранения - "2012-02-05 8:15 AM"
Поэтому в вашем индексе сохраните "timestamp = 1328447700" и "time = 815"
Теперь вы хотите запросить индекс для всех событий между 2012-02-01 и 2012-02-10, которые произошли с 8:00 до 9:00. Вы делаете это, запрашивая индекс для
"timestamp >= 1328072400 и timestamp <= 1328936399 и time >= 800, а время <= 900"
Точный синтаксис для этого зависит от того, как вы подключаетесь к Neo4j (REST или встроенный) и какой язык программирования вы используете. Но идея в любом случае такая же.
Ответ 2
Там есть удобный org.neo4j.index.lucene.LuceneTimeline, который делает это (с использованием интегрированного индекса lucene в neo4j).
Ответ 3
Это расширение для ответа Джоша Адела. Для удобства чтения я предлагаю наличие двух 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, как 1997-07-16T19:20:30.45Z
.
Отказ от ответственности. У меня есть только минимальный опыт работы с Neo4J.
Ответ 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;