Хранение нескольких графиков в Neo4J

У меня есть приложение, которое хранит информацию о взаимоотношениях в таблице MySQL (contact_id, other_contact_id, strength, records_at). Это нормально, если все, что мне нужно сделать, это показать, с какими контактными отношениями или даже создать список взаимных контактов для двух контактов.

Но теперь мне нужно генерировать статистику, например: "какое общее число 2-позиционных соединений силы 3 или лучше в январе 2011 года" (или если предполагается, что каждый контакт является частью группы), в какой группе больше всего количество подключений к другим группам и т.д.

Я быстро обнаружил, что SQL для создания этих статистических данных быстро стал громоздким.

Итак, я написал script, что для любой заданной даты он будет генерировать график в памяти. Я мог бы запустить любой стат, который я хотел бы получить от этого графика. Гораздо проще понять и в целом, гораздо более результативно - кроме генерации графа.

Моя следующая мысль заключалась в том, чтобы кэшировать эти графики, чтобы я мог называть их всякий раз, когда мне нужно было запускать новый stat (или генерировать более поздний график: например, для сегодняшнего графика я беру вчера график и применяю любые изменения, которые произошли со вчерашнего дня). Я пробовал memcached, который отлично работал, пока графики не выросли > 1 МБ.

Итак, теперь я думаю об использовании базы данных графа, например Neo4J.

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

Итак, могу ли я:

  • хранить несколько графиков в Neo4J и rertrieve/взаимодействовать с ними отдельно? Затем я создавал и хранили отдельные социальные графики для каждой даты.

или

  • добавить к отметке времени и от временных меток к каждому краю и соответствующим образом отфильтровать график: так что, если бы мне нужен график для "1 мая", я бы выполнил только последний край между двумя нумерами, созданный до "1 мая" (и если все ребра были созданы после 1 мая, тогда эти узлы не будут связаны).

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

Ответы

Ответ 1

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

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

Ссылка node имеет другое значение в Neo4j.

Использование узлов категории в день (и их связывание, а также их объединение для более высоких уровней времени) - это более графический способ категоризации узлов, чем индексированные свойства. (Эффективно это индексы в графе, которые вы можете легко включить в свои обходные и графические запросы).

Вам не нужно дублировать узлы, пока вас интересуют только разные временные структуры. Если ваши узлы также различны (например, изменение свойств, вы можете их дублировать и эффективно создавать разные подграфы) или создать связанный список узлов истории на каждом node, который содержит только изменения (или полный моментальный снимок в зависимости от вашего требования).

Ваш домен отлично подходит для базы данных графа. Если у вас есть более подробные вопросы, вы можете присоединиться к списку рассылки Neo4j .

Ответ 2

Не самое простое решение (я предполагаю, что вы работаете только с одной машиной), но если вы действительно хотите отделить свои графики, вам нужно только помнить, что график - это каталог.

Затем вы можете создать динамический класс загрузчика, который берет путь к базе данных, которую вы хотите, загружать в память для запроса и закрывать ее после получения ответа. Вы также можете настроить прокси-сервер и отправить 2 параметра вашему загрузчику: ваш запрос (который, как я полагаю, представляет собой запрос cypher в этом случае) и путь к базе данных, которую вы хотите запросить.

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