第二章:材料数据获取与数据库
做材料发现,说白了就是跟数据打交道。我入行那会儿,数据全靠自己动手测,做个相图得熬好几个通宵。现在不一样了,公开数据库就像一座座金矿,关键是你得知道怎么挖。
这一章,我就带你看看几个主流的公开材料数据库,聊聊怎么用API调数据,再讲讲数据版权那些事儿。嗯,这些坑我都踩过,你听听看。
2.1 三大公开材料数据库
目前学术界用得最多的,就是Materials Project、OQMD和AFLOW。这三个库各有脾气,我一个个说。
2.1.1 Materials Project(MP)
这个库是MIT的Gerbrand Ceder团队搞的,算得上是材料基因组计划的标杆。我个人习惯,做新项目前先上MP扫一遍,看看有没有现成的数据。
MP的特点:
- 数据量大:收录了超过15万种无机材料
- 计算标准统一:全部用DFT+U方法算的,一致性很好
- API支持完善:pymatgen库就是他们家出的
2.1.2 OQMD(Open Quantum Materials Database)
OQMD是西北大学做的,主打一个「全」。他们收录了超过80万种材料,比MP多得多。但说实话,数据质量参差不齐,有些计算参数没统一。
我曾经用OQMD的数据训练一个带隙预测模型,结果发现好几条数据跟实验值差了一个数量级。后来一查,是计算时用了不同的赝势。所以用OQMD的数据,一定要先做清洗。
2.1.3 AFLOW
AFLOW是杜克大学搞的,特色是自动化流程。他们把所有计算步骤都标准化了, reproducibility(可重复性)做得很好。
这三个库的对比,我整理了个表:
| 数据库 | 材料数量 | 计算标准 | API成熟度 | 我推荐的使用场景 |
|---|---|---|---|---|
| Materials Project | ~15万 | 统一(PBE+U) | ★★★★★ | 做机器学习、高通量筛选 |
| OQMD | ~80万 | 部分统一 | ★★★★ | 做统计分析、找趋势 |
| AFLOW | ~30万 | 高度统一 | ★★★ | 做相图、热力学计算 |
2.2 数据爬取与API调用
手动下载数据?那太慢了。我建议你直接学API调用,一劳永逸。
2.2.1 用pymatgen调MP数据
pymatgen是MP的亲儿子库,用起来最顺手。先装一下:
pip install pymatgen
然后申请个API Key,去MP官网注册就行。拿到Key后,代码长这样:
from pymatgen.ext.matproj import MPRester
# 用你的API Key替换下面的字符串
mpr = MPRester("你的API_KEY")
# 查询带隙大于2.0 eV的氧化物
criteria = {"elements": {"$in": ["O"]},
"band_gap": {"$gt": 2.0}}
results = mpr.query(criteria,
properties=["material_id",
"pretty_formula",
"band_gap"])
for r in results[:5]:
print(f"{r['pretty_formula']}: {r['band_gap']:.2f} eV")
你看,就这么几行,数据就到手了。我刚开始用的时候,经常忘了加速率限制,结果被服务器ban了半小时。嗯,这个坑你注意一下。
2.2.2 直接调RESTful API
如果你不想用pymatgen,也可以直接调HTTP请求。MP的API文档写得很清楚,我举个例子:
import requests
url = "https://api.materialsproject.org/materials/v1/mp-1234"
headers = {"X-API-KEY": "你的API_KEY"}
response = requests.get(url, headers=headers)
data = response.json()
print(data["data"]["band_gap"])
这种方式更灵活,但需要自己处理JSON解析。我个人习惯用pymatgen,省事儿。
2.2.3 爬取OQMD数据
OQMD的API稍微不一样,他们用的是RESTful + GraphQL混合。我写了个小脚本,批量下载某个元素体系的数据:
import requests
import json
# OQMD的GraphQL端点
url = "https://oqmd.org/graphql"
query = """
{
materials(composition: "Fe2O3") {
id
composition
band_gap
formation_energy
}
}
"""
response = requests.post(url,
json={"query": query})
data = response.json()
print(json.dumps(data, indent=2))
2.3 数据版权与引用规范
这个问题容易被忽视,但很重要。你想想看,辛辛苦苦算出来的数据,被别人拿去发文章却不引用,换你你也不爽。
2.3.1 各数据库的版权声明
- Materials Project:数据采用CC BY 4.0协议,可以自由使用,但必须署名
- OQMD:采用CC BY-SA 4.0协议,可以修改和商用,但要共享衍生作品
- AFLOW:采用GPL v3协议,开源但限制商用
2.3.2 引用格式
我一般这么引用:
# Materials Project
Jain, A., Ong, S.P., Hautier, G., et al.
"Commentary: The Materials Project: A materials genome approach
to accelerating materials innovation."
APL Materials, 2013, 1(1), 011002.
# OQMD
Saal, J.E., Kirklin, S., Aykol, M., et al.
"Materials Design and Discovery with High-Throughput Density
Functional Theory: The Open Quantum Materials Database (OQMD)."
JOM, 2013, 65(11), 1501-1509.
# AFLOW
Curtarolo, S., Setyawan, W., Hart, G.L.W., et al.
"AFLOW: An automatic framework for high-throughput materials
discovery." Computational Materials Science, 2012, 58, 218-226.
2.4 本章知识体系
下面这张图,是我梳理的本章核心逻辑。你看一眼,心里就有谱了。
说白了,数据获取这件事,核心就三点:知道去哪找、知道怎么拿、知道怎么用。数据库是死的,人是活的。你掌握了API调用,就等于拿到了打开材料数据宝库的钥匙。
嗯,这一章就到这儿。记住,数据是材料发现的燃料,但别忘了给燃料加个「引用」的标签。