2014-01-22 2 views
1

Давайте предположим, что этот случай использования:Neo4j/индексируются свойство VS создания различных узлов

«Получить все прошедшие события между 2013/05/12 20:00 в 2013/05/14 21:00».

Первый способ достичь этого случая в Neo4j было бы сделать свойство индексируются:
Event (startAt: ..., EnDAT: ...) (startAt и endAt индексируется)

Это приведет к сканированию всех событий, имеющих свои свойства, соответствующие фактическому запросу.

Другой способ, который я только что прочитал:

enter image description here

Вопрос: Является ли в срок выполнения узла обхода гораздо лучше, чем иметь дело с индексированных свойств для дат в этом случае?

ответ

5

Является ли обход узла намного лучше (в многоуровневом индексе datetime) с точки зрения производительности, чем дело с индексированными свойствами для дат в этом случае?

Нет, индексированные свойства для дат более результативные, чем обходы для этого типа структуры данных.

Подробный пример использования гибридного подхода. Рассмотрим следующий подграф, где elipses указывают на продолжающийся рисунок на графике.

Multilevel Calendar Index

Пожалуйста, обратите внимание на https://gist.github.com/kbastani/8519557 за полный календарь Cypher сценариев, которые получают или создать (сливающихся) многоуровневый индекс DATETIME. Эта структура данных позволяет вам перемещаться с одной даты на другую, чтобы получить диапазон событий для временного ряда. Комбинация сопоставления индексированных свойств и обходов является наилучшим подходом и выполняется при правильной моделировке.

Example Data Model for Time

Например, рассмотрим следующий 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 минутам.

4

Лучший способ проектирования времени дерево линии (особенно в тех случаях, когда вы хотите искать между периодами интервалов): here

Cypher обходы, чтобы найти правильное мероприятие, было бы лучше, если вы больше заинтересованы в нахождение диапазона событий, происходящих между временным интервалом.

Neo4j сохраняет свойства узла в качестве связанного списка. Дополнительная информация: here Если вы перейдете к архитектуре хранения neo4j, вы поймете, что создание уникальных отношений, которые сделают ваш обход еще более качественным.

Смежные вопросы