Example08 / 11
网络文件格式——边列表、GML 与 GraphML 的读写差异
构造一个带节点属性(类型)、边属性(置信度)和一个孤立节点的小型 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:边数 2Code代码
# 构造一个带节点属性(类型)、边属性(置信度)和一个孤立节点的小型 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 秒;可以修改参数后重新运行。