【问题标题】:Python Networkx can't export to graphml with attributesPython Networkx 无法使用属性导出到 graphml
【发布时间】:2014-01-13 19:00:07
【问题描述】:

将networkx图转换为graphml时遇到以下问题(无法在此处发布所有代码,但这是要点)。 NetworkX 版本是 1.6.2

我有一个名为 G 的 networkx 有向图

G = nx.DiGraph()

使用格式为(AuthorA、AuthorB、Weight)的作者列表中的加权边填充它

G.add_weighted_edges_from(author_list)

我可以在这里导出graphml,它工作正常

nx.write_graphml(G, 'test.graphml')

然后我计算图表上的 pagerank

graph_metric = nx.pagerank_numpy(G, weight='weight')

然后给图中的节点添加属性

nx.set_node_attributes(G, 'pagerank', graph_metric)

如果我遍历图表,我可以打印出节点名称和页面排名

for n.d in G.nodes_iter(data=True):
     print n, d

作者A {u'pagerank':0.0076688948270074164} ... ... ...

但如果在更新属性后我尝试从图表中创建一个 graphml,我会收到以下错误:

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 111, in generate_graphml

writer.add_graph_element(G)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 305, in add_graph_element

self.add_nodes(G,graph_element)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 262, in add_nodes

self.add_attributes("node", node_element, data, default)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 255, in add_attributes

scope=scope, default=default_value)

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 242, in add_data

raise nx.NetworkXError('GraphML writer does not support '

NetworkXError: GraphML writer does not support dict types as data values.

想法?

【问题讨论】:

  • 也许你需要发布更多代码......我刚刚在这里尝试过,它似乎工作正常。我是 py26/nx1.6 IIRC。一件事是它抱怨不知何故,您将一个属性设置为一个无效的字典值。上面的代码没有这样做,但首先要找出哪个节点具有无效值的属性......将发布代码来做到这一点......
  • 我在您发布的内容中没有看到任何看起来有问题的内容。不支持类型的错误消息在 networkx-1.7 github.com/networkx/networkx/commit/… 中得到了(略微)改进,因此您可能会考虑升级到较新的版本,看看这是否提供了导致 graphml 编写器抱怨的数据的线索。
  • 保存为 GraphML 时不能自动序列化 dicts。例如OSMnx 有一个内置函数,用于将 networkx 网络保存为 GraphML 文件,以序列化节点和边的 dict 属性。

标签: python networkx graphml


【解决方案1】:

好吧,它确实告诉你——你不能把字典作为一个 graphml 属性——它们在大多数情况下需要是数字类型或字符串。

不是答案,而是更容易将代码放在这里。 找到“坏”节点:

for node in G.node:
    for attrib in G.node[node]:
        if type(G.node[node][attrib]) == dict:
            print node

【讨论】:

  • 它确实告诉你,这是我添加的 pagerank 属性 - 你可以从“AuthorA {u'pagerank': 0.0076688948270074164}”中看到。奇怪的是,您可以更新图中节点的属性,但是 graphml 没有内置的方式将它们写出来。似乎我必须生成graphml,然后在它创建后通过它迭代更新。
  • 你运行代码了吗?您所看到的是预期行为 - 正在打印 n (这是一个字符串)和 d (这是一个属性字典)。我得到相同的输出,但 write_graphml 工作正常。
  • 1.7.但是该代码在 1.6 和 1.7 afaik 之间没有太大变化。
  • 好的....所以如果它是一个字典,你的代码会打印出属性,它确实如此 - 所有这些。所以: nx.set_node_attributes(G, 'pagerank', graph_metric) 不是添加看起来像的属性的最佳方法
  • 如果任何属性是 dict 值,根据您显示的代码,出现问题。 graph_metric 是什么样的?它应该是一个简单的字典,键作为节点名,值作为 pagerank。
【解决方案2】:

我可以使用 pagerank_numpy() 数据保存 GraphMl:

我把nx.set_node_attributes(G, 'pagerank', graph_metric)改成了nx.set_node_attributes(G, graph_metric, 'pagerank')as per the function definition in networkx doc

我创建了一个带有权重的图表,计算了 nx.pagerank_numpy() 并使用 pagerank 值保存了 GraphMl

代码:

import networkx as nx

G = nx.DiGraph()

G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'G'), ('B', 'F'), ('C', 'G')], weight = 2)
G.add_edges_from([('D', 'B'), ('E', 'C'), ('E', 'F'),('B', 'H')], weight = 3)

graph_metric = nx.pagerank_numpy(G, weight='weight')
nx.set_node_attributes(G, graph_metric, 'pagerank')
nx.write_graphml(G, 'test.graphml')

GraphMl 输出:

<?xml version='1.0' encoding='utf-8'?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
  <key id="d1" for="edge" attr.name="weight" attr.type="int" />
  <key id="d0" for="node" attr.name="pagerank" attr.type="double" />
  <graph edgedefault="directed">
    <node id="A">
      <data key="d0">0.07114273010226772</data>
    </node>
    <node id="B">
      <data key="d0">0.16184971098265896</data>
    </node>
    <node id="C">
      <data key="d0">0.13161405068919527</data>
    </node>
    <node id="G">
      <data key="d0">0.22232103156958644</data>
    </node>
    <node id="F">
      <data key="d0">0.14068474877723428</data>
    </node>
    <node id="D">
      <data key="d0">0.07114273010226768</data>
    </node>
    <node id="E">
      <data key="d0">0.07114273010226768</data>
    </node>
    <node id="H">
      <data key="d0">0.13010226767452204</data>
    </node>
    <edge source="A" target="B">
      <data key="d1">2</data>
    </edge>
    <edge source="A" target="C">
      <data key="d1">2</data>
    </edge>
    <edge source="B" target="G">
      <data key="d1">2</data>
    </edge>
    <edge source="B" target="F">
      <data key="d1">2</data>
    </edge>
    <edge source="B" target="H">
      <data key="d1">3</data>
    </edge>
    <edge source="C" target="G">
      <data key="d1">2</data>
    </edge>
    <edge source="D" target="B">
      <data key="d1">3</data>
    </edge>
    <edge source="E" target="C">
      <data key="d1">3</data>
    </edge>
    <edge source="E" target="F">
      <data key="d1">3</data>
    </edge>
  </graph>
</graphml>

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多