Существует два основных типа контейнеров для хранения графиков:
настоящие графические базы данных, например, Neo4J, agamemnon, GraphDB и AllegroGraph; они не только хранят граф, но также понимают, что граф есть, поэтому, например, вы можете запросить эти базы данных, например, сколько узлов находится между кратчайшим путем от узла X до узла Y?
контейнеры статического графа: FlockDB, адаптированная для MySQL, является наиболее известным примером. Эти БД могут прекрасно хранить и извлекать графики; но чтобы запросить сам график, вы должны сначала получить график из БД, а затем использовать библиотеку (например, отличный Networkx Python) для запроса самого графика.
Графический контейнер на основе Redis, который я обсуждаю ниже, относится ко второй категории, хотя очевидно, что Redis также хорошо подходит для контейнеров из первой категории, о чем свидетельствует redis-graph, удивительно маленький пакет Python для реализации графовой базы данных в Redis.
redis прекрасно подойдет здесь.
Redis — это мощное и надежное хранилище данных, подходящее для производственного использования, но при этом достаточно простое для анализа из командной строки.
Redis отличается от других баз данных тем, что имеет несколько типов структур данных; я бы порекомендовал здесь тип данных hash. Использование этой структуры данных Redis позволяет вам очень точно имитировать «список словарей», обычную схему для хранения графов, в которой каждый элемент в списке представляет собой словарь ребер, связанных с узлом, из которого эти ребра происходят.
Сначала необходимо установить redis и клиент Python. В блоге DeGizmo есть отличное обучающее руководство, которое содержит пошаговое руководство по установке обоих.
После установки redis и его клиента python запустите сервер redis, как это делается:
cd в каталог, в который вы установили Redis (/usr/local/bin на 'nix, если вы установили с помощью make install); следующий
введите redis-server в командной строке, затем введите
теперь вы должны увидеть файл журнала сервера в окне вашей оболочки
>>> 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)
В приведенном ниже фрагменте я сохранил граф с четырьмя узлами; каждая строка ниже вызывает hmset в клиенте Redis и сохраняет один узел и ребра, связанные с этим узлом ("0" => нет ребра, "1" => ребро). (На практике, конечно, вы бы абстрагировали эти повторяющиеся вызовы в функцию; здесь я показываю каждый вызов, потому что так, вероятно, легче понять.)
>>> 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'}
Теперь, когда граф сохранен, извлеките его из базы данных Redis в виде графа NetworkX.
Есть много способов сделать это, ниже мы сделали это в два *этапа*:
извлечь данные из базы данных Redis в матрицу смежности, реализованную в виде двумерного массива NumPy; тогда
преобразуйте это непосредственно в график NetworkX с помощью встроенной функции NetworkX:
сведены к коду, эти два шага таковы:
>>> 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)]
Когда вы завершаете сеанс Redis, вы можете отключить сервер от клиента следующим образом:
>>> r1.shutdown()
Redis сохраняет на диск непосредственно перед выключением, так что это хороший способ обеспечить сохранение всех записей.
Так где же Redis DB? Он хранится в расположении по умолчанию с именем файла по умолчанию (dump.rdb) в вашем домашнем каталоге.
Чтобы изменить это, отредактируйте файл redis.conf (включен в дистрибутив исходного кода redis); перейти к строке, начинающейся с:
# The filename where to dump the DB
dbfilename dump.rdb
измените dump.rdb на что угодно, но оставьте расширение .rdb на месте.
Далее, чтобы изменить путь к файлу, найдите эту строку в redis.conf:
# Note that you must specify a directory here, not a file name
Строка ниже — это расположение каталога для базы данных Redis. Отредактируйте его так, чтобы он называл нужное вам местоположение. Сохраните изменения и переименуйте этот файл, но сохраните расширение .conf. Вы можете хранить этот файл конфигурации где угодно, просто укажите полный путь и имя этого пользовательского файла конфигурации в той же строке при запуске сервера Redis:
Поэтому в следующий раз, когда вы запустите сервер Redis, вы должны сделать это так (из командной строки:
$> cd /usr/local/bin # or the directory in which you installed redis
$> redis-server /path/to/redis.conf
Наконец, в индексе пакетов Python перечислены пакеты, специально предназначенные для реализации графовой базы данных в Redis. Пакет называется redis-graph, и я его не использовал.
person
doug
schedule
10.03.2012