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

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

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

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

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

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

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

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

Я тоже могу:

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

or

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

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


person emh    schedule 11.05.2011    source источник
comment
после некоторого чтения мне интересно, являются ли ссылочные узлы ключевыми? я мог бы создать эталонный узел для каждого дня, а затем построить график этого дня по его эталонному узлу ...   -  person emh    schedule 11.05.2011
comment
Привет, я думаю, что использование узлов exntry для графиков и, возможно, индексирование их с помощью какого-либо свойства, чтобы вы могли найти их не только на ссылочном узле, но и с помощью поиска по индексу, здесь может помочь. Может ли индексирование определенных свойств метаданных ваших узлов входа подграфа дать вам правильную отправную точку?   -  person Peter Neubauer    schedule 11.05.2011


Ответы (3)


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

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

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

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

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

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

person Michael Hunger    schedule 11.05.2011
comment
Ссылка на список рассылки не работает - person keyser; 12.02.2015

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

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

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

person bendaizer    schedule 13.03.2013
comment
Можете ли вы пролить свет на то, как динамически ссылаться на путь к базе данных графа в запросе шифрования. Заранее спасибо... - person KarthikS; 20.10.2014

Это старый вопрос, но, начиная с Neo4j 4.x, поддерживается мультитенантность, и вы можете иметь разные базы данных на одном сервере Neo4j (с разными разрешениями RBAC).

person fbiville    schedule 18.01.2021