我正在编写脚本,这些脚本从gexf格式读取图形,添加节点和边缘,然后将它们写回gexf。我的问题是write_gexf给出的边缘是我添加的边缘ID已经存在于我读入的边缘。
例如,假设我使用单个边读入图G
。
>>> import networkx as nx
>>> G = nx.read_gexf('first.gexf')
>>> G.edges(data=True)
[(0,1, {'id': '0'})]
然后我添加一条边并将图形写入gexf:
>>> G.add_edge(1,2)
>>> G.edges(data=True)
[('0','1', {'id': '0'}), (1,2, {})]
>>> nx.write_gexf(G,'second.gexf')
现在,如果我读入'second.gexf',我会得到两条'id'等于'0'的边。
>>> H = nx.read_gexf('second.gexf')
>>> H.edges(data=True)
[('0','1', {'id': '0'}), ('1','2', {'id': '0'})]
有没有办法避免这种情况?
答案 0 :(得分:1)
NetworkX GEXF编写器生成边缘ID - 从0开始的整数 - 如果未指定。由于您添加了第二个没有id(边1,2)的边,因此使用了id为0的内容,它与您的第一个边ID相冲突。
这可能是一个错误,肯定会导致您的用例出现问题。 一种解决方法是在添加节点时显式设置边缘ID。
In [1]: import networkx as nx
In [2]: G = nx.read_gexf('first.gexf')
In [3]: G.edges(data=True)
Out[3]: [('1', '0', {'id': '0'})]
In [4]: G.add_edge(1,2,id=1)
In [5]: G.edges(data=True)
Out[5]: [('1', '0', {'id': '0'}), (2, 1, {'id': 1})]