本项目旨在将《中华人民共和国药典2025版》全四部内容构建为Neo4j知识图谱,实现药典数据的结构化存储、关系建模和智能查询。通过图数据库技术,将药品、分类、卷册等实体及其关系进行可视化管理,为药学研究、药品监管和临床应用提供强大的数据支持。
- 第一部(中药): 2,278个条目
- 第二部(化学药品): 2,776个条目
- 第三部(生物制品): 368个条目
- 第四部(通用技术要求和药用辅料): 859个条目
- 总计: 6,281个条目
- 图数据库: Neo4j
- 关系数据库: PostgreSQL
- 编程语言: Python 3.8+
- 核心库: neo4j-driver, psycopg2, logging
- 开发环境: Windows / Linux / macOS
所有药典数据首先存储在PostgreSQL关系数据库中的 pharmacopoeia_items 表:
图1: PostgreSQL中的药典数据表,包含6283条记录,涵盖全四部药典条目
数据从PostgreSQL导入Neo4j后,形成层次化的知识图谱结构:
图2: 知识图谱的层次结构 - Pharmacopoeia根节点、4个Volume节点、9个Category节点和数千个Medicine节点
KnowledgeGraph/
├── build/ # 知识图谱构建模块
│ ├── ConnectNeo4j.py # Neo4j连接管理
│ ├── ConnectPostgres.py # PostgreSQL连接测试
│ ├── build_kg.py # 知识图谱构建主程序
│ ├── check_link_medicine_to_rules.py # 药品与通则关联检查
│ └── delete_all_KGnodes.py # 清空知识图谱数据
│
├── CURD/ # 知识图谱CRUD操作模块
│ ├── __init__.py # 统一接口
│ ├── base_crud.py # 基础CRUD抽象类
│ ├── medicine_crud.py # 药品条目CRUD
│ ├── category_crud.py # 分类CRUD
│ ├── volume_crud.py # 卷册CRUD
│ ├── relationship_crud.py # 关系CRUD
│ ├── search_crud.py # 搜索和查询功能
│ ├── test_crud.py # 功能测试
│ ├── example_usage.py # 使用示例
│ ├── README.md # CRUD模块文档
│ └── USAGE.md # 使用指南
│
├── Postgres/ # PostgreSQL数据库模块
│ ├── __init__.py # 模块初始化
│ ├── connection.py # 连接池管理
│ ├── database.py # 数据库配置
│ ├── pharmacopoeia.py # 药典数据模型
│ ├── schema.sql # 数据库表结构
│ ├── indexes.sql # 索引定义
│ ├── update_name_en_content.py # 数据更新工具
│ └── doc/ # PostgreSQL文档
│ └── 接口文档.md
│
├── doc/ # 项目文档
│ ├── 技术文档.md # 完整技术文档
│ ├── 构建顺序v1.md # 构建流程说明
│ ├── KG-创建基础条目的点和边.md # 基础构建指南
│ ├── KG-药品条目与通则关联.md # 关联关系说明
│ ├── 药典第二部条目neo4j知识图谱化示例.md
│ └── 药典第四部-通则条目neo4j知识图谱化示例.md
│
├── figs/ # 图片资源
│ ├── 2025药典全4部所有数据装进postgres数据库.png
│ ├── 药典知识图谱4部整体的框架.png
│ └── 药典第二部第一部分和药典第三部通则的引用关系.png
│
├── 中华人民共和国药典2025版全四部文本/ # 原始数据文件
│ ├── 2025药典全四部目录.txt
│ ├── 第一部目录.txt
│ ├── 第二部目录.txt
│ ├── 第三部目录.txt
│ ├── 第四部目录.txt
│ ├── 第一部/ # 2,283个txt文件
│ ├── 第二部/ # 2,782个txt文件
│ ├── 第三部/ # 386个txt文件
│ └── 第四部/ # 869个txt文件
│
├── README.md # 本文档
├── requirements.txt # Python依赖包
├── environment.yml # Conda环境配置(可选)
└── LICENCE # 许可证文件
如果还没有安装Conda,请访问 Anaconda官网 或 Miniconda官网 下载安装。
# 创建名为 kg_env 的Python 3.10环境
conda create -n kg_env python=3.10 -y
# 激活环境
conda activate kg_env# 使用pip安装依赖
pip install -r requirements.txt- 下载并安装 Neo4j Desktop 或 Neo4j Community Edition
- 启动Neo4j服务
- 默认端口:7687 (Bolt), 7474 (HTTP)
- 创建数据库,设置用户名和密码
默认配置:
NEO4J_URI = "bolt://localhost:7687"
NEO4J_USERNAME = "neo4j"
NEO4J_PASSWORD = "1768157228ABC" # 请修改为您的密码Windows环境注意事项: 如果Neo4j无响应,请参考以下步骤:
- 在任务管理器中结束Neo4j后台进程
- 关闭Windows Defender防火墙
- 断开网络,以管理员身份启动Neo4j
- 下载并安装 PostgreSQL
- 启动PostgreSQL服务
- 创建数据库
pharmacopoeia
默认配置 (修改 Postgres/database.py):
DB_CONFIG = {
'host': 'localhost',
'port': 5433, # PostgreSQL默认端口5432
'user': 'postgres',
'password': 'postgresql', # 请修改为您的密码
'database': 'pharmacopoeia',
}# 进入Postgres目录
cd Postgres
# 使用psql或其他工具执行SQL脚本
psql -U postgres -d pharmacopoeia -f schema.sql
psql -U postgres -d pharmacopoeia -f indexes.sql# 测试Neo4j连接
python build/ConnectNeo4j.py
# 测试PostgreSQL连接
python build/ConnectPostgres.py# 运行知识图谱构建程序
python build/build_kg.py构建流程:
- 创建约束和索引
- 创建药典根节点和卷册节点
- 创建分类节点
- 从PostgreSQL导入药品条目
- 创建药品与分类的关系
- 关联药品与通则的引用关系
from CURD import KnowledgeGraphManager
# 创建知识图谱管理器
with KnowledgeGraphManager() as kg:
# 初始化知识图谱
kg.initialize_knowledge_graph()
# 从PostgreSQL同步数据
kg.sync_data_from_postgres()
# 获取统计信息
stats = kg.get_overall_statistics()
print(f"药品总数: {stats['medicines']['total']}")
print(f"分类总数: {stats['categories']['total']}")from CURD import KnowledgeGraphManager
with KnowledgeGraphManager() as kg:
# 创建药品
medicine_data = {
'volume': 2,
'doc_id': 51439,
'name_cn': '阿司匹林',
'name_en': 'Aspirin',
'category': '化学药品',
'content': '详细内容...'
}
kg.medicine.create(medicine_data)
# 读取药品
medicine = kg.medicine.read(51439)
print(f"药品名称: {medicine['name_cn']}")
# 搜索药品
results = kg.medicine.search({'category': '化学药品'})
for item in results:
print(item['name_cn'])from CURD import KnowledgeGraphManager
with KnowledgeGraphManager() as kg:
# 全文搜索
results = kg.search.full_text_search('阿司匹林', limit=10)
# 按分类搜索
results = kg.search.search_by_category('化学药品', volume=2)
# 高级搜索
results = kg.search.advanced_search({
'text_query': '阿司匹林',
'volume': 2,
'category': '化学药品',
'limit': 20
})更多使用示例请参考:
CURD/example_usage.py- 完整使用示例CURD/test_crud.py- 功能测试代码CURD/README.md- CRUD操作详细文档
// 1. 查找特定药材
MATCH (m:Medicine {name: '人参'})
RETURN m
// 2. 查找某分类下的所有药材
MATCH (m:Medicine)-[:BELONGS_TO]->(c:Category {name: '药材和饮片'})
RETURN m.name, m.doc_id
ORDER BY m.name
// 3. 统计各部药品数量
MATCH (m:Medicine)
RETURN m.edition as 药典部次, count(m) as 数量
ORDER BY 药典部次
// 4. 查看知识图谱结构(限制100条)
MATCH (m:Medicine)-[:BELONGS_TO]->(c:Category)
WHERE m.edition = '第一部'
RETURN m, c LIMIT 100// 5. 查找药品与通则的引用关系
MATCH (m:Medicine)-[:REFER_TO]->(r:Medicine)
WHERE r.category = '通则与指导原则'
RETURN m.name as 药品名称, r.name as 引用通则
LIMIT 50
// 6. 跨部查询同名药品
MATCH (m1:Medicine), (m2:Medicine)
WHERE m1.name = m2.name AND m1.edition <> m2.edition
RETURN m1.name as 药品名称,
collect(DISTINCT m1.edition) + collect(DISTINCT m2.edition) as 收载药典
// 7. 查找未关联分类的节点(数据质量检查)
MATCH (m:Medicine)
WHERE NOT (m)-[:BELONGS_TO]->()
RETURN m.name, m.edition, m.doc_id-
Pharmacopoeia - 药典根节点
- 中华人民共和国药典2025版
-
Volume - 卷册节点
- 第一部、第二部、第三部、第四部
-
Category - 分类节点
- 第一部:药材和饮片、植物油脂和提取物、成方制剂和单味制剂
- 第二部:第一部分、第二部分
- 第三部:生物制品、通则与指导原则等16个分类
- 第四部:通用技术要求和指导原则、药用辅料品种正文等
-
Medicine - 药品条目节点
- 包含 doc_id、name、name_pinyin、name_en、category、content等属性
-
BELONGS_TO - 从属关系
- Volume -[:BELONGS_TO]-> Pharmacopoeia
- Category -[:BELONGS_TO]-> Volume
- Medicine -[:BELONGS_TO]-> Category
-
REFER_TO - 引用关系
- Medicine -[:REFER_TO]-> Medicine(通则)
下图展示了药典第二部第一部分和第三部通则之间的复杂引用关系网络:
图3: 药品条目与通则的REFER_TO关系网络 - 展示了1,239个节点和1,652个关系,蓝色节点为药品条目,橙色/粉色节点为通则和分类
图例说明:
- 蓝色节点 (1225个): Medicine节点 - 药品条目
- 橙色节点: Category节点 - 分类
- 粉色节点: Volume节点 - 卷册
- 白色连线: BELONGS_TO关系 (1238条)
- 灰色连线: REFER_TO关系 (2339条) - 药品引用通则
这个复杂的关系网络展示了药典知识图谱的强大关联能力,可以快速查询:
- 某个药品引用了哪些通则
- 某个通则被哪些药品引用
- 药品之间的间接关联关系
- 跨部门的知识关联
详细架构请参考:
doc/技术文档.mdfigs/药典知识图谱4部整体的框架.png
# 运行CRUD功能测试
python CURD/test_crud.py
# 运行使用示例
python CURD/example_usage.py
# 检查药品与通则的关联
python build/check_link_medicine_to_rules.py# 警告:此操作将删除Neo4j中的所有节点和关系
python build/delete_all_KGnodes.py- 遵循PEP 8编码规范
- 使用有意义的变量和函数名
- 添加适当的注释和文档字符串
- 使用类型提示增强代码可读性
- 技术文档:
doc/技术文档.md- 完整的技术实现细节 - 构建指南:
doc/构建顺序v1.md- 知识图谱构建流程 - CRUD文档:
CURD/README.md- CRUD操作详细说明 - 使用指南:
CURD/USAGE.md- 快速上手指南 - 接口文档:
Postgres/doc/接口文档.md- PostgreSQL接口说明
-
环境要求
- Python 3.8 或更高版本
- Neo4j 4.0 或更高版本
- PostgreSQL 12 或更高版本
-
性能优化
- 建议为Neo4j分配至少2GB堆内存
- 对于大规模数据导入,使用批量操作
- 合理设置PostgreSQL连接池大小
-
数据安全
- 定期备份Neo4j和PostgreSQL数据库
- 修改默认密码
- 限制数据库访问权限
-
Windows环境
- 某些操作可能需要管理员权限
- 注意文件路径的反斜杠转义
本项目采用 GNU General Public License v3.0 许可证 - 详见 LICENCE 文件


