Pregunta

Estoy escribiendo scripts que leen en gráficos del formato GEXF, agreguen nodos y bordes, y los escribo de nuevo a GEXF. Mi problema es que Write_Gexf está dando los bordes que agrego ID de borde que ya existían en los bordes en los que leí.

Por ejemplo, supongamos que leí en un gráfico G con un solo borde.

>>> import networkx as nx
>>> G = nx.read_gexf('first.gexf')
>>> G.edges(data=True)
[(0,1, {'id': '0'})] 

y luego agrego un borde y escribo el gráfico a GEXF:

>>> G.add_edge(1,2)
>>> G.edges(data=True)
[('0','1', {'id': '0'}), (1,2, {})]
>>> nx.write_gexf(G,'second.gexf')

Ahora, si leo en 'Second.gexf', obtengo dos bordes con 'id' igual '0'.

>>> H = nx.read_gexf('second.gexf')
>>> H.edges(data=True)
[('0','1', {'id': '0'}), ('1','2', {'id': '0'})]

Hay alguna manera de evitar esto?

¿Fue útil?

Solución

El escritor de NetworkX GEXF genera una ID de borde - enteros que comienzan en 0 - si no se especifica uno. Dado que agregó un segundo borde sin una ID (borde 1,2) se usó una ID de 0 que choca con su primer ID de borde.

Puede ser un error y ciertamente causa un problema con su caso de uso. Una solución es establecer explícitamente una ID de borde cuando agrega el nodo.

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})]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top