В neo4j, как я могу индексировать по дате и искать в диапазоне дат? - PullRequest
15 голосов
/ 04 февраля 2012

В neo4j, как я могу индексировать по дате и искать в диапазоне дат.Также я бы хотел провести поиск между 8 и 9 часами в диапазоне дат.

Ответы [ 4 ]

23 голосов
/ 05 февраля 2012

Индексируйте даты и время как целочисленные метки времени.Тогда вы можете легко искать в индексе даты между другими отметками времени.Вы также можете отдельно индексировать временную часть временной метки как другое целое число, что позволяет запрашивать определенное время между указанными датами.

Пример: дата и время для хранения - "2012-02-05 8:15AM "Итак, в вашем индексе сохраните" timestamp = 1328447700 "и" time = 815 "

Теперь вы хотите запросить индекс для всех событий между 2012-02-01 и 2012-02-10, которые произошли изС 8:00 до 9:00Это можно сделать, запросив индекс для "timestamp> = 1328072400 и timestamp <= 1328936399 и time> = 800 и time <= 900" </p>

Точный синтаксис для этого зависит от того, как вы подключаетесь к Neo4j (REST или встроенный) и какой язык программирования вы используете.Но идея в любом случае одна и та же.

9 голосов
/ 05 февраля 2012

Есть удобный org.neo4j.index.lucene.LuceneTimeline, который делает это (используя интегрированный индекс lucene в neo4j).

4 голосов
/ 05 февраля 2012

Это продолжение ответа Джоша Аделла.Для удобства чтения я предлагаю иметь два целых поля 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.

1 голос
/ 12 июля 2014
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...