Почему networkx.write_gexf повторно использует идентификаторы краев?

StackOverflow https://stackoverflow.com/questions/19848087

  •  29-07-2022
  •  | 
  •  

Вопрос

Я пишу сценарии, которые читаются на графиках из формата GEXF, добавляют узлы и края, и записываю их обратно в GEXF. Моя проблема заключается в том, что write_gexf дает края, которые я добавляю идентификаторы Edge, которые уже существовали в краях, в которых я прочитал.

Например, предположим, что я прочитал на графике 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'})]

Есть ли способ избежать этого?

Это было полезно?

Решение

Автор NetworkX GEXF генерирует идентификатор края - целые числа, начинающиеся с 0 - если кто -то не указан. Поскольку вы добавили второй край без идентификатора (Edge 1,2), использовался идентификатор 0, который сталкивается с вашим первым идентификатором края.

Это может быть ошибка и, безусловно, вызывает проблему с вашим вашим вашим вариантом использования. Один обходной путь - явно установить идентификатор края при добавлении узла.

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})]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top