Это скорее трудоемкое решение, чем решение, но оно работает, когда вы можете сгенерировать файл снова (если у вас есть решение, я буду рад его увидеть, так как потратил на него целый день):
TL; DR: если вы можете сгенерировать график еще раз, сделайте это и сохраните в другом формате.
Что я выучил:
Каким-то образом, в моем случае, когда читает (сам файл в порядке, я проверил его вручную в текстовом редакторе), больший график NetworkX образует файл .gml, график становится поврежденным - идентификаторы (генерируются автоматически для файл) и метки (с помощью которых узлы могут быть доступны) смещены. Это выглядит так (этот код будет работать. Проблема возникает только при анализе больших графов данных):
#prepare the data:
G = nx.Graph()
G.add_node("String1")
G.add_node("String2")
G.add_edge("String1", "String2", weight = 1)
nx.write_graphml(G, "test.graphml")
nx.write_gml(G, "test.gml")
#now reading:
gml = nx.read_gml('test.gml')
graphml = nx.read_graphml('test.graphml')
#let's sort the edges by weight just to make this example clearer:
seGml = sorted(gml.edges(data=True),key= lambda x: x[2]['weight'],reverse=True)
seGraph = sorted(graphml.edges(data=True),key= lambda x: x[2]['weight'],reverse=True)
print(seGml[0])
print(seGraph[0])
дает вывод:
(0,1, {'weight': 1})
('String1', 'String2', {'weight': 1})
В случае gml невозможно получить узлы с помощью G ["String1"] (дает KeyError), и получение всех атрибутов в словаре иногда дает возможность достичь метки узла, то есть: dictOfAtts[0]
дает 'String1'
, но иногда это также дает ошибку ключа
Как работать с ним: Если вы можете сгенерировать график еще раз, сделайте это и напишите в другом формате (.graphml работал для меня). НО вы не можете просто прочитать .gml, затем записать его в .graphml и еще раз прочитать .graphml - он все еще поврежден.