写入GML文件时出现NetworkX密钥错误

Wat*_*y62 5 python graphml networkx jupyter-notebook

使用compose()合并两个图形后尝试写入GML文件时,出现以下错误消息:

NetworkXError: 'user_id' is not a valid key
Run Code Online (Sandbox Code Playgroud)

背景是我使用以下命令导入了两个GML文件:

g = nx.read_gml(file_path + "test_graph_1.gml")
h = nx.read_gml(file_path + "test_graph_2.gml")
Run Code Online (Sandbox Code Playgroud)

每个节点(在两个GML文件中)文件的结构如下:

node [
id 9
user_id "1663413990"
file "wingsscotland.dat"
label "brian_bilston"
image "/Users/ian/development/gtf/gtf/img/1663413990.jpg"
type "friends"
statuses 21085
friends 737
followers 53425
listed 550
ffr 72.4898
lfr 0.1029
shape "triangle-up"
]
Run Code Online (Sandbox Code Playgroud)

导入每个文件之后,我可以检查所有节点属性,看看每个图中的节点都是唯一的。

我还看到默认情况下NetworkX会丢弃'id'字段,而und使用'label'作为节点的标识符。它保留了user_id属性(恰好是Twitter的user_id,非常适合我的目的)。

跑步

list(f.nodes(data=True))
Run Code Online (Sandbox Code Playgroud)

我可以看到上面节点的数据是:

('brian_bilston',
{'ffr': 72.4898,
'file': 'wingsscotland.dat',
'followers': 53425,
'friends': 737,
'image': '/Users/ian/development/gtf/gtf/img/1663413990.jpg',
'lfr': 0.1029,
'listed': 550,
'shape': 'triangle-up',
'statuses': 21085,
'type': 'friends',
'user_id': '1663413990'})
Run Code Online (Sandbox Code Playgroud)

在此测试用例中,有一个公共节点由图g和图h共享,即上面显示的一个。其他所有用户名和标签均唯一。

然后,我使用以下方法合并两个图:

f = nx.compose(g,h)
Run Code Online (Sandbox Code Playgroud)

这样就可以了。

然后,我使用以下图表从图f中写出新的GML:

nx.write_gml(f, file_path + "one_plus_two.gml")
Run Code Online (Sandbox Code Playgroud)

此时,我得到上面的错误:

  NetworkXError: 'user_id' is not a valid key
Run Code Online (Sandbox Code Playgroud)

我检查了所有user_id的唯一性(如果我重复了一个):

uid = nx.get_node_attributes(f,'user_id')
print(uid)
Run Code Online (Sandbox Code Playgroud)

哪个输出:

{'brian_bilston': '1663413990', 
'ICMResearch': '100', 
'justcswilliams': '200', 
'MissBabington': '300', 
'ProBirdRights': '400', 
'FredSmith': '247775851', 
'JasWatt': '160952087', 
'Angela_Lewis': '2316946782', 
'Fuzzpig54': '130136162', 
'SonnyRussel': '828881340', 
'JohnBird': '448476934', 
'AngusMcAngus': '19785044'}
Run Code Online (Sandbox Code Playgroud)

(为便于阅读而格式化)。

因此,据我所知,所有的user_id都是唯一的。

因此,如果这不是键的唯一性问题,那么错误告诉我什么?

我已经用尽了所有的思考!

请任何指针,将不胜感激!

Wat*_*y62 7

我将其作为问题发布在NextworkX GitHub存储库上,管理员回答了该问题。

参见:https : //github.com/networkx/networkx/issues/3100

我在下面发布了他的答案:

是的-这是一个已知问题:请参阅#2131

GML规范不允许在属性名称中使用下划线。我们允许读取与官方GML规范不符的.gml文件。但是我们只写符合规范的项目。您应该将属性名称转换为不包含下划线。

for n in G:
    G.node[n]['userid'] = G.node[n]['user_id']
    del G.node[n]['user_id']
Run Code Online (Sandbox Code Playgroud)

我们还应该在文档中添加关于此的注释。