跳转至

阶段 3+4:知识图谱构建

模块: src/graph_builder.py
预计耗时: ~2 天

目标

将所有处理后的数据(得主、奖项、论文、概念)组合为包含 5 种节点类型和 8 种边类型的 NetworkX 有向图,然后导出为多种格式。

节点类型

flowchart LR
    L[🏅 得主] --- A[🏆 奖项]
    L --- W[📄 论文]
    W --- C[💡 概念]
    C --- F[🔬 领域]
节点类型 示例 关键属性
Laureate "Aaron Ciechanover" 姓名、国籍、出生年份、性别
Award "Chemistry 2004" 年份、类别、获奖理由、奖金
Work 泛素相关论文 标题、年份、摘要、关键词、引用数、DOI
Concept "泛素-蛋白酶体通路" 名称、描述、领域、子领域、首次出现年份
Field "Biology" 名称、父级领域、描述

边类型

边类型 源 → 目标 属性 语义
WON_AWARD 得主 → 奖项 year, portion 得主获得该奖
AUTHORED 得主 → 论文 position 得主撰写该论文
CITES 论文 → 论文 论文引用
INTRODUCES 论文 → 概念 confidence 论文引入/提出该概念
APPLIES 论文 → 概念 confidence 论文应用/使用该概念
BELONGS_TO 概念 → 领域 概念属于该科学领域
DERIVED_FROM 概念 → 概念 year, description 概念从同领域另一概念演化而来
CROSS_INSPIRED 概念 → 概念 year, source_field, target_field, description 跨学科迁移
AWARDED_FOR 奖项 → 概念 奖项表彰该概念

CROSS_INSPIRED 边

这是知识图谱中最有价值的边类型,表示跨学科概念迁移:

优化理论     --CROSS_INSPIRED--> 随机梯度下降    (数学 → AI, ~1960s)
Transformer --CROSS_INSPIRED--> AlphaFold      (AI → 结构生物学, 2018)
X射线衍射    --CROSS_INSPIRED--> DNA双螺旋结构   (物理 → 分子生物学, 1953)
统计力学     --CROSS_INSPIRED--> 玻尔兹曼机      (物理 → 机器学习, 1985)

构建流程

flowchart TD
    L[加载 laureates.parquet] --> G[初始化图谱]
    A[加载 awards.parquet] --> G
    P[加载 publications.parquet] --> G
    C[加载 concepts.parquet] --> G

    G --> N1[添加 Laureate 节点]
    N1 --> N2[添加 Award 节点 + WON_AWARD 边]
    N2 --> N3[添加 Work 节点 + AUTHORED 边]
    N3 --> N4[添加 Concept 节点 + INTRODUCES/APPLIES 边]
    N4 --> N5[添加 Field 节点 + BELONGS_TO 边]
    N5 --> E1[构建 CROSS_INSPIRED 边]
    E1 --> E2[构建 CITES 边]
    E2 --> E3[构建 AWARDED_FOR 边]
    E3 --> EX[导出 JSON + GraphML]

跨学科检测算法

对于每篇论文 W:
    W_concepts = W 关联的概念集合
    W_field = W 的主要领域
    for ref in W.referenced_works:
        ref_field = ref 的主要领域
        if W_field  ref_field:
            shared_concepts = W_concepts  ref_concepts
            if shared_concepts 非空:
                 生成 CROSS_INSPIRED 
                 记录: 概念从 ref_field 迁移到 W_field

输出文件

文件 格式 说明
knowledge_graph.json JSON 含节点和边的完整图谱
nodes.json JSON 仅节点
edges.json JSON 仅边
knowledge_graph.graphml GraphML 适用于 Gephi、Cytoscape 等
concept_graph_simplified.json JSON 简化概念图(仅 Concept 节点)
concept_graph_simplified_nodes.json JSON 简化概念图节点
concept_graph_simplified_edges.json JSON 简化概念图边
concept_graph_simplified.graphml GraphML 简化概念图(复杂属性已转 JSON 字符串)

简化概念图 Schema(新增)

  • 仅包含 Concept 节点(跨论文去重)
  • 节点属性包含:
  • citation_by_year: {年份: 引用次数}
  • paper_count: 关联论文数量
  • total_citations: 按年汇总后的总引用数
  • 边类型为 CONCEPT_CITES,边属性包含:
  • citation_by_year: {年份: 引用次数}
  • total_citations: 按年汇总后的总引用数

说明:citation_by_year 属于字典结构,GraphML 不直接支持。导出 .graphml 时会自动转成 JSON 字符串;JSON 导出中保留原始字典结构。

JSON 结构

{
  "nodes": [
    {
      "id": "laureate_779",
      "type": "Laureate",
      "name": "Aaron Ciechanover",
      "nationality": "Israeli",
      "birth_year": 1947
    }
  ],
  "edges": [
    {
      "source": "laureate_779",
      "target": "award_2004_3_779",
      "type": "WON_AWARD",
      "year": 2004
    }
  ]
}

图谱统计(样本模式)

指标
总节点数 ~97
总边数 ~181
得主 5
论文 25
概念 51
领域 11
跨学科迁移 11

运行

# 通过流水线
uv run python main.py --phase 3

# 独立运行
uv run python -m src.graph_builder

概念图谱 Schema

概念图谱是知识图谱的简化表示,专注于概念及其关系,旨在突出跨学科的思想流动及其联系。

Schema 详情

  • 节点
  • id:概念的唯一标识符。
  • name:概念的可读名称。
  • paper_count:与该概念相关的论文数量。
  • total_citations:与该概念相关的论文收到的总引用数。
  • source:源概念 ID。
  • target:目标概念 ID。
  • type:关系类型(例如 CONCEPT_CITES)。
  • total_citations:连接的概念之间的总引用数。

构建过程

  1. 从论文中提取概念。
  2. 跨论文去重概念。
  3. 基于引用和共享概念建立关系。
  4. 将图谱导出为 JSON 和 GraphML 格式。

示例 JSON 结构

{
  "nodes": [
    {
      "id": "concept_1",
      "name": "量子力学",
      "paper_count": 120,
      "total_citations": 4500
    }
  ],
  "edges": [
    {
      "source": "concept_1",
      "target": "concept_2",
      "type": "CONCEPT_CITES",
      "total_citations": 300
    }
  ]
}