Хранение графа в mongodb - PullRequest
       5

Хранение графа в mongodb

31 голосов
/ 26 февраля 2011

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

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

table 1 
NodeA, NodeB
NodeA, NodeC

table 2 
NodeA, item1
NodeA, item2
NodeB, item3 

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

Ответы [ 5 ]

16 голосов
/ 19 июня 2013

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

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

Здесь приводится сравнение 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 Blueprints как о "JDBC хранения графовых структур" в различных базах данных.Я уверен, что в Tinkerpop Blueprints API есть конкретная реализация MongoDB, которая подойдет вам.Затем, используя Tinkerpop Gremlin, у вас есть все виды продвинутых методов поиска и поиска.

15 голосов
/ 21 августа 2011

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

Каждый узелсодержит массив ключей соседей, например:

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

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

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

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

db.nodes.find({nodeIndex:{$in: [8,15,16,23,42]}}, {myData:1});
8 голосов
/ 26 февраля 2011

См. http://www.mongodb.org/display/DOCS/Trees+in+MongoDB для вдохновения.

2 голосов
/ 07 ноября 2016

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

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

1 голос
/ 15 января 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...