如何在Jupyter笔记本中读取带有标签的GML文件



我有一个加权网络 gml 文件,但在 jupyter 笔记本中成功读取它时遇到问题。我的文件的一部分如下所示:

graph
[
   node
   [
      id 1
   ]
   node
   [
      id 2
   ]
(..some nodes and edges)
 edge
   [
      source 34
      target 24
      value  4.00
   ]
   edge
   [
      source 11
      target 6
      value  3.00
   ]
]

我的文件可以通过以下方式下载: 访问 https://area51.stackexchange.com/https://gawron.sdsu.edu/python_for_ss/course_core/book_draft/Social_Networks/Networkx.html 9.2.6

我用来读取文件的代码是:

import networkx as nx
kn2 = nx.read_gml('/Users/kate/Desktop/karate_club/weighted_karate.gml')

和错误:

NetworkXError: node #0 has no 'label' attribute

我除了用标签和重量成功读取文件。

read_gml自动重命名解析的节点:

label (string, optional) – 如果不None,则解析的节点将根据 label 指示的节点属性重命名。默认值:‘label’

您可以将label设置为'id'以便根据 .gml 文件中id字段设置节点 ID,以便read_gml节点 ID:

import networkx as nx
kn2 = nx.read_gml('karate.gml', label='id')
print(kn2.edges)

[(1, 32), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), ...]


编辑1:看起来这本书有点过时了。对于稳定版本read_gml如果 .gml 文件中有边缘重复项,则需要在 .gml 文件中有一个multigraph 1行。您应该添加它:

Creator "Jean Mark Gawron on Sunday, 15. December 2013 02:40PM"
graph
[
   multigraph 1 <------------------ HERE
   node
   [
      id 1
   ]
   node
   [
      id 2
   ]
...

然后,您可以像这样访问边的值:

kn2.edges.data('value')

或者像书中那样对它们进行排序:

all_edges = sorted(
    kn2.edges(),
    key=lambda x: kn2.get_edge_data(*x)[0]['value'],
    reverse=True
)