Hay dos tipos generales de contenedores para los gráficos de almacenamiento:
verdaderas bases de datos del gráfico: por ejemplo, Neo4J, agamemnon, GraphDB, y AllegroGraph; estos no solo almacenan un gráfico, sino que también entienden que es un gráfico, por ejemplo, puede consultar estas bases de datos , por ejemplo, ¿cuántos nodos se encuentran entre la ruta más corta desde nodo X y nodo Y?
contenedores de gráfico estático: Twitter's adaptado a MySQL FlockDB es el ejemplo más conocido aquí. Estos DB pueden almacenar y recuperar los gráficos muy bien; pero para consultar el gráfico en sí, primero tiene que recuperar el gráfico de la Base de Datos y luego usar una biblioteca (por ejemplo, el Networkx excelente de Python ) para consultar el gráfico en sí.
El contenedor gráfico basado en redis discutir a continuación se encuentra en la segunda categoría, aunque aparentemente redis está también bien adaptado para contenedores en la primera categoría como se evidencia por redis-graph, una notablemente pequeño paquete de pitón para la aplicación de una gráfica base de datos en redis.
redis funcionará muy bien aquí.
Redis es un almacén de datos duradero y resistente adecuado para uso en producción, aunque también es lo suficientemente simple como para usarlo en el análisis de línea de comandos.
Redis es diferente de otras bases de datos ya que tiene múltiples tipos de estructura de datos; el que yo recomendaría aquí es hash tipo de datos.El uso de esta estructura de datos redis le permite imitar muy de cerca una "lista de diccionarios", un esquema convencional para almacenar gráficos, en el que cada elemento de la lista es un diccionario de bordes con clave para el nodo desde el que se originan dichos bordes.
Primero debe instalar redis y el cliente de python. El DeGizmo Blog tiene un excelente tutorial "activo" que incluye un guía paso a paso para instalar ambos.
Una vez instalados Redis y su cliente Python, iniciar un servidor Redis, lo que lo hace de esta manera:
cd al directorio en el que instaló Redis (/usr/local/bin en 'nix si instaló a través de make install); siguiente tipo
Redis-servidor en el intérprete de comandos a continuación, introduzca
Ahora debería ver el archivo de registro del servidor de asimetría en su ventana de shell
>>> import numpy as NP
>>> import networkx as NX
>>> # start a redis client & connect to the server:
>>> from redis import StrictRedis as redis
>>> r1 = redis(db=1, host="localhost", port=6379)
En el siguiente fragmento de código, he almacenado un gráfico de cuatro nodos; cada línea a continuación llama a hmset en el cliente redis y almacena un nodo y los bordes conectados a ese nodo ("0" => sin borde, "1" => borde). (En la práctica, por supuesto, sería abstracta estas llamadas repetitivas en una función, aquí estoy mostrando cada llamada, porque lo más probable es más fácil de entender de esa manera.)
>>> r1.hmset("n1", {"n1": 0, "n2": 1, "n3": 1, "n4": 1})
True
>>> r1.hmset("n2", {"n1": 1, "n2": 0, "n3": 0, "n4": 1})
True
>>> r1.hmset("n3", {"n1": 1, "n2": 0, "n3": 0, "n4": 1})
True
>>> r1.hmset("n4", {"n1": 0, "n2": 1, "n3": 1, "n4": 1})
True
>>> # retrieve the edges for a given node:
>>> r1.hgetall("n2")
{'n1': '1', 'n2': '0', 'n3': '0', 'n4': '1'}
Ahora que el gráfico se conserva, recuperarlo del Redis DB como un gráfico de NetworkX.
Hay muchas maneras de hacer esto, a continuación lo hizo en dos * pasos *:
extraer los datos de la base de datos Redis en una matriz adyacencia, implementado como un NumPy 2D formación; entonces
convertir ese directamente a un gráfico NetworkX utilizando un NetworkX incorporada función:
reduce al código, estos dos pasos son:
>>> AM = NP.array([map(int, r1.hgetall(node).values()) for node in r1.keys("*")])
>>> # now convert this adjacency matrix back to a networkx graph:
>>> G = NX.from_numpy_matrix(am)
>>> # verify that G in fact holds the original graph:
>>> type(G)
<class 'networkx.classes.graph.Graph'>
>>> G.nodes()
[0, 1, 2, 3]
>>> G.edges()
[(0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (3, 3)]
Cuando finaliza una sesión redis, puede cerrar el servidor desde el cliente como lo siguiente:
>>> r1.shutdown()
redis guarda en el disco justo antes de que se apague, por lo que esta es una buena forma de garantizar que todas las escrituras se conservaron.
Entonces, ¿dónde está la redis DB? Se almacena en la ubicación predeterminada con el nombre de archivo predeterminado, que es volcado.rdb en su directorio personal.
Para cambiar esto, edite el archivo de redis.conf(incluido con la distribución fuente Redis); ir a la línea que comienza con:
# The filename where to dump the DB
dbfilename dump.rdb
cambio dump.rdb a cualquier cosa que desee, pero deje la extensión .rdb en su lugar.
A continuación, para cambiar la ruta del archivo, encontramos esta línea en redis.conf:
# Note that you must specify a directory here, not a file name
La línea de abajo que es la ubicación del directorio de la base de datos Redis. Edítalo para que recite la ubicación que deseas. Guarde sus revisiones y cambie el nombre de este archivo, pero conserve la extensión .conf. Puede almacenar este archivo de configuración en cualquier lugar, solo proporcione la ruta completa y el nombre de este archivo de configuración personalizada en la misma línea cuando inicie un servidor redis:
Así que la próxima vez que inicie un servidor redis, debe hacer que como tal (de la línea de comandos:.
$> cd /usr/local/bin # or the directory in which you installed redis
$> redis-server /path/to/redis.conf
Finalmente, los Python Package Index listas de un paquete específicamente para la implementación de una base de datos de gráfico en redis el paquete se llama redis-graph y no he utilizado
edité el título de su pregunta y agregué la etiqueta "nosql". En particular, eliminé la referencia en el título a * networkx * porque networkx no requiere un formato/protocolo de gráfico en particular (de hecho, tiene métodos para traducir desde/a todos los formatos comunes), por lo que el hecho de que sus gráficos sean generado a partir de networkx no tiene influencia sobre las posibles respuestas. – doug