第二章:材料数据获取与数据库

做材料发现,说白了就是跟数据打交道。我入行那会儿,数据全靠自己动手测,做个相图得熬好几个通宵。现在不一样了,公开数据库就像一座座金矿,关键是你得知道怎么挖。

这一章,我就带你看看几个主流的公开材料数据库,聊聊怎么用API调数据,再讲讲数据版权那些事儿。嗯,这些坑我都踩过,你听听看。

2.1 三大公开材料数据库

目前学术界用得最多的,就是Materials Project、OQMD和AFLOW。这三个库各有脾气,我一个个说。

2.1.1 Materials Project(MP)

这个库是MIT的Gerbrand Ceder团队搞的,算得上是材料基因组计划的标杆。我个人习惯,做新项目前先上MP扫一遍,看看有没有现成的数据。

MP的特点:

  • 数据量大:收录了超过15万种无机材料
  • 计算标准统一:全部用DFT+U方法算的,一致性很好
  • API支持完善:pymatgen库就是他们家出的
我的小技巧:MP的API有速率限制,每分钟最多100次请求。我一般会在代码里加个time.sleep(0.6),免得被封。

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))
注意:OQMD的服务器在美国,国内访问可能有点慢。我建议你加个超时设置,比如timeout=30,免得程序卡死。

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.
避坑指南:我曾经在投一篇Nature子刊时,审稿人专门查了数据来源的引用。有个数据我忘了标来源,差点被拒稿。所以,养成好习惯,每用一条数据都记下出处。

2.4 本章知识体系

下面这张图,是我梳理的本章核心逻辑。你看一眼,心里就有谱了。

材料数据获取与数据库知识体系 Materials Project OQMD AFLOW 数据获取方式 pymatgen库调用 RESTful API GraphQL查询 数据版权与引用规范(CC BY / CC BY-SA / GPL)

说白了,数据获取这件事,核心就三点:知道去哪找、知道怎么拿、知道怎么用。数据库是死的,人是活的。你掌握了API调用,就等于拿到了打开材料数据宝库的钥匙。

嗯,这一章就到这儿。记住,数据是材料发现的燃料,但别忘了给燃料加个「引用」的标签。

专注资料整理