第4章:材料数据库——Materials Project、OQMD、AFLOW等公开数据库介绍与API使用
做材料设计,最头疼的是什么?我个人觉得,不是算法不够好,而是数据太难找。
十年前我刚入行那会儿,查个材料数据得翻文献、查手册,有时候为了一个晶格常数得折腾半天。现在好了,公开数据库越来越多,数据量也越来越大。但问题又来了——数据库太多,到底该用哪个?API怎么调?今天我就把几个主流数据库掰开揉碎了讲讲。
4.1 三大主流材料数据库概览
目前学术界和工业界用得最多的,就是Materials Project、OQMD和AFLOW这三家。它们各有侧重,我一个个说。
| 数据库 | 机构 | 数据量 | 特点 |
|---|---|---|---|
| Materials Project | MIT & LBNL | ~15万种材料 | 计算数据最全,社区活跃 |
| OQMD | 西北大学 & NIST | ~100万种材料 | 数据量大,侧重相图 |
| AFLOW | 杜克大学 | ~350万种材料 | 自动化流程,数据标准化 |
你想想看,光一个Materials Project就有15万种材料,每个材料还带着几十个属性——带隙、形成能、弹性常数、压电系数……这要是靠人工查,得查到猴年马月去。
4.2 Materials Project:最常用的材料数据库
我个人习惯先从Materials Project入手。为什么?因为它的API最成熟,文档最清晰,社区也最大。
4.2.1 注册与API密钥获取
要用API,得先注册。去materialsproject.org注册个账号,然后在个人设置里生成API密钥。嗯,这里要注意:密钥别泄露,别往GitHub上乱传。我曾经见过有人把密钥硬编码在代码里,结果被爬虫扫到,账号直接被封了。
4.2.2 使用Python调用MP API
官方推荐用pymatgen库,这玩意儿是材料计算的瑞士军刀。先安装:
pip install pymatgen
然后写个简单的查询脚本:
from pymatgen.ext.matproj import MPRester
# 用你的API密钥替换下面的字符串
API_KEY = "你的API密钥"
with MPRester(API_KEY) as mpr:
# 查询带隙大于1.5eV的氧化物
criteria = {"elements": ["O"], "band_gap": {"$gt": 1.5}}
properties = ["material_id", "formula_pretty", "band_gap", "formation_energy_per_atom"]
results = mpr.query(criteria, properties)
for r in results[:5]:
print(f"{r['material_id']}: {r['formula_pretty']}, "
f"带隙={r['band_gap']:.2f}eV, "
f"形成能={r['formation_energy_per_atom']:.3f}eV/atom")
跑一下,就能拿到符合条件的材料列表。说白了,这就是在数据库里做SQL查询,只不过换成了MongoDB的语法。
4.3 OQMD:相图分析的好帮手
OQMD的全称是Open Quantum Materials Database。它最大的特点是数据量大——超过100万种材料。但说实话,数据质量参差不齐,有些计算参数不太一致。
我一般在做相图分析时才会用OQMD。比如研究某个体系的稳定相,OQMD的覆盖度比Materials Project广得多。
4.3.1 OQMD的API使用
OQMD的API相对简单,用requests库就能调:
import requests
BASE_URL = "https://oqmd.org/api"
# 查询含Fe和O的稳定相
response = requests.get(
f"{BASE_URL}/materials",
params={
"elements": "Fe,O",
"stability": "stable",
"limit": 10
}
)
data = response.json()
for mat in data['data']:
print(f"{mat['formula']}: 形成能={mat['formation_energy']:.3f}eV/atom")
你看,代码比MP的还简洁。但有个坑——OQMD的API文档更新不及时,有些参数名跟文档对不上。我曾经踩过这个坑,查了半天才发现是参数名写错了。
4.4 AFLOW:自动化高通量计算的标杆
AFLOW是杜克大学搞的,全称是Automatic FLOW for Materials Discovery。它的特点是所有计算流程都标准化了,数据一致性最好。
但说实话,AFLOW的API用起来稍微麻烦点。它用的是RESTful API,返回的是XML格式,得自己解析。
4.4.1 AFLOW的API调用示例
import requests
import xml.etree.ElementTree as ET
AFLOW_URL = "http://aflowlib.org/API/aflow"
# 查询带隙在1.0-2.0eV之间的材料
params = {
"api": "aflow",
"cmd": "search",
"species": "O",
"band_gap": "1.0,2.0",
"format": "xml"
}
response = requests.get(AFLOW_URL, params=params)
root = ET.fromstring(response.content)
for entry in root.findall(".//entry"):
formula = entry.find("formula").text
band_gap = entry.find("band_gap").text
print(f"{formula}: 带隙={band_gap}eV")
嗯,这里要注意:AFLOW的API有调用频率限制,别一次性发太多请求。我刚开始用的时候没注意,结果IP被临时封了半小时。
4.5 数据库对比与选型建议
说了这么多,到底该用哪个?我根据自己的经验,给个简单的选型建议:
- 做新材料筛选: 首选Materials Project,数据质量高,社区活跃,遇到问题容易找到解决方案
- 做相图分析: 用OQMD,数据量大,覆盖的体系多
- 做机器学习训练: 用AFLOW,数据标准化程度高,特征一致性最好
- 做交叉验证: 三个数据库都查一遍,取交集或并集
4.6 本章知识体系
为了让你更直观地理解这几个数据库的关系和使用场景,我画了张图:
这张图把三个数据库的特点和应用场景串起来了。你想想看,做材料设计时,数据获取是第一步,也是最关键的一步。数据不对,后面再好的算法也是白搭。
4.7 实战建议
最后,给几个实战中的小建议:
- 别只依赖一个数据库: 不同数据库的计算参数可能不同,同一个材料在不同数据库里的数据可能有差异。我一般会交叉验证。
- 注意数据版本: 数据库会不断更新,同一个材料ID在不同版本里的数据可能不一样。做研究时记得记录数据版本。
- 缓存查询结果: API调用有次数限制,而且网络请求也慢。我习惯把查询结果存成JSON文件,下次直接读本地。
- 批量查询要节制: 别一次性查几万条数据,服务器会受不了。分批次查,每批几百条,中间加个sleep。
好了,数据库这块就聊到这儿。记住一句话:数据是材料AI的燃料,选对数据库,你的工作就成功了一半。
公众号:蓝海资料掘金营,微信deep3321