NetworkX可扩展性,用于节点/边缘的自定义存储

2024-10-05 20:08:42 发布

您现在位置:Python中文网/ 问答频道 /正文

NetworkX是否支持自定义节点、边和属性的存储位置?例如,我想尝试两种选择:

  1. 用LevelDB/Kyoto Cabinet之类的东西做后盾。

  2. 使用一些分布式数据库(Neo4j甚至HBase-我只需要节点/边缘的分布式存储)作为后备存储。

NetworkX支持这些东西的扩展点是什么?在


Tags: networkx数据库属性节点分布式边缘hbaseneo4j
2条回答

我将发布为外部存储设置NetworkX的细微差别。Kikohs指出每一本字典都有工厂,这是正确的。这些可以被覆盖。在

对于持久化存储,真正需要特别注意的字典是节点字典。在

必须特别注意dict类实现的行为。NetworkX类中有一些代码可以更改内存中从字典返回的值,而无需将其设置回原处。在

例如:

self.succ[u][v]=datadict
self.pred[v][u]=datadict

这些值不会保留回存储后端。为了适应这种情况,我使用了一个内存缓存,它将对象保存在内存中,当对象被逐出时,它会将它们写入底层存储。在

对于我使用的内存缓存cachetools。有关逐出,请参见:Python functools.lru_cache eviction callback or equivalent

对于底层存储,我使用了plyvelhttps://plyvel.readthedocs.org/en/latest/),这是LevelDB的Python接口。在

下面我还给出了字典的实现。注意,代码中仍然存在错误和bug,并且还没有经过正确的测试,但是您已经了解了基本的概念。在

^{pr2}$

图形类:

class PersistedGraph(nx.Graph):
    def __init__(self, data=None, node_dict_factory=None, adjlist_dict_factory=None, edge_attr_dict_factory=None,
                 **attr):
        if node_dict_factory:
            self.node_dict_factory = node_dict_factory
        if adjlist_dict_factory:
            self.adjlist_dict_factory = adjlist_dict_factory
        if edge_attr_dict_factory:
            self.edge_attr_dict_factory = edge_attr_dict_factory
        nx.Graph.__init__(self, data, **attr)

应该可以通过子类化Graph类并提供用户定义的工厂函数来扩展networkx。 这些函数可以查询数据库并将结果缓存到networkx使用的字典中。在

我在联机文档中找不到这些行,但是在code中有:

子类(高级):

Graph类使用dict的dict数据结构。在

外部dict(node_dict)保存由节点键控的邻接列表。 下一个dict(adjlist)表示邻接列表并保持不变 由邻居键控的边缘数据。内部dict(edge_attr)表示 边数据,并保存由属性名设置关键帧的边属性值。在

这三个dict中的每一个都可以由用户定义的替换 dict-like对象。一般来说,dict类的特性应该是 维护,但可以添加额外的功能。替换其中一个 dicts通过更改类(!)来创建一个新的图形类变量 控制着工厂。变量名 分别是node-tu-dict-factory、adjlist-tu-dict-factory和edge-attr-dict-factory。在

    node_dict_factory : function, (default: dict)
    Factory function to be used to create the outer-most dict
    in the data structure that holds adjacency lists keyed by node.
    It should require no arguments and return a dict-like object.

    adjlist_dict_factory : function, (default: dict)
    Factory function to be used to create the adjacency list
    dict which holds edge data keyed by neighbor.
    It should require no arguments and return a dict-like object

    edge_attr_dict_factory : function, (default: dict)
    Factory function to be used to create the edge attribute
    dict which holds attrbute values keyed by attribute name.
    It should require no arguments and return a dict-like object.

我不知道networkx有任何官方扩展。在

相关问题 更多 >