Получение узла после записи / чтения из gml NetworkX - PullRequest
0 голосов
/ 11 января 2019

У меня проблема с получением узлов после чтения графика GML. (Извините, я не могу предоставить вам точный воспроизводимый код, потому что мой код имеет длину 500 строк, а меньшие воспроизводимые примеры дают странно правильные результаты). Поэтому я постараюсь описать это так хорошо, как могу:

Я создал умеренно большой граф G (40 тыс. Узлов, 1 млн ребер). Я могу получить доступ к его узлам по меткам String, просто выполнив G['something']. Я записал его в файл GML, а затем прочитал. Теперь: я не могу получить доступ к узлам по их меткам, как раньше (я получаю KeyError), но я могу получить к ним доступ по идентификаторам (которые были созданы во время записи файла GML, я прав?), То есть G[1] дает мне AtlasView:

AtlasView({0: {'weight': 1}, 3253: {'weight': 8}, 9694: {'weight': 1}....

Но 0, 3253, 9694 также являются идентификаторами, а не метками. Вы знаете, что пошло не так?

Вот мой код записи и чтения:

G = nx.Graph()
for mp in mps:
    G.add_node(mp.name, bipartite=0)
    for word in mp.speeches:
        G.add_node(word, bipartite=1)
        if not G.has_edge(mp.name, word):
            G.add_edge(mp.name, word, weight = 1)
        else:
            G[mp.name][word]['weight'] += 1
#Here I can simply acces the node by G[mp.name]
# and the output is i.e. {'wznawiać': {'weight': 2}, 'obrady':....
nx.write_gml(G, "test.gml")

G = nx.read_gml('test.gml')
#Here I can't acces the node by G[mp.name], but only by it's id

Кроме того, когда я пытаюсь воспроизвести проблему на небольшом примере, я получаю правильные результаты. Может быть, это что-то с кодировкой?

1 Ответ

0 голосов
/ 12 января 2019

Это скорее трудоемкое решение, чем решение, но оно работает, когда вы можете сгенерировать файл снова (если у вас есть решение, я буду рад его увидеть, так как потратил на него целый день):

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 - он все еще поврежден.

...