В 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;