以下是针对“倪李神学”知识图谱的更详细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}")

代码解释

  1. 导入库:NetworkX用于构建图,Matplotlib用于可视化。添加字体支持以处理中文标签(如果你的系统不支持中文,可能会显示方块;下载中文字体如SimHei.ttf并启用注释部分)。
  2. 节点定义:使用字典存储节点及其属性,便于扩展。类型用于颜色区分,描述可用于工具提示(在高级可视化中)。
  3. 边定义:每个边有关系类型和来源,基于倪李神学的实际内容(从书籍和圣经中提取)。
  4. 可视化:使用spring_layout布局(模拟弹簧力,使节点分布均匀)。节点大小、颜色和标签自定义。边有箭头表示方向。
  5. 保存和导出:生成PNG图像文件,便于分享;GraphML格式兼容其他图工具如Gephi(免费下载),在那里你可以交互式探索(拖拽节点、过滤等)。
  6. 输出:运行后会打印节点/边数量和一个简单分析(最高度节点,通常是核心概念如“神的经纶”)。

如何运行和扩展

  • 运行:在Python环境中执行此代码。如果在终端,图像会保存为文件;如果在VS Code或Jupyter,会弹出窗口。
  • 扩展:在nodesedges字典中添加更多项。例如,添加“恢复工作”(Recovery)概念:"恢复工作": {"type": "concept", "description": "神在历史中的恢复"},然后添加边如("李常受", "恢复工作", {"relation": "推动", "source": "地方教会"})
  • 高级功能:如果你想添加交互,使用Plotly代替Matplotlib(需额外安装pip install plotly),或整合到Streamlit web app中。
  • 数据来源验证:这些实体/关系基于公开的倪李神学资料(如ministrybooks.org)。如果需要更准确,可结合工具如Neo4j存储更大规模数据。

如果需要进一步修改(如添加特定概念、集成数据库,或其他语言版本),或想用这个代码生成实际图像示例,提供更多细节!