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批量查询含锂的氧化物,再按带隙和形成能排序。结果呢?两天就筛出了三个候选材料,其中一个后来被实验验证了。

核心要点: Materials Project的数据经过统一计算流程(VASP + 特定赝势),所以不同材料之间可比性很好。这是它最大的优势。

4.3 OQMD:热力学稳定性的利器

OQMD的全称是Open Quantum Materials Database。它最大的特点是——计算速度快,数据量大。它用了更轻量的计算参数,所以能跑出上百万个结构。

但有个坑:OQMD的计算精度不如MP。我曾经对比过同一个结构在两个库里的形成能,差了0.1 eV/atom。所以我的建议是:做趋势分析用OQMD,做精确计算还是得回MP。

避坑指南: 我曾经直接用OQMD的数据训练机器学习模型,结果预测误差很大。后来发现是数据一致性有问题——不同版本的计算参数有变化。所以用OQMD做训练集时,一定要筛选计算版本。

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)
小技巧: 我习惯把API密钥写在~/.bashrc里,用os.getenv()读取。这样代码分享出去也不会泄露密钥。

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包,但查询语法复杂。我一般只在需要原始计算文件时才用它。
我的经验: 如果你刚开始学API,先死磕Materials Project。把MP的API用熟了,其他数据库的API上手就快了。因为核心逻辑都一样——构造查询条件,发送请求,解析返回数据。

4.7 本章知识体系

下面这张图,是我自己梳理的数据库使用流程。你想想看,从问题到答案,中间经过哪些步骤:

材料数据库使用流程 1. 定义问题 需要什么材料? 2. 选择数据库 MP / OQMD / AFLOW 3. 构造查询 API参数 / 筛选条件 4. 数据 数据后处理 清洗 / 格式化 / 合并 机器学习建模 特征工程 / 模型训练 输出:候选材料列表 / 预测模型 / 结构文件 图例: 问题定义 数据库 查询 数据获取 后处理 机器学习 输出

这张图的核心逻辑是:先想清楚你要什么,再选数据库,然后用API把数据拉回来。数据到手后,要么直接分析,要么喂给机器学习模型。别一上来就调API,先想清楚问题。

4.8 避坑总结

最后,我把自己踩过的坑总结一下:

  • API密钥别硬编码:用环境变量或配置文件。我见过同事把密钥传到GitHub上,结果被全网公开。
  • 注意数据版本:不同数据库的计算参数可能不同。同一个材料,MP和OQMD的结果可能有差异。
  • 别一次请求太多:API有频率限制。我建议每次请求不超过100条,加个time.sleep(1)避免被封。
  • 本地缓存数据:重复查询很浪费。我习惯把查到的数据存成JSON或SQLite,下次直接读本地。

好了,数据库这块就聊到这儿。API这东西,上手了就觉得简单。关键是养成习惯——遇到材料问题,先查数据库,别自己闷头算。


公众号:蓝海资料掘金营,微信deep3321