W neo4j można indeksować według daty i wyszukiwania w zakresie dat. Również na czas chciałbym wyszukać między godziną 8 rano a 9 rano w zakresie dat.W neo4j, jak mogę indeksować według daty i wyszukiwania w zakresie dat?
Odpowiedz
Indeksuj daty i godziny jako znaczniki czasu w liczbach całkowitych. Następnie możesz łatwo wyszukać w indeksie daty między innymi znacznikami czasowymi. Możesz również indeksować część czasu znacznika czasu jako inną liczbę całkowitą, co pozwala na zapytanie o określone czasy między podanymi datami.
Przykład: Data i czas przechowywania jest "2012-02-05 08:15" Więc w indeksie, sklep "timestamp = 1328447700" i "time = 815"
Teraz chcesz zapytanie o indeks dla wszystkich zdarzeń między 2012-02-01 a 2012-02-10, które miały miejsce w godzinach od 8:00 do 9:00. To zrobić poprzez odpytywanie indeks „datownik> = 1328072400 i datownik < = 1328936399 i czasu> = 800 i czas < = 900”
Dokładna składnia robi to zależy od sposobu łączenia się Neo4j (REST lub osadzone) i jakiego języka programowania używasz. Ale pomysł jest taki sam w każdym przypadku.
Czy możesz wyjaśnić, dlaczego mieszanie daty epoki i "ISO8601" jest dobrym pomysłem? Gdybym to zaimplementował, wybrałbym '20131124' i' 1130' lub '1385251200' oraz' 41400' (sekundy od północy: '(11 * 60 + 30) * 60'), w ten sposób możesz albo połącz części i parsuj format 'yyyyMMddHHmmss' LUB wykonaj' Calendar.setTimeInMillis' z dwiema wartościami dodanymi razem, gdy musi zostać wyświetlony. – TWiStErRob
@Phil Wydaje się, że osiągnięto pewien postęp w zakresie TimeTree firmy GraphAware. Czy nadal jest to optymalny sposób na wyszukiwanie czasów w określonym zakresie w neo4j? Ta odpowiedź wydaje się być bardzo, bardzo nieefektywna, ponieważ będę musiał przekonwertować każdą wartość na znacznik czasu, a następnie porównać tę wartość z każdym innym węzłem na wykresie, jeśli nie zostanie dodana dodatkowa złożoność miesiąca/roku. – NumenorForLife
To jest przedłużenie odpowiedzi Josha Adell'a. Dla czytelności, proponuję posiadające dwa date
i time
pól całkowitych jak
date:19970716 (YYYYMMDD)
time:203045000 (HHmmssuuu): last three digits for microseconds.
int
typ danych można przechowywać do połowy 2147483647
. Jeśli masz ochotę na przygodę, typ danych long
może przechowywać do 9223372036854775807
. http://docs.neo4j.org/chunked/stable/graphdb-neo4j-properties.html
Zainspirowany od ISO 8601 timestamps jak 1997-07-16T19:20:30.45Z
.
Oświadczenie: Mam tylko minimalne doświadczenie z Neo4J.
To milisekunda, a nie mikro. – TWiStErRob
Istnieje wygodny org.neo4j.index.lucene.LuceneTimeline, który to robi (przy użyciu zintegrowanego indeksu lucene w neo4j).
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;
Btw, dlaczego nie używać szyfrowania? – Bozho
W jaki sposób szyfr pomaga mi indeksować? – Phil