Подтвердить что ты не робот

Сохранение графика в mongodb

У меня есть неориентированный граф, где каждый node содержит массив. Данные могут быть добавлены/удалены из массива. Какой лучший способ сохранить это в Mongodb и иметь возможность эффективно выполнять этот запрос: учитывая node A, выберите все данные, содержащиеся в соседних узлах A.

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

table 1 
NodeA, NodeB
NodeA, NodeC

table 2 
NodeA, item1
NodeA, item2
NodeB, item3 

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

4b9b3361

Ответ 1

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

Каждый node содержит массив соседних ключей, например.

{
 nodeIndex: 4
 myData: "data"
 neighbors: [8,15,16,23,42]
}

Чтобы найти данные от соседей, используйте $в "operator" :

db.nodes.find({nodeIndex:{$in: [8,15,16,23,42]}});

Вы можете использовать выбор поля, чтобы ограничить результаты соответствующими данными.

db.nodes.find({nodeIndex:{$in: [8,15,16,23,42]}}, {myData:1});

Ответ 2

Специализированные базы данных с распределенным графом

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

Здесь представлено сравнение 7 таких предложений: https://docs.google.com/spreadsheet/ccc?key=0AlHPKx74VyC5dERyMHlLQ2lMY3dFQS1JRExYQUNhdVE#gid=0

Из трех наиболее значимых предложений с открытым исходным кодом (Titan, OrientDB и Neo4J) все они поддерживают интерфейс Tinkerpop Blueprints. Итак, для графа, который выглядит так...

enter image description here

... запрос для "всех людей, которых Юнона очень восхищает, кого она знала с 2011 года", будет выглядеть так:

Iterable<Vertex> results = juno.query().labels("knows").has("since",2011).has("stars",5).vertices()

Это, конечно, только верхушка айсберга. Довольно мощный материал!

Если вы останетесь с Mongo

Подумайте о чертежах Tinkerpop как "JDBC хранения структур графа" в различных базах данных. API-интерфейс Tinkerpop Blueprints имеет определенную реализацию MongoDB, которая будет работать для вас. Я уверен. Затем, используя Tinkerpop Gremlin, у вас есть всевозможные расширенные методы обхода и поиска.

Ответ 4

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

Ответ 5

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

Проверьте эти ссылки для получения дополнительной информации: