Хранение нескольких графиков в Neo4J - PullRequest
16 голосов
/ 11 мая 2011

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

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

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

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

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

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

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

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

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

или

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

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

Ответы [ 2 ]

15 голосов
/ 11 мая 2011

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

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

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

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

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

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

5 голосов
/ 13 марта 2013

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

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

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

...