Neo4j - реестр казино 24/7
Это серия новых вопросов в ответ на ответ Кенни на мой предыдущий вопрос о том, как смоделировать базу данных вокруг списка казино 24/7. Модель базы данных для круглосуточного списка сотрудников в казино
Все еще пытаюсь разобраться с графиками и тем, как данные передаются / соединяются. С графиком времени в верхней половине изображения в ответе Кенни, каждый год имеет 12-месячные узлы, которые затем указывают на ряд дневных узлов, где имеется более одного дневного узла со значением 1 для 1-го дня в месяц? Буду ли я строить эти подграфы для каждого года или я буду использовать определенный запрос, который добавляет узел (ы), который не существует с течением времени? Я понимаю, что есть запрос, который может сделать это, но он должен был бы учесть последний день в узле месяца и создать правильные конечные отношения? Будут ли у меня проблемы с високосными годами или переходом на летнее время?
На нижней половине изображения ответа находятся игровые узлы, у них только один сотрудник и отношение местоположения? Я не уверен, каким образом я мог бы определить, какой сотрудник назначен какой таблице (без добавления свойств к ребрам отношений), мне следует добавлять свойства к ребрам или использовать отдельный узел для каждой пары?
Я сделал грубое изображение, чтобы показать, как выглядит список пера / бумаги, это может быть полезно в некотором роде.
Я также попытался спланировать график с некоторыми вопросами (красные прямоугольники), это было сделано в иллюстраторе и получилось немного запутанным, я хотел бы знать, было ли изображение графика Кенни выполнено в конкретном приложении, и если да, то какой именно Хотя я так понимаю, графики визуально имеют тенденцию запутываться и запутываться.
Не кажется, что вы можете щелкнуть изображение для прямой ссылки, где текст читается, вы можете просмотреть его здесь: https://i.imgur.com/FMfJx6G.png
Если это поможет, я мог бы добавить текст вопросов здесь или воссоздать график с предложенным программным обеспечением.
1 ответ
Вот оригинальное изображение из базы данных для списка сотрудников 24/7 в казино:
С графиком времени в верхней половине изображения в ответе Кенни, каждый год имеет 12-месячные узлы, которые затем указывают на ряд дневных узлов, где имеется более одного дневного узла со значением 1 для 1-го дня в месяц?
Да, это правильно. Я смоделировал это на изображении ниже.
Буду ли я строить эти подграфы для каждого года или я буду использовать определенный запрос, который добавляет узел (ы), который не существует с течением времени? Я понимаю, что есть запрос, который может сделать это, но он должен был бы учесть последний день в узле месяца и создать правильные конечные отношения?
Я создал скрипт Cypher, который создает многоуровневый индекс времени для года, месяца, дня и часа. Вы можете найти это здесь:
https://gist.github.com/kbastani/8519557
Например, чтобы создать все часы в дне, мы можем объединить любой день, а затем добавить структуру года. Это одно из преимуществ оператора MERGE Cypher. Запрос Cypher для создания многоуровневого индекса даты и времени является "отказоустойчивым", если вы выполняете его несколько раз, он не будет создавать дубликаты или портить структуру данных.
Вот скрипт Cypher для объединения двухуровневой иерархии дня и часа:
// Enter the day you would like to create
WITH { day: 18, month: 1, year: 2014 } as dayMap
// Merge hours in a day
MERGE (thisDay:Day
{
day: dayMap.day,
month: dayMap.month,
year: dayMap.year
})
// Get the first hour in the day (hour 1)
MERGE (firstHour:Hour
{
day: dayMap.day,
month: dayMap.month,
year: dayMap.year,
hour: 1
})
// Connect this day to first hour
CREATE (thisDay)-[:FIRST]->(firstHour)
// For each i in (2-24)
FOREACH (i IN tail(range(1, 24)) |
// Get this hour
MERGE (thishour:Hour
{
day: dayMap.day,
month: dayMap.month,
year: dayMap.year,
hour: i
})
// Get the hour before this hour
MERGE (lasthour:Hour
{
day: dayMap.day,
month: dayMap.month,
year: dayMap.year,
hour: i - 1
})
// Link the hours
CREATE (lasthour)-[:NEXT]->(thishour))
// Get the last hour in the sequence (hour 24)
MERGE (lastHour:Hour
{
day: dayMap.day,
month: dayMap.month,
year: dayMap.year,
hour: 24
})
// Connect this day to the last hour
CREATE (thisDay)-[:LAST]->(lastHour)
Будут ли у меня проблемы с високосными годами или переходом на летнее время?
Нет, это не должно быть проблемой, но может зависеть от вопросов, которые вы задаете. Это зависит от контекста. Поскольку мы не зависим от структуры данных при создании календаря в пользовательском интерфейсе, а вместо этого отвечаем только на конкретные вопросы о конкретном дне, правила наследуются от ваших импортированных данных.
На нижней половине изображения ответа находятся игровые узлы, у них только один сотрудник и отношение местоположения? Я не уверен, каким образом я мог бы определить, какой сотрудник назначен какой таблице (без добавления свойств к ребрам отношений), мне следует добавлять свойства к ребрам или использовать отдельный узел для каждой пары?
Существует один узел сотрудника и один узел местоположения. Таким образом, вы можете начать с узла сотрудника или узла местоположения, чтобы понять определенные вещи об этом объекте и о том, как он связан с другими объектами.
Я также попытался спланировать график с некоторыми вопросами (красные прямоугольники), это было сделано в иллюстраторе и получилось немного запутанным, я хотел бы знать, было ли изображение графика Кенни выполнено в конкретном приложении, и если да, то какой именно Хотя я так понимаю, графики визуально имеют тенденцию запутываться и запутываться.
Инструмент, который я использую для создания изображений моделей данных графа, http://www.apcjones.com/arrows/
Чтобы соединить узлы, просто выделите указатель мыши на внешней стороне круга узла и щелкните и перетащите связь на другой узел. Это небольшое приложение с открытым исходным кодом и работает только в браузере Chrome.
Что касается вашей полной модели данных, я создал пример набора данных Cypher, потому что я действительно думал, что ваш домен интересен. Вы можете найти эти запросы здесь: https://gist.github.com/kbastani/8529380
Вот модель данных, которую я использовал:
И возвращаясь к вашему предыдущему посту, у вас возник вопрос:
Какой персонал был на полу в течение 80 или более минут в определенный день?
Вот запрос 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]-(game:Game),
(game)<-[:DEALS]-(employee:Employee)
WITH game, employee
ORDER BY game.timestamp DESC
WITH employee, head(collect(game)) as game
MATCH (game)<-[:CONTINUE*]-(games)
WITH employee.firstname as first_name,
employee.lastname as last_name,
SUM(games.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