2012-02-04 16 views
15

Trong neo4j, làm cách nào tôi có thể lập chỉ mục theo ngày và tìm kiếm trong phạm vi ngày. Cũng trong thời gian, tôi cũng muốn tìm kiếm từ 8 giờ sáng đến 9 giờ sáng trong một phạm vi ngày.Trong neo4j, làm thế nào tôi có thể lập chỉ mục theo ngày và tìm kiếm trong một phạm vi ngày?

+1

Btw, tại sao không sử dụng Mật mã? – Bozho

+2

Mật mã sẽ giúp tôi lập chỉ mục như thế nào? – Phil

Trả lời

23

Lập chỉ mục ngày và giờ làm dấu thời gian số nguyên. Sau đó, bạn có thể dễ dàng tìm kiếm trong chỉ mục cho các ngày giữa các dấu thời gian khác. Bạn cũng có thể lập chỉ mục phần thời gian của dấu thời gian riêng biệt như một số nguyên khác, cho phép bạn truy vấn thời gian cụ thể giữa các ngày đã cho.

Ví dụ: Ngày và thời gian để lưu trữ là "2012/02/05 08:15" Vì vậy, trong chỉ số của bạn, lưu trữ "timestamp = 1328447700" và "thời gian = 815"

Bây giờ bạn muốn để truy vấn chỉ mục cho tất cả các sự kiện từ 2012-02-01 đến 2012-02-10 diễn ra từ 8:00 sáng đến 9:00 sáng. Bạn làm điều đó bằng cách truy vấn các chỉ số cho "timestamp> = 1328072400 và timestamp < = 1328936399 và thời gian> = 800 và thời gian < = 900"

Cú pháp chính xác để làm điều này phụ thuộc vào cách bạn đang kết nối Neo4j (REST hoặc được nhúng) và ngôn ngữ lập trình nào bạn đang sử dụng. Nhưng ý tưởng là như nhau trong mọi trường hợp.

+8

Bạn có thể giải thích tại sao trộn ngày epoch và thời gian 'ISO8601' là một ý tưởng hay không? Nếu tôi thực hiện nó, tôi sẽ đi với '20131124' và' 1130' OR '1385251200' và' 41400' (giây kể từ nửa đêm: '(11 * 60 + 30) * 60'), theo cách này bạn có thể ghép các phần và phân tích một định dạng 'yyyyMMddHHmmss' HOẶC làm' Calendar.setTimeInMillis' với hai giá trị được thêm vào với nhau khi cần hiển thị. – TWiStErRob

+1

@Phil dường như đã có một số tiến bộ về điều này, liên quan đến TimeTree của GraphAware. Đây có phải là cách tối ưu để tìm kiếm thời gian trong một phạm vi nhất định trong neo4j không? Câu trả lời này có vẻ rất, rất kém hiệu quả, bởi vì tôi sẽ phải chuyển đổi mọi giá trị thành dấu thời gian, và sau đó so sánh giá trị đó với mọi nút khác trong biểu đồ nếu thêm độ phức tạp tháng/năm. – NumenorForLife

4

Đây là phần mở rộng cho câu trả lời của Josh Adell. Đối với khả năng đọc, tôi khuyên bạn nên có hai datetime lĩnh vực nguyên như

date:19970716 (YYYYMMDD) 
time:203045000 (HHmmssuuu): last three digits for microseconds. 

Các int datatype có thể lưu trữ tối đa 2147483647. Nếu bạn cảm thấy thích mạo hiểm, kiểu dữ liệu long có thể lưu trữ tối đa 9223372036854775807. http://docs.neo4j.org/chunked/stable/graphdb-neo4j-properties.html


Lấy cảm hứng từ ISO 8601 timestamps như 1997-07-16T19:20:30.45Z.

Tuyên bố từ chối: Tôi chỉ có ít kinh nghiệm với Neo4J.

+3

Đó là mili giây không vi mô. – TWiStErRob

9

Có một org.neo4j.index.lucene.LuceneTimeline thuận tiện thực hiện điều này (sử dụng chỉ mục lucene tích hợp trong neo4j).

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; 
Các vấn đề liên quan