4、材料数据库概览:Materials Project、OQMD、AFLOW、NOMAD,API使用入门。
做材料计算的人,手头没几个趁手的数据库,就像厨师没有食材。我个人习惯,开工之前先翻数据库,而不是上来就闷头算。今天咱们聊聊四个主流材料数据库:Materials Project、OQMD、AFLOW、NOMAD。顺便带大家入门API调用——说白了,就是让机器帮你查数据,别一个个手动下载。
4.1 四大数据库,各有什么看家本领?
这四个库,我每个都用过。它们各有侧重,也各有脾气。先看个总览表格:
| 数据库 | 核心特点 | 数据量(约) | 我最常用的场景 |
|---|---|---|---|
| Materials Project | 最全面,社区活跃,API最成熟 | 15万+ 无机材料 | 快速筛选已知结构,做相图分析 |
| OQMD | 侧重热力学稳定性,计算速度快 | 100万+ 化合物 | 找亚稳态材料,做凸包图 |
| AFLOW | 数据标准化好,有自动计算流程 | 350万+ 材料条目 | 做高通量筛选,找结构原型 |
| NOMAD | 原始数据仓库,含未发表数据 | 1亿+ 计算任务 | 复现文献结果,找原始计算参数 |
嗯,这里要注意:数据量不是越大越好。NOMAD虽然条目最多,但很多是原始计算文件,没经过统一处理。你想想看,如果你只想查个带隙,去NOMAD反而费劲。
4.2 Materials Project:我的首选数据库
我个人习惯,80%的查询都先走Materials Project。为什么?因为它API文档写得最清楚,社区也最大。遇到问题,Stack Overflow上基本能找到答案。
我曾经有个项目,需要找一种在高温下稳定的锂离子导体。手动翻文献太慢,我就写了个脚本,用MP的API批量查询含锂的氧化物,再按带隙和形成能排序。结果呢?两天就筛出了三个候选材料,其中一个后来被实验验证了。
4.3 OQMD:热力学稳定性的利器
OQMD的全称是Open Quantum Materials Database。它最大的特点是——计算速度快,数据量大。它用了更轻量的计算参数,所以能跑出上百万个结构。
但有个坑:OQMD的计算精度不如MP。我曾经对比过同一个结构在两个库里的形成能,差了0.1 eV/atom。所以我的建议是:做趋势分析用OQMD,做精确计算还是得回MP。
4.4 AFLOW:结构原型的大宝库
AFLOW的特色在于它有一套自动化的计算流程,而且对每个材料都做了结构原型分类。说白了,就是告诉你这个材料属于哪种晶体结构类型——比如是钙钛矿型,还是岩盐型。
我建议做材料分类任务时,优先用AFLOW。它的标签系统很规范,省去了你自己做结构匹配的麻烦。
4.5 NOMAD:原始数据的档案馆
NOMAD跟前面三个不一样。它不提供处理好的数据,而是保存原始计算文件——INCAR、POSCAR、KPOINTS这些。如果你想知道某个文献里的计算到底用了什么参数,去NOMAD翻原始文件是最靠谱的。
但说实话,NOMAD的API用起来不太顺手。它的数据模型复杂,查询速度也慢。我个人只在需要复现结果时才用它。
4.6 API使用入门:让数据自己跑过来
好了,数据库介绍完了。接下来是实操——怎么用API批量获取数据。我以Materials Project为例,因为它最成熟。
4.6.1 安装和认证
首先,你得去Materials Project官网注册,拿到一个API密钥。然后安装Python包:
pip install pymatgen
pip install mp-api
设置API密钥:
from mp_api.client import MPRester
# 建议把密钥存在环境变量里,别硬编码在代码中
api_key = "你的密钥"
mpr = MPRester(api_key)
4.6.2 基础查询:按元素和属性筛选
举个例子,我想找所有含锂和氧的化合物,带隙大于3 eV,形成能小于0:
results = mpr.materials.summary.search(
elements=["Li", "O"],
band_gap=(3.0, None), # 带隙大于3
formation_energy_per_atom=(None, 0.0) # 形成能小于0
)
for r in results[:5]:
print(f"{r.material_id}: {r.formula}, 带隙={r.band_gap:.2f} eV")
你看,代码就这么几行。数据就自动拉回来了。为什么会这样?因为MP的API把复杂的数据库查询封装成了简单的Python方法。
4.6.3 批量下载结构
有时候我们需要下载一批结构的CIF文件,用于后续的DFT计算或机器学习。我建议用下面的方式:
# 获取前10个结果的结构
structures = mpr.materials.get_structures_by_ids(
[r.material_id for r in results[:10]]
)
for i, struct in enumerate(structures):
struct.to(f"cif", f"material_{i}.cif")
print(f"已保存 material_{i}.cif")
嗯,这里要注意:一次别下载太多。MP的API有频率限制,我试过一次性请求1000个结构,结果被限流了。建议分批下载,每次100个左右。
4.6.4 其他数据库的API简介
OQMD和AFLOW也有Python API,但用法略有不同:
- OQMD:使用pymatgen的OQMDAdaptor,或者直接请求REST API。它的返回格式是JSON,需要自己解析。
- AFLOW:有aflowpy库,但文档不如MP详细。我建议直接用AFLOW的REST API,参数用URL拼接。
- NOMAD:使用nomad-lab包,但查询语法复杂。我一般只在需要原始计算文件时才用它。
4.7 本章知识体系
下面这张图,是我自己梳理的数据库使用流程。你想想看,从问题到答案,中间经过哪些步骤:
这张图的核心逻辑是:先想清楚你要什么,再选数据库,然后用API把数据拉回来。数据到手后,要么直接分析,要么喂给机器学习模型。别一上来就调API,先想清楚问题。
4.8 避坑总结
最后,我把自己踩过的坑总结一下:
- API密钥别硬编码:用环境变量或配置文件。我见过同事把密钥传到GitHub上,结果被全网公开。
- 注意数据版本:不同数据库的计算参数可能不同。同一个材料,MP和OQMD的结果可能有差异。
- 别一次请求太多:API有频率限制。我建议每次请求不超过100条,加个time.sleep(1)避免被封。
- 本地缓存数据:重复查询很浪费。我习惯把查到的数据存成JSON或SQLite,下次直接读本地。
好了,数据库这块就聊到这儿。API这东西,上手了就觉得简单。关键是养成习惯——遇到材料问题,先查数据库,别自己闷头算。
公众号:蓝海资料掘金营,微信deep3321