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

时间:2018-07-31 11:16:36

标签: python jupyter-notebook networkx graphml

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

NetworkXError: 'user_id' is not a valid key

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

g = nx.read_gml(file_path + "test_graph_1.gml")
h = nx.read_gml(file_path + "test_graph_2.gml")

(在两个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"
]

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

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

运行

list(f.nodes(data=True))

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

('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'})

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

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

f = nx.compose(g,h)

这正常。

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

nx.write_gml(f, file_path + "one_plus_two.gml")

这时我得到了上面的错误:

  NetworkXError: 'user_id' is not a valid key

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

uid = nx.get_node_attributes(f,'user_id')
print(uid)

哪个输出:

{'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'}

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

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

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

我对此已经筋疲力尽了!

请多多指教!

1 个答案:

答案 0 :(得分:5)

我将此问题发布在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']
     

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