Pergunta

Estou escrevendo scripts que lidos em gráficos do formato Gexf, adicionam nós e bordas e escrevam -os de volta ao GEXF. Meu problema é que o write_gexf está dando as bordas que adiciono IDs de borda que já existiam nas bordas que li.

Por exemplo, suponha que eu leia em um gráfico G com uma única borda.

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

E então eu adiciono uma borda e escrevo o gráfico para o Gexf:

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

Agora, se eu ler em 'Second.gexf', recebo duas arestas com 'id' igual '0'.

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

Há alguma maneira de evitar isto?

Foi útil?

Solução

O Writer Networkx Gexf gera um ID de borda - números inteiros a partir de 0 - se não for especificado. Desde que você adicionou uma segunda borda sem um ID (Edge 1,2), foi usado um ID de 0 que colide com o seu primeiro ID da borda.

Pode ser um bug e certamente causa um problema no seu caso de uso. Uma solução alternativa é definir explicitamente um ID de borda quando você adicionar o nó.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top