Базы данных временных графиков для данных на основе событий

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

Пример:

  • Ящик № 1 находится в локации А 15 февраля 2015 г., 10:00.
  • Ящик №1 был помещен в ящик №2 15 февраля 2015 г. в 10:15.
  • Ящик № 2 был помещен в ящик № 3 15 февраля 2015 г., 11:00.
  • Ящик № 3 находится в локации B в 2015-02-16 03:00.
  • Ящик № 2 был удален из ящика № 3 16 февраля 2015 г., 04:30.
  • Ящик №3 находится в локации C на 16.02.2015, 05:00.

У меня есть три основных требования:

  1. Я должен быть в состоянии сказать, где все мои ящики на момент запроса прямо сейчас. например Запрос в 2015-02-16 06:00 должен дать результат. Ящик №1 находится внутри ящика №2 в месте B. Ящик №3 находится в месте C и внутри него ничего нет.
  2. Я должен иметь возможность видеть все, что произошло с конкретным ящиком. например Для коробки №1:

    • Was at Location A at 2015-02-15 10:00
    • Был помещен в коробку №2 15 февраля 2015 г., 10:15.
    • Был внутри ящика №2, который был помещен в ящик №3 15 февраля 2015 г., 11:00.
    • Был внутри ящика № 2, который находился в ящике № 3, который находился в локации B 16 февраля 2015 г., 03:00.
    • Находился внутри ящика № 2, который был удален из ящика № 3 16 февраля 2015 г., 04:30.
  3. Я должен быть в состоянии сказать, где находятся все ящики в определенное время. например 16 февраля 2015 г., 10:30, ящик №1 находился внутри ящика №2 в месте А.

Я рассматривал графовые базы данных, поскольку они справляются с этим типом отношений лучше, чем реляционная база данных (попытка выполнить рекурсивный запрос в Sql непроста). Похоже, мне понадобится узел Box, узел Location и ребра между ними для отношений «Внутри» и «В». Но я не уверен, как включить временное требование в графовую модель. Я просмотрел это, но не знаю, как заставить его работать с моими требованиями.

Также обратите внимание: это должно масштабироваться до 1-4 миллиардов ящиков, каждый из которых имеет от 1 до 5000 событий. И быть в состоянии обрабатывать тысячи событий, поступающих в секунду


person Kyro    schedule 07.05.2015    source источник


Ответы (1)


Интересная проблема

Вот несколько примеров данных, созданных для вашего примера. Это одна из возможных реализаций вашей проблемы.

// create the boxes and the locations and add relationships
// between them. On each relationship add a time.
create (b1:Box {name: 'Box #1'}) 
create (b2:Box {name: 'Box #2'}) 
create (b3:Box {name: 'Box #3'}) 
create (lA:Location {name: 'A'})
create (lB:Location {name: 'B'})
create (lC:Location {name: 'C'})
create b1-[:AT {time: '2015-02-15 10:00'}]->lA
create b1-[:INSIDE {time: '2015-02-15 10:15'}]->b2
create b2-[:INSIDE {time: '2015-02-15 11:00'}]->b3
create b3-[:AT {time: '2015-02-16 03:00'}]->lB
create b2-[:REMOVED {time: '2015-02-16 04:30'}]->b3
create b3-[:AT {time: '2015-02-16 05:00'}]->lC
return *

Изображение примера графика

Вот запрос для опроса графа, начинающегося с определенного поля. Общая стратегия заключалась в том, чтобы оттянуть направленную цепочку ящиков назад. В этом примере я просто взял самую длинную цепочку. Вероятно, было бы более полным вернуть каждый путь, упорядочить их по времени и выбрать путь с самым последним временем.

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

match p=(b:Box {name: 'Box #1'})-[:INSIDE|REMOVED*]->(:Box)
with p
order by length(p) desc
limit 1
with nodes(p) as boxes
unwind boxes as box
optional match box-[rel:AT|INSIDE|REMOVED]->(box_spot)
return rel.time as Time
, box.name as Box
, type(rel) as Directive
, box_spot.name as Spot
order by rel.time

Это определенно можно улучшить и улучшить с помощью большего количества вариантов использования. Модель была бы не очень хороша для запроса модели по времени. Времена - это строки в отношениях. На этот раз neo4j не позволяет индексировать свойства отношений. Я думаю, что модель работает довольно хорошо для выбора коробки и следования за ней до конца.

введите здесь описание изображения

person Dave Bennett    schedule 07.05.2015