Проблема загрузки сохраненных `graphdata` обратно в экземпляр редисграфа с Python - PullRequest
0 голосов
/ 31 декабря 2018

Я хочу использовать redisgraph-py для загрузки сохраненного графика обратно в объект Graph.Как загрузить данные с помощью redis-py, который хранится как тип graphdata?

Я запускаю образ док-станции redisgraph и не вижу проблем с отображением графика среди клавиш.Я новичок в Redis и пытался просто использовать r.get('random') для загрузки сохраненного графика, но из верхнего ответа здесь я вижу, что мне нужно использовать правильный метод для извлечения правильного типа значения сredis-py.

from io import BytesIO
from pprint import pprint
import numpy as np
import redis
from redisgraph import Node, Edge, Graph

def _array2bytes(arr):
    with BytesIO() as b:
        np.save(b, arr)
        return b.getvalue()

def _bytes2array(byts):
    return np.load(BytesIO(byts))

def _add_nodes(r, graph, n_nodes):
    nodes = []
    for k in range(n_nodes):
        n = Node(label="node")
        graph.add_node(n)
        nodes.append(n)
        _id = n.alias
        feat = np.random.rand(1,100,7,7)
        feat_bytes = _array2bytes(feat)
        r.set(_id, feat_bytes)
    return nodes

def _add_edges(nodes, graph, edge_prob):
    edges = []
    for k, node0 in enumerate(nodes):
        for kk, node1 in enumerate(nodes):
            if np.random.rand() < edge_prob:
                edge = Edge(node0, "adjacent_to", node1)
                graph.add_edge(edge)
                edges.append(edge)
    return edges

def _create_random_graph(r, graphname="random", n_nodes=1000, edge_prob=0.1):
    redis_graph = Graph(graphname, r)
    nodes = _add_nodes(r, redis_graph, n_nodes)
    edges = _add_edges(nodes, redis_graph, edge_prob)
    return redis_graph

def _save_graph():
    r = redis.Redis(host='localhost', port=6379)
    g = _create_random_graph(r)
    g.commit()
    return r

def _load_graph(r):
    # The graph is saved under the key 'random'
    print(r.type('random'))

def _main():
    r = _save_graph()
    _load_graph(r)

if __name__ == "__main__":
    _main()

Я вижу graphdata, и я не знаю, как загрузить этот тип данных, используя redis-py или redisgraph-py.В документах тоже ничего не могу найти.

1 Ответ

0 голосов
/ 31 декабря 2018

В настоящее время redisgraph-py не может заново создать объект графа Python из ключа Redis, содержащего граф.

Для реализации этого модуля (redisgraph-py) потребуетсяИзвлечь все узлы, выполнив запрос:

MATCH (n) RETURN n

И создать объект Node redisgraph-py из каждой формы, кроме того, он должен будет выполнить второй запрос, извлекая все отношения

MATCH (n)-[r]->(m) RETURN n,r,m

И создать из каждого объекта ребра редисграфии.

Я думаю, что если бы мы пошли таким путем, то было бы разумно реализовать интерфейс / структуру, аналогичную NetworkX .

...