Является ли обход узла намного лучше (в многоуровневом индексе datetime) с точки зрения производительности, чем дело с индексированными свойствами для дат в этом случае?
Нет, индексированные свойства для дат более результативные, чем обходы для этого типа структуры данных.
Подробный пример использования гибридного подхода. Рассмотрим следующий подграф, где elipses указывают на продолжающийся рисунок на графике.
Пожалуйста, обратите внимание на https://gist.github.com/kbastani/8519557 за полный календарь Cypher сценариев, которые получают или создать (сливающихся) многоуровневый индекс DATETIME. Эта структура данных позволяет вам перемещаться с одной даты на другую, чтобы получить диапазон событий для временного ряда. Комбинация сопоставления индексированных свойств и обходов является наилучшим подходом и выполняется при правильной моделировке.
Например, рассмотрим следующий Cypher запрос:
// What staff have been on the floor for 80 minutes or more on a specific day?
WITH { day: 18, month: 1, year: 2014 } as dayMap
// The dayMap field acts as a parameter for this script
MATCH (day:Day { day: dayMap.day, month: dayMap.month, year: dayMap.year }),
(day)-[:FIRST|NEXT*]->(hours:Hour),
(hours)<-[:BEGINS]-(shift:Event),
(shift)<-[:WORKED]-(employee:Employee)
WITH shift, employee
ORDER BY shift.timestamp DESC
WITH employee, head(collect(shift)) as shift
MATCH (shift)<-[:CONTINUE*]-(shifts)
WITH employee.firstname as first_name,
employee.lastname as last_name,
SUM(shift.interval) as time_on_floor
// Only return results for staff on the floor more than 80 minutes
WHERE time_on_floor >= 80
RETURN first_name, last_name, time_on_floor
В этом запросе мы задаем базу данных «Какие сотрудники были на полу в течение 80 минут подряд или более на конкретный день?" где сдвиги разбиваются на 20-минутные непрерывные интервалы, указывающие на следующий в серии как CONTINUE или BREAK.
Сначала вы начинаете с сопоставления дня с помощью индексированных свойств. Затем вы просматриваете часы дня для связанных событий, перемещая многоуровневый индекс datetime. Затем измените порядок событий, чтобы получить самое последнее событие из серии. Затем пройдите до тех пор, пока не возникнет связь «BREAK». Наконец, примените условие time_on_floor больше или равно 80 минутам.