生物医学网络科学Biomedical Network Science
Example08 / 11

网络文件格式——边列表、GML 与 GraphML 的读写差异

所属专题
复杂系统与网络的数学表示
下载
Notebook · .py

构造一个带节点属性(类型)、边属性(置信度)和一个孤立节点的小型 PPI 网络, 分别写成边列表、GML 和 GraphML(存放在临时目录,运行结束后自动删除),再读回比较。 输出:边列表读回后丢失了孤立节点 BRCA2 和节点属性;GML 与 GraphML 完整保留节点、边及属性。 同时演示:同一对节点在边列表中出现两次时,读成 Graph 会被合并为一条边。

Output文字输出

边列表文件内容:
TP53 MDM2 0.999
TP53 CHEK2 0.98

GraphML 文件前 6 行:
<?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="score" attr.type="double" />
  <key id="d0" for="node" attr.name="kind" attr.type="string" />
  <graph edgedefault="undirected">
    <node id="TP53">

原始     节点数 4,边数 2,BRCA2 在吗?True,TP53 的属性: {'kind': 'TF'}
边列表    节点数 3,边数 2,BRCA2 在吗?False,TP53 的属性: {}
GML    节点数 4,边数 2,BRCA2 在吗?True,TP53 的属性: {'kind': 'TF'}
GraphML 节点数 4,边数 2,BRCA2 在吗?True,TP53 的属性: {'kind': 'TF'}
读成 Graph:边数 1,权重 {'w': 0.9}(只保留了后一条)
读成 MultiGraph:边数 2

Code代码

# 构造一个带节点属性(类型)、边属性(置信度)和一个孤立节点的小型 PPI 网络,
# 分别写成边列表、GML 和 GraphML(存放在临时目录,运行结束后自动删除),再读回比较。
# 输出:边列表读回后丢失了孤立节点 BRCA2 和节点属性;GML 与 GraphML 完整保留节点、边及属性。
# 同时演示:同一对节点在边列表中出现两次时,读成 Graph 会被合并为一条边。
import os
import tempfile
import networkx as nx

G = nx.Graph()
G.add_node("TP53", kind="TF")
G.add_node("MDM2", kind="E3 ligase")
G.add_node("CHEK2", kind="kinase")
G.add_node("BRCA2", kind="repair")          # 孤立节点:没有检测到相互作用
G.add_edge("TP53", "MDM2", score=0.999)
G.add_edge("TP53", "CHEK2", score=0.980)

with tempfile.TemporaryDirectory() as tmp:
    p_el, p_gml, p_gx = (os.path.join(tmp, f) for f in ("ppi.edgelist", "ppi.gml", "ppi.graphml"))
    nx.write_edgelist(G, p_el, data=["score"])
    nx.write_gml(G, p_gml)
    nx.write_graphml(G, p_gx)
    print("边列表文件内容:")
    print(open(p_el).read())
    print("GraphML 文件前 6 行:")
    print("".join(open(p_gx).readlines()[:6]))

    G_el = nx.read_edgelist(p_el, data=[("score", float)])
    G_gml = nx.read_gml(p_gml)
    G_gx = nx.read_graphml(p_gx)
    for name, H in [("原始", G), ("边列表", G_el), ("GML", G_gml), ("GraphML", G_gx)]:
        print("%-6s 节点数 %d,边数 %d,BRCA2 在吗?%s,TP53 的属性: %s"
              % (name, H.number_of_nodes(), H.number_of_edges(), "BRCA2" in H, H.nodes["TP53"]))

    # 重复边:同一对蛋白在两个实验中各报告一次
    with open(os.path.join(tmp, "dup.tsv"), "w") as f:
        f.write("TP53\tMDM2\t0.7\nTP53\tMDM2\t0.9\n")
    Hg = nx.read_edgelist(os.path.join(tmp, "dup.tsv"), delimiter="\t", data=[("w", float)])
    Hm = nx.read_edgelist(os.path.join(tmp, "dup.tsv"), delimiter="\t", data=[("w", float)],
                          create_using=nx.MultiGraph)
    print("读成 Graph:边数 %d,权重 %s(只保留了后一条)" % (Hg.number_of_edges(), Hg["TP53"]["MDM2"]))
    print("读成 MultiGraph:边数 %d" % Hm.number_of_edges())

Run在浏览器中运行

首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。

网络文件格式——边列表、GML 与 GraphML 的读写差异