mongodb graph database

Almacenar un gráfico en mongodb



graph database (5)

Tengo un gráfico no dirigido donde cada nodo contiene una matriz. Los datos se pueden agregar / eliminar de la matriz. ¿Cuál es la mejor manera de almacenar esto en Mongodb y poder hacer esta consulta de manera efectiva: dado el nodo A, seleccione todos los datos contenidos en los nodos adyacentes de A.

En DB relacional, puede crear una tabla que represente los bordes y otra tabla para almacenar los datos en cada nodo.

table 1 NodeA, NodeB NodeA, NodeC table 2 NodeA, item1 NodeA, item2 NodeB, item3

Y luego se une a las tablas cuando consulta los datos en nodos adyacentes. Pero unirse no es posible en MongoDB, entonces, ¿cuál es la mejor manera de configurar esta base de datos y consultar de manera eficiente los datos en nodos adyacentes (lo que favorece el rendimiento ligeramente en el espacio).


Bases de datos de gráficos distribuidos especializados

Sé que esto suena un poco alejado de la pregunta de OP sobre Mongo, pero en estos días hay bases de datos de gráficos más especializadas que sobresalen en este tipo de trabajo y que pueden ser mucho más fáciles de usar, especialmente en gráficos grandes.

Hay una comparación de 7 ofertas de este tipo aquí: https://docs.google.com/spreadsheet/ccc?key=0AlHPKx74VyC5dERyMHlLQ2lMY3dFQS1JRExYQUNhdVE#gid=0

De las tres ofertas de código abierto más importantes (Titan, OrientDB y Neo4J), todas ellas admiten la interfaz Tinkerpop Blueprints. Entonces, para un gráfico que se parece a esto ...

... una consulta para "todas las personas a las que Juno admira mucho y que ella conoce desde el año 2011" se vería así:

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

Esto, por supuesto, es solo la punta del iceberg. ¡Bastante poderoso!

Si tienes que quedarte con Mongo

Piense en Tinkerpop Blueprints como el "JDBC de almacenamiento de estructuras de gráficos" en varias bases de datos. La API Tinkerpop Blueprints tiene una implementación de MongoDB específica que funcionaría para usted, estoy seguro. Luego, utilizando Tinkerpop Gremlin, tiene a su disposición todo tipo de métodos avanzados de búsqueda y cruce.



Estoy recogiendo a mongo, investigando también este tipo de esquema (gráficos no dirigidos, buscando información de los vecinos). Creo que la forma en que me siento favorable hasta ahora se ve así:

Cada nodo contiene una matriz de claves vecinas, como tal.

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

Para buscar datos de vecinos, use $ en "operador" :

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

Puede usar la selección de campo para limitar los resultados a los datos relevantes.

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


MongoDB puede simular un gráfico utilizando una jerarquía de árbol flexible. Es posible que desee considerar neo4j para necesidades gráficas estrictas.


MongoDB introducirá capacidades de gráficos nativos en la versión 3.4 y podría usarse para almacenar estructuras de gráficos y hacer análisis sobre ellas aunque el rendimiento podría no ser tan bueno en comparación con las bases de datos de gráficos nativos como Neo4j dependiendo de los casos, pero es demasiado pronto para juzgar.

Verifique esos enlaces para más información: