以下是针对“倪李神学”知识图谱的更详细Python代码示例。
- 更多实体和关系:添加了额外的神学概念、人物、书籍和圣经引用,
以覆盖倪李神学的核心方面(如神的经纶、三一神、教会建造等)。 - 代码结构化:添加了注释、节点属性(例如描述和类型)、边属性(
关系描述和来源)。 - 可视化增强:使用不同颜色区分节点类型(人物红色、概念蓝色、
书籍绿色、圣经引用黄色),调整布局和字体。 - 额外功能:保存图谱为PNG图像文件(
使用Matplotlib),并导出为GraphML格式( 可导入Gephi或其他工具进行进一步分析)。 - 错误处理:简单添加try-except以确保运行顺畅。
- 运行要求:需要安装NetworkX和Matplotlib(
在终端运行 pip install networkx matplotlib)。如果在Jupyter Notebook中运行,可直接显示图;否则保存为文件查看。
这个示例创建一个有向图(DiGraph),代表知识的流动(
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib import font_manager # 用于支持中文标签(可选,如果系统支持中文)
# 可选:添加中文字体支持(如果标签显示乱码,下载SimHei. ttf并替换路径)
# font_manager.fontManager. addfont('path/to/SimHei.ttf') # 替换为你的字体路径
# plt.rcParams['font.sans-serif' ] = ['SimHei']
# plt.rcParams['axes.unicode_ minus'] = False
try:
# 创建有向图
G = nx.DiGraph()
# 定义节点及其属性(类型和描述)
nodes = {
"倪柝声": {"type": "person", "description": "中国基督教领袖,1903-1972,地方教会运动创始人"} ,
"李常受": {"type": "person", "description": "倪柝声门徒,1905-1997,推动地方教会国际化"},
"神的经纶": {"type": "concept", "description": "神的分赐与计划,使人成为神在生命上"},
"三一神": {"type": "concept", "description": "父、子、灵的三一,神的分赐基础"},
"基督的身体": {"type": "concept", "description": "教会作为基督的身体,强调建造与合一"},
"灵魂与灵的区分": {"type": "concept", "description": "灵魂(意志、理智、情感)与灵(良心、直觉、交通)的区分"} ,
"地方教会": {"type": "concept", "description": "一城一会,强调地方性与合一"},
"基督作为生命经历": {"type": "concept", "description": "基督徒对基督作为生命的经历与享受"},
"神人调和": {"type": "concept", "description": "神与人调和,成为神在生命和性情上,但不在神格上"},
"神永远的旨意": {"type": "concept", "description": "神要得着一个团体的彰显"},
"正常的基督徒生活": {"type": "book", "description": "倪柝声著作,强调十字架与复活的生命"},
"生命的经历": {"type": "book", "description": "李常受著作,详细基督作为生命的经历"},
"以弗所书1:10": {"type": "bible", "description": "经纶的圣经依据:万物归一于基督"},
"希伯来书4:12": {"type": "bible", "description": "灵魂与灵区分的圣经依据"},
"约翰福音14:6": {"type": "bible", "description": "基督作为生命的圣经依据"}
}
# 添加节点
for node, attrs in nodes.items():
G.add_node(node, **attrs)
# 定义关系(边)及其属性(关系类型和来源)
edges = [
("倪柝声", "李常受", {"relation": "教导/影响", "source": "历史传记"}),
("倪柝声", "基督作为生命经历", {"relation": "强调", "source": "正常的基督徒生活"}),
("倪柝声", "灵魂与灵的区分", {"relation": "教导", "source": "属灵人"}),
("李常受", "神的经纶", {"relation": "以之为中心", "source": "新约总论"}),
("李常受", "神人调和", {"relation": "阐述", "source": "生命的经历"}),
("神的经纶", "三一神", {"relation": "涉及", "source": "神学框架"}),
("神的经纶", "基督的身体", {"relation": "目标", "source": "以弗所书"}),
("神的经纶", "以弗所书1:10", {"relation": "基于", "source": "圣经"}),
("基督的身体", "地方教会", {"relation": "表现", "source": "地方教会运动"}),
("灵魂与灵的区分", "基督作为生命经历", {"relation": "基础", "source": "希伯来书4:12"}),
("灵魂与灵的区分", "希伯来书4:12", {"relation": "基于", "source": "圣经"}),
("基督作为生命经历", "约翰福音14:6", {"relation": "基于", "source": "圣经"}),
("李常受", "生命的经历", {"relation": "著作", "source": "书籍"}),
("倪柝声", "正常的基督徒生活", {"relation": "著作", "source": "书籍"}),
("神人调和", "神永远的旨意", {"relation": "实现", "source": "神学总结"}),
("三一神", "神人调和", {"relation": "过程", "source": "三一神的分赐"})
]
# 添加边
for source, target, attrs in edges:
G.add_edge(source, target, **attrs)
# 准备可视化:根据节点类型分配颜色
node_colors = []
for node in G.nodes():
node_type = G.nodes[node].get("type", "unknown")
if node_type == "person":
node_colors.append("red")
elif node_type == "concept":
node_colors.append("lightblue" )
elif node_type == "book":
node_colors.append("green")
elif node_type == "bible":
node_colors.append("yellow")
else:
node_colors.append("gray")
# 布局和绘制图
pos = nx.spring_layout(G, seed=42) # 使用固定种子以获得可重复布局
plt.figure(figsize=(14, 10)) # 增大画布大小
nx.draw(G, pos, with_labels=True, node_color=node_colors, node_size=3000,
font_size=10, font_weight="bold", edge_color="gray", arrowsize=20)
# 添加边标签(关系)
edge_labels = nx.get_edge_attributes(G, 'relation')
nx.draw_networkx_edge_labels( G, pos, edge_labels=edge_labels, font_color="darkblue", font_size=8)
# 添加标题
plt.title("倪李神学知识图谱示例", fontsize=16)
# 保存为PNG图像
plt.savefig("nee_lee_theology_ knowledge_graph.png")
print("图谱已保存为 'nee_lee_theology_knowledge_ graph.png' 文件。")
# 显示图(在Jupyter中会直接显示;在脚本中可注释掉)
plt.show()
# 导出为GraphML格式(可导入Gephi)
nx.write_graphml(G, "nee_lee_theology_knowledge_ graph.graphml")
print("图谱已导出为 'nee_lee_theology_knowledge_ graph.graphml' 文件,可在Gephi中打开。")
# 输出总结信息
print("\n节点总数:", G.number_of_nodes())
print("边总数:", G.number_of_edges())
print("中心节点示例(度数最高):", max(G.nodes, key=G.degree))
except Exception as e:
print(f"发生错误: {e}")
代码解释
- 导入库:NetworkX用于构建图,
Matplotlib用于可视化。添加字体支持以处理中文标签( 如果你的系统不支持中文,可能会显示方块; 下载中文字体如SimHei.ttf并启用注释部分)。 - 节点定义:使用字典存储节点及其属性,便于扩展。
类型用于颜色区分,描述可用于工具提示(在高级可视化中)。 - 边定义:每个边有关系类型和来源,基于倪李神学的实际内容(
从书籍和圣经中提取)。 - 可视化:使用spring_layout布局(模拟弹簧力,
使节点分布均匀)。节点大小、颜色和标签自定义。 边有箭头表示方向。 - 保存和导出:生成PNG图像文件,便于分享;
GraphML格式兼容其他图工具如Gephi(免费下载), 在那里你可以交互式探索(拖拽节点、过滤等)。 - 输出:运行后会打印节点/边数量和一个简单分析(最高度节点,
通常是核心概念如“神的经纶”)。
如何运行和扩展
- 运行:在Python环境中执行此代码。如果在终端,
图像会保存为文件;如果在VS Code或Jupyter,会弹出窗口。 - 扩展:在
nodes和edges字典中添加更多项。例如,添加“恢复工作”(Recovery)概念: "恢复工作": {"type": "concept", "description": "神在历史中的恢复"},然后添加边如("李常受", "恢复工作", {"relation": "推动", "source": "地方教会"})。 - 高级功能:如果你想添加交互,
使用Plotly代替Matplotlib(需额外安装 pip install plotly),或整合到Streamlit web app中。 - 数据来源验证:这些实体/关系基于公开的倪李神学资料(如min
istrybooks.org)。如果需要更准确, 可结合工具如Neo4j存储更大规模数据。
如果需要进一步修改(如添加特定概念、集成数据库,