信息速览
非洲有大约四万到五万种被子植物,其中被民族植物学文献记录过药用用途的有几千种。但真正被化学家分离、定出结构、写进期刊的化合物,只占其中很小一部分——而这一小部分又散在几千篇论文、非洲各国高校的学位论文、以及大量只在本地流通的刊物里。ANPDB 要收拾的就是这堆散件:它把这些已发表的结构一条条录进来,归并、编号、挂上来源植物与生物活性,做成一个能下载、能检索的库。
难的地方不在「收多少」。同一种化合物在不同文献里叫不同名字,在天然产物领域格外严重:一个黄酮可能有两三个俗名、一个商品名、一个系统名,外加缩写。收得越多,重复越多;不收重复,库就撑不起来。ANPDB 把「结构去重」当核心工作量,把物种、部位、活性、文献都塞进同一行——这个设计决定了它能否被正确计数,也决定了它最容易被误用的地方。
本文只回答三件事:它是什么、够不够用、该不该选它。核验对象是官方站点 african-compounds.org 与 2026 年《核酸研究》数据库专刊论文,凡未在官方出处见到的数字,一律标注来源层级。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 英文全称 | African Natural Products Database |
| 中文名 | 非洲天然产物数据库 |
| 常用缩写 | ANPDB |
| 维护方 | 弗赖堡大学药物生物信息学组(德国)+ 布埃亚大学药物发现中心(喀麦隆) |
| 官方入口 | https://african-compounds.org |
| 数据服务地址 | https://phabidb.vm.uni-freiburg.de/anpdb/ |
| 化合物数 | 11,448(统计页精确值) |
| 物种数 | 一千八百八十二 |
| 科数 | 269 |
| 文献数 | 2,121 篇 |
| 主键形态 | ANP_00001 式编号 |
| 结构表示 | SDF 二维结构 + SMILES 串 |
| 下载格式 | CSV 14.8 MB、SDF 34.4 MB、物种 CSV 1.3 MB |
| 许可 | CC BY-NC 4.0(非商业) |
| 文献年代跨度 | 1961 至 2024 |
| 最容易被误当成 | NAPRALERT、AfroDB、NANPDB、p-ANAPL |
§1 它要解决的具体麻烦
1.1 物种很多,被化学研究过的很少
先把「多样性」这件事说清楚。非洲的维管植物丰富度高,这不是争议;但「有多少种被做过化学成分研究」是另一回事。全球天然产物研究长期集中在少数几个被反复采样的区域:东亚、南亚、南美的部分雨林、以及欧美的药厂采集网络。非洲在其中的占比长期偏低,原因不在物种少,而在采集、鉴定与发表能力长期受制于研究基础设施。
能查到的线索是全球规模的开放库 COCONUT:它把全世界发表过的天然产物统一重编码,收录在百万量级;ANPDB 的非洲来源化合物在一万量级。两个数量级的差距,一部分来自收录标准(全球 vs 非洲),另一部分才是真正的空白。空白有多大,得靠同口径比较,§4 与 §7 还会回到。
ANPDB 解决的正是「散」。它不产生新数据,而是把已有文献里的结构搬进可检索、可下载的容器,配上物种与活性字段,让人能从「我要找某种活性的非洲分子」反向检索,而不是从「我记得某篇 1998 年的文章」正向联想。对做虚拟筛选的人,后者不可用,前者才是入口。
1.2 三条常见的错误期待
第一条是把它当成「非洲天然产物全集」。它只收团队读到并录入的文献;各国高校的内部学位论文、法语与葡语地方期刊覆盖不完全。官方列的来源是主流期刊、非洲高校图书馆学位论文与部分本地刊物,三个有限来源,不是普查。
第二条是把它当成化合物-活性关系的金标准。活性字段把文献里的一句话压成几个词,同一个词在不同论文里对应的实验设计、细胞系、剂量可能完全不同。做定量构效关系时,它只能当粗筛。
第三条是把它当成静态快照。站点有社区补录机制,但没有公布固定更新周期;今天下载的文件和三个月后可能不一样,而文件里没有版本号。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 拿到非洲来源化合物的二维结构,做分子对接 | SDF 与 SMILES 全量下载,含 34.4 MB 的结构文件 | 够;但立体化学标注不全,需自查 |
| 从活性出发反查非洲分子 | bioactivity 字段可按词检索 |
勉强够;只到词级别,不带剂量与实验类型 |
| 化合物对应哪个植物、哪个科、采自哪个国家 | 物种、科、NCBI 分类号、采集国、取材部位 | 够 |
| 传统药用用途 | 来源物种层面的民族植物学元数据 | 部分够;挂在物种上,不挂在化合物上 |
| 拿到实验核磁与质谱谱图原始文件 | 站点给谱图,但明确含预测部分 | 不够;须先分清实验谱与模拟谱 |
| 找全非洲研究过的所有天然产物 | 只覆盖团队录入的文献 | 不够;覆盖深度未公开量化 |
| 商业项目里直接使用 | CC BY-NC 4.0 | 不够;商用须另谈 |
| 做跨区域的天然产物比较研究 | 可与其他库按结构重新归并后比较 | 够,但归并的误差要自己承担 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 手上有非洲传统药用植物的粗提物,活性好,想快速判断里面的分子有没有被报道过 | 用核磁与质谱检索做去重复,先把「已知的」排掉 | 先按 §5 的谱图检索路径试一轮,再用 SDF 建本地索引 |
| 要做非洲来源分子的虚拟筛选,缺起点库 | 直接给一万余个结构,带类别与骨架字段 | 按类别或骨架抽子集,别一次全上 |
| 在写综述,需要非洲天然产物的规模数字 | 站点统计页给出化合物、物种、科、文献四个数 | 引论文而非站点,口径差异写进方法 |
| 在搭知识图谱,要把化合物、物种、文献连起来 | 三者的关联在 CSV 里以同一行的形式存在 | 按 molecule_id 与 ncbi_taxonomy_id 建两个节点表 |
| 在找某个具体化合物的非洲来源文献 | 用同义名检索能命中,synonyms 列有大量别名 | 同义名是拼接字符串,检索前先切分 |
| 想比较非洲化合物与中国、南美化合物的化学空间差异 | 提供可比的 SDF 与骨架字段 | 用统一的标准化流程重算指纹,不要混用各自的口径 |
| 打算回到非洲某国采集样本 | 只提供文献信息,不提供实物流转 | 先查该国的遗传资源获取与惠益分享法规 |
1.5 一句话判断
如果你要的是「非洲来源天然产物的结构起点库」,它是目前能整包下载、且带物种与文献链条的少数选项之一;如果你要的是「非洲天然产物研究的完整清单」,它只是其中一层,且这一层的边界没有被官方量化过。
1.6 不适合谁:四条边界
第一,不适合把行数当实验数的人。一条记录是一个结构,不是一次分离实验:一个化合物在几十篇文献、几十个物种里出现过仍只占一行,次数记在 number_occurrences 单元格里。用行数做频次统计会系统性低估常见化合物的研究密度。
第二,不适合需要定量活性数据的人。活性是词不是数,没有半抑制浓度、没有细胞系、没有给药途径,做预测时只能当多标签弱标签,不能当回归目标。
第三,不适合需要完整实验谱图的人。站点把实验与预测谱图放在一起,界面与文件里没有给出一个干净的开关把两者分开。做结构确证类工作,必须先确认谱图来源。
第四,不适合直接进商业管线的团队。许可写明非商业,商用须另行授权,走不通就别把它当资产写进尽调材料。
§2 数据构成与规格
2.1 一张主表、一张物种表、一个结构文件
ANPDB 的下载页只放三个文件,结构非常朴素。主表是化合物表,CSV 格式,14.8 MB;结构文件是同名的 SDF,34.4 MB;第三份是物种表,1.3 MB。没有压缩包,没有分卷,没有校验和文件,也没有随包发布的版本说明或字段字典。
极简布置有两个后果。好处是接入成本近零:三行 curl 拿全,不用注册、不用令牌、不用排队。坏处是「口径」全靠外部文档:字段含义在帮助页,许可在首页页脚,版本要看论文投稿日——三处分在不同页面,且不完全一致(见 §2.4)。
主表一行对应一个化合物,统计页把「Molecules」与「Species」分列两行也印证了这一点。一个化合物来自十个物种时,species 里是十个名字用竖线连起来,而不是拆成十行。所以「行数 = 化合物数」成立,「行数 = 化合物 × 物种」不成立。
结构文件是 SDF:每个分子块以 $$$$ 分隔,首行是名称,接着是 V2000 原子与键块,末尾是 > <字段名> 数据标签。坐标是 RDKit 生成的二维坐标,不是文献原图,做三维构象时不能直接用。
2.2 字段/记录的完整字典
主表 CSV 的表头共 39 列(其中 pubchem_id 出现两次,一处在前部、一处在外部编号区,实际不同名的字段为 38 个)。下表按用途分组。
| 序号 | 字段名 | 含义 | 取值形态 | 典型值 |
|---|---|---|---|---|
| 1 | molecule_id |
主键,库内编号 | ANP_ 加五位数字 |
ANP_00001 |
| 2 | mol_name |
化合物主名 | 文本,多数为英文俗名或系统名 | syringin |
| 3 | pubchem_id |
PubChem 编号(前部出现一次) | 数字串 | 5316860 |
| 4 | smiles |
一维结构串 | 含立体标记的 SMILES | OC/C=C/c1cc(...) |
| 5 | synonyms |
同义名与外部编号的拼接串 | 竖线分隔,可长至数百项 | `syringin \ |
| 6 | class_name |
化合物大类 | 小写英文词,多值时竖线分隔 | glycoside |
| 7 | subclass_name |
化合物亚类 | 同上 | cinnamyl alcohol glycoside |
| 8 | bioactivity |
生物活性 | 小写英文短语,多值竖线分隔 | `antimicrobial \ |
| 9 | species |
来源物种(按文献原文) | 竖线分隔 | Sanchezia nobilis |
| 10 | species_most_recent_name |
最新接受名 | 竖线分隔 | Sanchezia nobilis |
| 11 | ncbi_taxonomy_id |
NCBI 分类号 | 数字串 | 71612 |
| 12 | kingdom |
界 | Plantae 等 |
Plantae |
| 13 | family |
科 | 拉丁科名 | Acanthaceae |
| 14 | part_org |
取材部位 | 自由文本,竖线分隔 | aerial parts |
| 15 | country_collected |
采集国 | 国名,竖线分隔 | Egypt |
| 16 | place_of_collection |
采集地细目 | 自由文本 | Aswan Botanical Garden, Aswan |
| 17 | reference_title |
文献标题 | 文本 | 期刊论文题目 |
| 18 | reference_authors |
作者串 | 姓氏加缩写 | Abd Ellah AE, Mohamed KM |
| 19 | Pub_year |
发表年 | 四位数字,竖线分隔 | 2014 |
| 20 | PMID |
PubMed 编号 | 数字串,可空 | 空值常见 |
| 21 | reference_link |
文献链接 | 域名加路径,多数不带协议头 | link.springer.com/article/... |
| 22 | number_occurrences |
该结构在库内的出现次数 | 数字串 | 54 |
| 23 | scaffolds |
Bemis-Murcko 骨架 | 分级前缀加 SMILES,竖线分隔 | L0:c1ccccc1 |
| 24 | pubchem_id(重复列) |
与第 3 列同名 | 数字串 | 5316860 |
| 25 | cas |
CAS 登记号 | 带连字符数字 | 118-34-3 |
| 26 | gnps_id |
GNPS 分子网络编号 | 文本,大面积为空 | 空 |
| 27 | zinc_id |
ZINC 编号 | 文本 | 空 |
| 28 | kegg_ligand_id |
KEGG 配体编号 | 形如 C 加数字 |
空 |
| 29 | chebi_id |
ChEBI 编号 | 形如 CHEBI: 加数字 |
空 |
| 30 | nmrshiftdb2_id |
nmrshiftdb2 编号 | 数字串 | 空 |
| 31 | metabolights_id |
MetaboLights 编号 | 文本 | 空 |
| 32 | molport_id |
MolPort 编号 | 数字串 | 空 |
| 33 | chembl_id |
ChEMBL 编号 | CHEMBL 加数字 |
空 |
| 34 | comptox_id |
CompTox 编号 | DTXSID 加数字 |
空 |
| 35 | actor_id |
Actor 平台编号 | 文本 | 空 |
| 36 | drugbank_id |
DrugBank 编号 | DB 加数字 |
DB04216 |
| 37 | pdb_ligand_id |
PDB 配体三字码 | 三字母 | 空 |
| 38 | bindingdb_id |
BindingDB 编号 | 文本 | 空 |
| 39 | selleck_id |
Selleck 目录号 | 文本 | 空 |
外部编号这一段列了十五个库的编号,看上去是互联互通,实际上各列空值率差异很大:PubChem、CAS、ChEBI 在有数据的行里填得较满,MetaboLights、Actor、BindingDB 大部分为空。这不是缺陷,是天然产物的现实——只在非洲某篇论文里出现过一次的化合物,本来就不会进代谢组学数据库。正确的态度是「恰好有就顺手用」,别当 ID 映射的键。
SDF 的数据标签少得多:每个分子块后面只挂五个标签(编号、PubChem 编号、来源物种、分类号、类别)。也就是说 SDF 是「结构 + 最少溯源」版,做活性分析必须回 CSV 按 molecule_id 关联。
2.3 一条记录的完整解剖
挑一条短记录来解剖,比抽象地讲字段有用。下面是 CSV 里 ANP_00001 这一行的真实内容(字段顺序按表头,长字段做截断)。
molecule_id : ANP_00001
mol_name : 9-O-beta-glucopyranosyl trans-cinnamyl alcohol
pubchem_id : 162877336
smiles : OCC1O[C@H](OC/C=C/c2ccccc2)[C@H](C([C@@H]1O)O)O
synonyms : 9-O-beta-glucopyranosyl trans-cinnamyl alcohol
class_name : glycoside
subclass_name : cinnamyl alcohol glycoside
bioactivity : (空)
species : Sanchezia nobilis
species_most_recent_name : Sanchezia nobilis
ncbi_taxonomy_id : 71612
kingdom : Plantae
family : Acanthaceae
part_org : aerial parts
country_collected : Egypt
place_of_collection : Aswan Botanical Garden, Aswan
reference_title : Cinnamyl alcohol, benzyl alcohol, and flavonoid
glycosides from Sanchezia nobilis
reference_authors : Abd Ellah AE, Mohamed KM, Backheet EY and Mohamed MH
Pub_year : 2014
reference_link : link.springer.com/article/10.1007/s10600-014-1092-8
number_occurrences : 1
scaffolds : L0:C1CCOCC1 | L0:c1ccccc1 | L1:c1ccccc1C=CCOC2CCCCO2
其余外部编号列 : 空
从这一条能读出四件事。其一,bioactivity 为空,说明文献只做分离与结构鉴定,没有活性测试。其二,采集地写的是「阿斯旺植物园」,属于园区标本而非野外采集,§7 会讲这为什么重要。其三,reference_link 没有协议头,做超链接时得自己补。其四,scaffolds 三个前缀分别是 L0、L0、L1,是按骨架复杂度分级罗列,不是一棵树的唯一路径。
§4.3 的案例在 SDF 里对应的分子块如下(只保留首尾与数据标签,原子坐标块略去)。
9-O-beta-glucopyranosyl trans-cinnamyl alcohol
RDKit 2D
21 22 0 0 0 0 0 0 0 0999 V2000
(21 个原子行、22 个键行,此处略)
M END
> <MoleculeID>
ANP_00001
> <PubChemID>
162877336
> <SourceSpecies>
Sanchezia nobilis
> <NCBITaxonomyID>
71612
> <Class>
glycoside (cinnamyl alcohol glycoside)
$$$$
两边的 Class 写法不同:SDF 里是「大类(亚类)」合并成一串,CSV 里拆成两列。这是导出脚本不同留下的形态差异,先解析 SDF 再关联 CSV 时要做一次拆分。
再挑一条长记录,看「去重」的形态。下面是从槲皮素那一行摘出的片段(ANP_00162):
| 项 | 内容 |
|---|---|
| 主名 | quercetin |
| 同义名 | 拼接串里有数百项,含俗名、商品名、CAS 号、ChEBI 号、各家试剂目录号 |
| 物种 | 五十余个物种名,竖线分隔 |
| 活性 | `hepatoprotective \ |
| 出现次数 | 54 |
| 类别 | `flavonoid \ |
| PubMed 编号 | 空 |
这一行是理解计数方式的关键。它在库里占一行,真实世界里却对应五十多次分离报告。数出来的「化合物数」是一万一千有余,数出来的「分离实验数」则远大于此,而后者官方没有给。这是设计选择而非缺陷,也是误用的高发区。
2.4 三个错位的口径
官方给出的规模数字不止一套。这件事在别的库里偶有发生,但 ANPDB 的错位比较明显,值得单独列出来,避免任何人拿单一数字去写方法学段落。
| 数字出处 | 化合物 | 物种 | 说明 |
|---|---|---|---|
| 站点首页卡片 | 「11,400+」 | 「1,850+」 | 取整的营销口径,带加号 |
| 站点首页正文 | 「11,000+」 | 「1,750+」 | 与卡片同页但数值不同,且注明「主要为植物」 |
| 站点统计页 | 一万一千四百四十八 | 一千八百八十二 | 精确值,与下载文件行数一致 |
| 论文摘要 | 「over 11 000」 | 未给 | 文章口径的保守说法 |
同页出现「11,400+」与「11,000+」、物种侧出现「1,850+」与「1,750+」,这是取整粒度不同,不是数据变化。本文统一口径:要精确值用统计页,要粗描说「一万一千余」,引用以论文摘要为准。差额构成官方未说明,本文不判断。
更值得注意的是另一处口径差,它也是本文标题里那个数字的来源。统计页同时列了「有生物活性信息的化合物」与「有毒性信息的化合物」两项,前者一千多个(确切值见附录 A),后者接近全库。两数与总数相减得约五百六十条——有结构、有物种、有文献,独缺活性。这个数不在任何官方口径里,只能算「官方页面派生」,它的用处是提醒:库里有相当一部分是纯分离报道,做活性预测应先单独拎出。
2.5 与同类资源的字段差异
把 ANPDB 与几个容易混淆的资源并排放在一起看字段,是分清它们最快的办法。
| 维度 | ANPDB | NAPRALERT | AfroDB | NANPDB | p-ANAPL |
|---|---|---|---|---|---|
| 范围 | 非洲来源 | 全球 | 非洲来源(历史子集) | 非洲天然产物(另一系) | 非洲天然产物(另一系) |
| 记录单位 | 去重后的结构 | 文献记录 | 结构 | 结构 | 结构 |
| 结构文件 | 开放下载 SDF | 非开放 | 曾开放 | 有限开放 | 部分开放 |
| 物种字段 | 有,含 NCBI 号 | 有,文献描述 | 有 | 有 | 有 |
| 活性字段 | 有,词级别 | 有,摘要级 | 少量 | 有 | 有 |
| 民族植物学 | 物种级元数据 | 文献级 | 少 | 部分 | 部分 |
| 谱图 | 实验+预测 | 无 | 无 | 部分 | 无 |
| 许可 | CC BY-NC 4.0 | 订阅制 | 学术 | 学术 | 学术 |
| 维护状态 | 活跃(2026 论文) | 长期维护 | 历史 | 与 ANPDB 并行 | 前身系 |
需要提醒:AfroDB、NANPDB、p-ANAPL 在文献里常被互换使用,因为一部分非洲天然产物库源自同一条学术脉络——早年 AfroDB 收了一批化合物,后来并入更大的 NANPDB 体系,p-ANAPL 是并行的另一条产品线。它们与 ANPDB 是「同领域、不同团队、不同去重口径」,不是父子关系。混用的后果是同一化合物在两边各占一行,合并时重复计数。真要合并,必须按结构重新归并,不能按名称。
§3 身份层:收的是非洲的物种,还是非洲的研究
3.1 收的是物种来自非洲,还是研究发生在非洲
这两个定义听起来差不多,实际上差得很远,而且决定了这个库能不能用来回答「非洲的化学多样性」这类问题。
按物种收,只要化合物是从原产或采于非洲的物种里分离出来的就收;按研究收,只要作者在非洲工作就收。ANPDB 取前者。证据在字段上:country_collected 是采集地,family 是植物科,ncbi_taxonomy_id 是分类号,三个字段全指向「东西从哪来」,没有一个指向「谁做的」。
这个选择很关键。关于非洲植物的化学成分研究,有相当一部分是在欧洲、北美、日本的实验室里完成的:样本从非洲出境,结构在别处解出来。按物种收录,这些都会被收进来;按研究地点收录,它们会被漏掉。物种口径是 ANPDB 做大的前提。
代价是它回答不了「非洲本土研究能力有多强」。它统计的是化学生物多样性,不是科研产出;拿它论证后者属于口径错配,不是数据错误。
3.2 编号体系与它透露的信息
主键是 ANP_ 加五位数字,从 ANP_00001 起。文件里最后一条是 ANP_19565,而总行数是一万一千余。两个数字对不上,差额约八千,意味着编号空间里有过大量被删或合并的位置——这正是去重的痕迹:管线先是给每条分离记录一个号,之后做结构级归并,被合并掉的号就变成了空洞。
所以编号是历史的,不是连续的,不要用编号做区间推断:不能因为某一号属于某个类别,就认为相邻几千条同属一类;也不能拿编号区间估算录入量。时间维度只能用 Pub_year。
空洞还说明去重是录入之后的独立步骤,而非录入时完成——这就是为什么文件里只留下合并后的一行,废弃编号不再出现。
3.3 同一批结构,三种可读的「身份」
在 ANPDB 里,一个化合物的身份可以沿三条路走,三条路的粒度不同,用途也不同。
第一条是库内身份 molecule_id:只要不重建编号就稳定,但出了库没人认识。第二条是化学身份,即结构本身;ANPDB 给了 SMILES 却没有直接给 InChI 与 InChIKey,需要自己算。第三条是外部本体身份(PubChem、CAS、ChEBI、ChEMBL),覆盖面不均:能进 PubChem 的多是有知名度的分子,只在一篇论文里出现过的微量成分往往没有。
| 身份类型 | 字段 | 稳定性 | 覆盖面 | 用途 |
|---|---|---|---|---|
| 库内身份 | molecule_id |
高(库内) | 全部行 | 主键、关联 SDF |
| 化学身份 | smiles |
高(跨库) | 全部行 | 跨库合并、指纹计算 |
| 结构哈希 | 需自算 InChIKey | 高(跨库) | 可覆盖全部 | 去重、外部比对 |
| PubChem | pubchem_id |
中 | 部分行 | 快速查文献与物性 |
| CAS | cas |
中 | 部分行 | 合规与试剂检索 |
| ChEBI | chebi_id |
中 | 少部分行 | 本体推理 |
| 分类学 | ncbi_taxonomy_id |
高 | 全部 | 物种关联 |
实操建议只有一句:用 SMILES 自算 InChIKey 作为你的主键,把 molecule_id 当外键。这样既能与库内 SDF 对上,又能在跨库合并时不被编号体系绑死。
3.4 物种侧的三个身份层,以及它们不一致的时候
物种这一侧同样有三层。最外层是文献原文写的名字,落在 species 列;第二层是团队认为的最新接受名,落在 species_most_recent_name;第三层是 NCBI 分类号,落在 ncbi_taxonomy_id。
正常情况下三层对齐。不一致的情形在高频记录里更容易看到:槲皮素那一行既有早已被归并的旧名,也有拼写变体。这不是错误,是抄录的真实状态——1983 年的论文写的是当年的分类,团队保留原文,另设一列做规范化。
所以以 ncbi_taxonomy_id 做物种聚合,不要用 species 字符串:字符串聚合会把同一物种拆成几组。分类学修订频繁的科(菊科、豆科、夹竹桃科)尤其要注意。
§4 质量层:去重是它的核心工作量
4.1 质量分三层看:结构层、溯源层、活性层
评价一个化学数据库,最忌讳用一个整体分数概括。ANPDB 的三层质量差别相当大,分开看才有意义。
结构层最硬。每个化合物都有 SMILES 与二维 SDF,坐标由 RDKit 重新生成,几何干净。风险在立体化学:手性中心多,文献只给平面结构时转录只能缺省,对接时这类分子会以平面构象进入筛选池。
溯源层中等。化合物能追到物种、部位、采集国、文献与作者,相当完整。风险是多对多关系被压进竖线长串,物种名里一旦含竖线或逗号,切分就出错。
活性层最弱。词级别的标签,没有实验类型,没有剂量,没有对照。上面 §2.4 提到的约五百六十条无活性记录,加上大量只有一两个粗标签的记录,使得这一层的可用性主要停留在「筛出有某个活性关键词的子集」这个层级。
4.2 去重的两道关
天然产物库的去重有两道关:名字关和结构关。
名字关不好过:同一化合物可能有拉丁俗名、英文俗名、系统名、缩写、商品名。槲皮素那一行的同义名串里还混进了试剂目录号、化合物库批次号与拼写变体。团队的做法是把能找到的别名都收进 synonyms,让换个名字也能命中。
结构关是真正的判据。做法是以结构拓扑(而非名称)判断两个记录是否为同一化合物,把不同文献、不同物种下的同一结构并成一行。判断的依据通常是标准化后的结构串或其哈希,立体化学与盐型、水合物的处理方式决定了合并的宽严。
取舍有代价:判宽会误并异构体,判严会因画法不同留下多行。编号空洞说明合并掉了很多,但阈值未公布。应对办法是自己用 InChIKey 的骨架段与完整串各算一次,差额就是立体化学层面的不确定量。
4.3 案例:槲皮素那一行里的五十四个出处
§2.3 里摘出的槲皮素行(ANP_00162),是理解这个库运作方式的最好样本。它在一行之内合并了五十余个物种、六个活性标签、以及一个长达数百项的同义名串,number_occurrences 记的是 54。
从这一行能推出三件事。第一,物种字段读起来像一份植物名录而不是一个实验结果:东非的灌木、北非的草本、广泛栽培的观赏植物并列在一格,等于说「它们都出过槲皮素」——化学上没错,生态学上几乎没有信息量,因为槲皮素本就是分布最广的黄酮之一。
第二,Pub_year 是一长串年份,跨越数十年。同一化合物的不同分离报告被折叠在一起,时间只能以集合形式存在。做时间分析得自造「最早年份」这个派生指标,而它反映的是库内文献下限,不是真实首报年。
第三,同义名串的长度本身就是一条信息。它越长,说明这个化合物在外部世界里被讨论得越多,也就越可能已经有成熟的商业标准品、毒理数据与靶点信息。反过来,同义名只有一两个的化合物,多半只在非洲文献里出现过一次,这类才是这个库真正独有的部分。
§4.3 的案例在 §6 还会被回到:它既是最好的入口样本,也是最大的误用陷阱。
4.4 比同类做得好的三点
第一条是「能整包拿走」。很多天然产物库只给网页检索,ANPDB 三个文件挂在静态目录下,无鉴权、无令牌、无频率限制。对做方法学的人,这一条比任何字段设计都重。
第二条是物种与文献的链条保留在一行。每行自带「从哪株植物、哪篇文章来」,做民族药理学与化学的交叉研究时省掉大量外部关联。
第三条是骨架分级字段,Bemis-Murcko 骨架按 L0 到 L3 分级,可直接做多样性分析。
4.5 不如同类的三点
第一,没有稳定 API。网页端有四类检索,但没有带版本号的程序化接口,也没有接口描述,批量任务只能走下载文件。
第二,没有在文件内提供版本号或更新日期。三个下载文件里都不含元数据头,文件名固定不变。这意味着两次下载之间发生了什么变化,使用者无从判断。
第三,活性层不做结构化。这是全行业的通病,但 ANPDB 连「实验类型」这一层都没有拆,比一些把活性拆成「assay 类型 / 靶点 / 数值 / 单位」的库要粗一档。
4.6 被忽略的一个优点:六十年的年份跨度
Pub_year 从 1961 年延伸到 2024 年,横跨六十余年。这条时间轴本身有研究价值:它显示非洲天然产物化学的产出不是均匀分布的,而是有明显的阶段(见 §8)。很多同类库只收近十年的文献,时间维度被压扁。ANPDB 保留了老文献,代价是分类学与命名标准不统一,收益是历史纵深。
§5 取数:三条路径,从三行 curl 到谱图检索
5.1 三条取数路径
ANPDB 的取数没有鉴权层,三条路各有适用场景。
第一条是静态文件下载,适合批量、离线、可复现的分析。第二条是网页检索端点,适合人工查一两个化合物;四类检索都返回 HTML,程序化抓取不稳定。第三条是列表页的批量导出(带 ?download=csv 参数),适合拿子集。
| 路径 | 入口 | 返回格式 | 适用 | 风险 |
|---|---|---|---|---|
| 静态文件 | /static/anpdb/download/ 下三个文件 |
CSV / SDF | 批量分析 | 无版本号,需自留存档 |
| 网页检索 | /anpdb/keyword_search/ 等 |
HTML | 人工查证 | 无接口契约,改版即失效 |
| 列表导出 | 各列表页加 ?download=csv |
CSV | 取子集 | 子集口径随页面而定 |
5.2 下载、校验、读进来
第一步是「下载 + 校验行数」。下面的脚本下载三个文件、解析 CSV 并打印行数与列数。
#-- 下载三个官方文件并做最小校验(Python 3.10+)
import csv
import pathlib
import urllib.request
BASE = "https://phabidb.vm.uni-freiburg.de/static/anpdb/download/"
FILES = ["ANPDB_molecules.csv", "ANPDB_molecules.sdf", "ANPDB_species.csv"]
OUT = pathlib.Path("anpdb_raw")
OUT.mkdir(exist_ok=True)
for name in FILES:
dst = OUT / name
if not dst.exists():
print("downloading", name)
urllib.request.urlretrieve(BASE + name, dst)
print(name, dst.stat().st_size, "bytes")
with open(OUT / "ANPDB_molecules.csv", encoding="utf-8") as f:
reader = csv.DictReader(f)
cols = reader.fieldnames
n = sum(1 for _ in reader)
print("columns:", len(cols), "rows:", n)
print("duplicated column names:", len(cols) - len(set(cols)))
跑完会看到两件事:行数与统计页的化合物数相等,说明官方口径与文件一致;列名有重复,pubchem_id 出现两次,DictReader 会让后者覆盖前者,pandas 会改名成 pubchem_id.1。解析前先处理这一列。
5.3 把竖线字段展开成长表
ANPDB 最影响后续分析的设计,是把一对多关系塞进单元格。物种、部位、活性、文献、年份全部是竖线分隔的字符串。下面的脚本做长表展开,把一个化合物-物种-文献三元组拆成独立行。
#-- 把竖线分隔字段展开成长表(每个化合物 × 物种 × 文献一行)
import csv
import pathlib
SRC = pathlib.Path("anpdb_raw/ANPDB_molecules.csv")
MULTI = ["species", "part_org", "country_collected", "bioactivity",
"reference_title", "Pub_year", "family"]
def split_cell(s):
return [x.strip() for x in s.split("|")] if s and s.strip() else []
rows = []
with open(SRC, encoding="utf-8") as f:
for r in csv.DictReader(f):
sp = split_cell(r["species"]) or [""]
rf = split_cell(r["reference_title"]) or [""]
for s in sp:
for t in rf:
rows.append({
"molecule_id": r["molecule_id"],
"mol_name": r["mol_name"],
"species": s,
"taxon": r["ncbi_taxonomy_id"],
"reference": t,
"year": (split_cell(r["Pub_year"]) or [""])[0],
})
print("long rows:", len(rows))
print("unique compounds:", len({x["molecule_id"] for x in rows}))
展开后行数会明显大于原表。注意两个坑:各列表长度不一定相等(物种五个、文献十篇时并不存在一一对应),所以这是笛卡尔积,只能用于计数,不能用于精确归属;part_org 里有 Not specified 这类占位值,聚合前要单独处理。
5.4 用 RDKit 重建结构身份
要做跨库合并,唯一可靠的做法是从 SMILES 现算 InChIKey。下面这段给每条记录算标准 InChIKey 与骨架 InChIKey(第一段),并统计两种口径下的唯一结构数,差额即立体化学层面的不确定量。
#-- 从 SMILES 计算 InChIKey,比较完整串与骨架串的唯一数
import csv
import pathlib
from rdkit import Chem
from rdkit import RDLogger
RDLogger.DisableLog("rdApp.*")
SRC = pathlib.Path("anpdb_raw/ANPDB_molecules.csv")
full, skel, bad = set(), set(), 0
with open(SRC, encoding="utf-8") as f:
for r in csv.DictReader(f):
m = Chem.MolFromSmiles(r["smiles"] or "")
if m is None:
bad += 1
continue
inchikey = Chem.MolToInchiKey(m)
full.add(inchikey)
skel.add(inchikey.split("-")[0])
print("unparsable smiles:", bad)
print("unique full InChIKey:", len(full))
print("unique skeleton InChIKey:", len(skel))
print("gap (stereo variants):", len(skel) - len(full))
三个数值得盯住。unparsable 不为零说明有 SMILES 无法解析,常见于含非常规元素或电荷标记错误。完整串与骨架串之差,就是同一骨架不同构型被算作不同化合物的数量;差值越大,对外合并时越容易把异构体当成两个东西。
5.5 四个检索入口能做什么
站点检索分四类,能力边界各不相同,用之前先看清楚。
| 检索类型 | 入口路径 | 输入 | 输出 | 适用 | 局限 |
|---|---|---|---|---|---|
| 关键词 | /anpdb/keyword_search/ |
化合物名或同义名 | 命中的化合物列表 | 查单个已知分子 | 依赖同义名是否已收录 |
| 相似度 | /anpdb/structure_search/ |
手绘或粘贴结构 | 按 Tanimoto 排序的列表 | 找结构类似物 | 指纹法,立体化学不参与 |
| 子结构 | 同上,切换模式 | 子结构片段 | 包含该片段的化合物 | 按母核筛选 | 查询片段过小时结果爆炸 |
| 谱图 | /anpdb/nmr-ms-search/ |
化学位移与多重峰、质荷比 | 候选化合物 | 去重复 | 混合了实验与预测谱图 |
相似度检索的算法在帮助页里写得很明确:用的是 OpenBabel 的二维 Daylight 类指纹,相似度用 Tanimoto 系数;页面上还提示 0.85 以上通常被认为「足够相似、活性可能可比」。这个阈值是行业惯例,不是经过验证的活性预测分界。实际操作时把它当起点,不要当判据。
谱图检索那一条,帮助页给出的细节值得记下来:可指定化学位移、多重峰(单峰、双峰、三重峰、双三重峰、三重双峰,其余可选多重峰),可同时查氢谱与碳谱,质谱侧可给多个质荷比,容差为 0.2 个质荷比单位。这个容差相当宽,宽松容差会带来假阳性,去重复时要配合其他证据(比如同一物种、同一文献)再判断。
5.6 用脚本做去重复预筛
程序化地走谱图检索并不方便,因为返回的是 HTML。更实用的做法是把预测谱图当作本地参考,用规则筛。下面的脚本演示一种保守策略:对每个候选,要求它的元素组成与给定质荷比在容差内匹配,且同类化合物不超过若干条,再人工复核。
#-- 按精确质量与容差筛候选分子(保守预筛,不替代谱图检索)
import csv
import pathlib
from rdkit import Chem
from rdkit.Chem import Descriptors
SRC = pathlib.Path("anpdb_raw/ANPDB_molecules.csv")
MZ = 431.098
TOL = 0.2
hits = []
with open(SRC, encoding="utf-8") as f:
for r in csv.DictReader(f):
m = Chem.MolFromSmiles(r["smiles"] or "")
if m is None:
continue
mz = Descriptors.ExactMolWt(m)
if abs(mz - MZ) <= TOL:
hits.append((r["molecule_id"], r["mol_name"], round(mz, 3),
r["class_name"]))
print("candidates:", len(hits))
for h in hits[:20]:
print(h)
这段代码只做「质量数粗略对齐」,是去重复的第一步而不是全部。真实的去重复要拿到样品的实验谱,与候选项的预测谱逐峰比对。之所以先做这一步,是因为官方谱图接口是网页的,脚本只能做到预筛,剩下的必须人工。
5.7 站点的其余入口
除了主页面上挂的五六个图标,站点的目录还有若干不显眼的入口,对做系统检索的人有用。
| 路径 | 内容 | 用途 |
|---|---|---|
/anpdb/compounds/ |
化合物字母序列表 | 浏览与导出 |
/anpdb/species/ |
物种字母序列表,支持 ?download=csv |
物种清单 |
/anpdb/families/ |
科级列表 | 按科筛 |
/anpdb/references/ |
文献列表 | 按文献查 |
/anpdb/activities/ |
活性列表 | 按活性词查 |
/anpdb/statistics |
统计页 | 精确口径来源 |
/anpdb/scaffold_grid/ |
骨架网格 | 多样性可视化 |
/anpdb/phylogeny |
系统树 | 按分类学浏览 |
/anpdb/nmr-ms-search/ |
谱图检索 | 去重复 |
/anpdb/help/ |
帮助与常见问题 | 算法与阈值说明 |
这份目录本身就是证据:有骨架网格、系统树、谱图检索,说明预期用户是天然产物化学家;没有 API 文档、字段字典、变更日志,说明没打算服务工程团队。
5.8 五条工程约定
第一条,把三个文件连同下载日期一起存档。文件名固定不变,站点又不给版本号,存档时不写日期,下次就无法判断是不是同一批数据。
第二条,解析时先重命名重复列。pubchem_id 出现两次是确定事实,直接按列名取值会静默取到后者。
第三条,reference_link 需要补协议头。文件里存的是 link.springer.com/... 这类不带 https:// 的字符串,做超链接时必须先拼接。
第四条,PMID 大面积为空,不要把它当外键去 join PubMed,要做这件事得先用 DOI 或标题另想办法。
第五条,按 molecule_id 关联 CSV 与 SDF,不要按名称。名称在 SDF 里是首行、在 CSV 里是 mol_name 列,两边理论上一致,但存在同义名与拼写差异,按名称 join 会丢记录。
§6 与库内条目的关系
6.1 关系图谱
千方医数集里与 ANPDB 相邻的词条大致分三圈,圈层不同,关系性质也不同。
最内圈是同类化学库:COCONUT 是全球开放天然产物结构库,LOTUS 是结构-生物体对数据库。这两个与 ANPDB 的关系是「上游 / 平行」,不是替代。COCONUT 收全球,把各家库里发表过的天然产物统一重新编码;ANPDB 收非洲,自己的收录标准更窄但溯源更细。做非洲专题时以 ANPDB 为主、以 COCONUT 做补全;做全球比较时以 COCONUT 为底、以 ANPDB 做区域切片。
中间圈是化学与药学的通用参照库:ChEMBL 收生物活性、DrugBank 收药物。这两个与 ANPDB 的关系是「下游参照」——ANPDB 里的分子如果恰好进了 ChEMBL,可以借到定量的活性与靶点;如果进了 DrugBank,说明它已经成药或接近成药。但从 §2.2 的字段看,这个巧合的概率很低,external ID 段的空值率很高。
外圈是医学与临床侧词条,与 ANPDB 无直接数据交集,只在「从天然产物到临床」的叙事链上处于下游。
| 库内词条 | 关系类型 | 交集 | 推荐用法 |
|---|---|---|---|
| COCONUT | 平行(全球 vs 区域) | 结构层面大量重叠 | 用 COCONUT 补全、用 ANPDB 取非洲溯源 |
| LOTUS | 平行(结构-物种对) | 物种与结构对重叠 | 做物种-结构矩阵时交叉核对 |
| ChEMBL | 下游 | 少量化合物重合 | 补定量活性 |
| DrugBank | 下游 | 极少重合 | 判断是否已成药 |
| PubChem | 外链 | 通过 pubchem_id 连接 |
补物性与文献 |
| 其他医学词条 | 叙事 | 无 | 不混用 |
6.2 检索路径
从本站出发找 ANPDB 相关的材料,有三条常用路径,各自对应不同的检索意图。
第一条是「我已知化合物名,想查它在非洲的记录」。走 ANPDB 关键词检索,或在本站同义名索引里搜。若名字是系统名而非俗名,命中率下降,因为同义名串虽然很长,但未必覆盖每一个系统命名变体。
第二条是「我已知物种,想看它被研究到什么程度」。走物种列表或系统树,两处都能到达物种页;物种页会列出该物种下收录的全部化合物。这是一条被低估的路径——做选题时先看某个属有没有被做过,比先找化合物更有效率。
第三条是「我要做跨库的方法学研究」。走本站对照词条(COCONUT、LOTUS),再回到 ANPDB 拿全量文件。这条路径的关键不是检索,而是口径统一:三套数据的行数不能直接比,必须先按结构重新归并。
6.3 为什么这类区域库值得单独收录
有人会问:全球库已经存在,为什么还要单独收录一个区域库。
答案是溯源密度。全球库为了统一必须激进标准化:物种名归一、结构重编码、文献简写——对比较研究有利,对「出自哪篇论文、哪个物种、哪个国家」不利。ANPDB 范围窄,能保留原文物种名、采集地细目、文献标题与作者串。做民族药理学与区域化学多样性评估,要的正是这一层。
区域库的另一个价值是样本量:全球库里非洲分子占比低到做子集时不够用,专收非洲的库才让跨区域比较有数据。
6.4 与站内其他区域库的互补
站内与 ANPDB 相邻的区域化学词条还有若干,共同点是「按地理切片、按结构组织」。它们之间是拼图不是竞争:单看一个区域回答不了跨区域差异,只有按统一流程处理后并置,差异才显形。
§4.3 的案例在这一层还有一个用处:槲皮素这类全球广布分子,在每一个区域库里都会出现,它是校准区域库之间差异的基准点。如果某个区域库里连槲皮素都没有,说明该库的收录标准与别的库不可比。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
读到这里,最容易发生的误判是把「覆盖率」当成「质量」。一个库收录得多,不代表收录得准;收录得准,也不代表覆盖得全。ANPDB 的情况是:在它自己声明的范围内(非洲来源、已发表、团队读到),质量相当高;一旦把范围外推,误判就会出现。
第二个前置校正与数字有关:本文数字来自官方统计页、首页与论文摘要、以及相减派生的推算三层,不能混用,更不能把派生数写成官方口径。分层清单见附录 B。
第三个前置校正是关于「局限」本身:下一节列的偏差,多数不是团队做错,而是这类库在给定投入下的必然边界。读成警告比读成批评有用。
7.1 五维评分
每维满分 5 分,分数只用于横向比较。
| 维度 | 分值 | 依据 | 主要扣分项 |
|---|---|---|---|
| 规模(D) | 4 | 一万余结构、近两千物种、两千余文献,区域库中领先 | 全球占比低,绝对量小 |
| 可获得性(A) | 5 | 三个文件无鉴权直下,CSV 与 SDF 双格式 | 无 API、无版本号 |
| 信息完整度(I) | 4 | 结构、物种、部位、采集地、文献、活性齐全 | 活性无数值,外链空值多 |
| 可维护性(M) | 3 | 有 2026 年论文,团队活跃 | 更新周期未公布,无变更日志 |
| 标准化(S) | 3 | 有分类号、有骨架分级、有同义名归并 | 无 InChI、无本体映射、字段压缩过重 |
| 综合 | 3.8 | 五维均值 | 强在可得,弱在标准化 |
一句话:它是「拿走就能用」的资料,不是「接进来就合规」的基础设施。
7.2 三类结构性局限
第一类是覆盖局限。库只收团队读到的文献;非洲天然产物研究有相当一部分以学位论文留在各国高校图书馆,未进国际索引。首页说收录了学位论文,但没给占比。应对只有一条:把它当下限,做「某科全集」时另查本地文献。
第二类是标准化局限:竖线压缩字段、活性用词不用值、物种名保留原文、外链覆盖不均。换来的是溯源完整。应对办法是自己做一次规范化:展开字段、把活性词映射到受控词表、把物种名统一到分类号。
第三类是许可局限:非商业,没有变通空间,商用必须另谈;学术使用的署名义务写法见 §9.3。
7.3 可枚举的偏差
下面这些偏差是可以一条条列出来的,不含推测。
| 编号 | 偏差 | 表现 | 影响 |
|---|---|---|---|
| B1 | 采集地偏差 | country_collected 高度集中于少数国家,埃及、喀麦隆、阿尔及利亚等出现频繁 |
用采集国做地理统计会放大这几个国家的权重 |
| B2 | 植物园采样 | 部分记录的采集地写的是植物园或标本园 | 「该国植物区系」的推断不成立 |
| B3 | 栽培/归化物种 | 收录中含有广泛栽培的外来种 | 不能直接当作非洲本土特有种 |
| B4 | 常见分子过采样 | 分布广的黄酮、甾醇反复出现 | 行数低估独有分子的占比 |
| B5 | 学位论文覆盖未知 | 首页称收录学位论文,比例未公布 | 覆盖率无法量化 |
| B6 | 活性词不统一 | 同义表述并存(如抗菌的多种写法) | 按词筛选会漏 |
| B7 | 立体化学缺省 | 平面结构转录,手性未标 | 对接构象质量下降 |
| B8 | 谱图来源混合 | 实验与预测并列 | 去重复有假阳性 |
| B9 | 外链空值 | 多数 external ID 列为空 | 不能当 ID 映射键 |
| B10 | 年份为集合 | 高频记录年份是长串 | 时间分析只能取极值 |
B1 到 B3 合起来指向同一个结论:ANPDB 的「非洲」是采集口径的非洲,不是区系口径的非洲。这一点在 §3.1 已经说过,但它是使用中最容易出错的地方,所以在偏差表里再列一次。
7.4 外部验证
一个库的可信度,最好用「别人拿它做过什么、做出来对不对」来验证。下表列出四类外部使用,以及它们对库质量的反向证明力。
| 验证渠道 | 做法 | 对库的证明力 | 局限 |
|---|---|---|---|
| 独立虚拟筛选研究 | 把库内结构与病毒或激酶靶点做对接与动力学模拟 | 中:证明结构可用 | 只证明结构层,不证明活性层 |
| 化学空间比较研究 | 与中药成分库、已上市药物库并置比较指纹分布 | 高:证明库可作为区域代表 | 依赖研究者自己的标准化流程 |
| 天然产物分类学综述 | 借库内记录梳理某类生物碱或萜类的分布 | 中高:证明溯源层可用 | 综述作者会另查原文 |
| 方法学教材与工作坊 | 作为教学案例讲授化学空间探索 | 低:只证明可用性 | 不涉及数据准确性 |
这四类里最有分量的是第二类。它把 ANPDB 与另外两套完全不同的数据放进同一条处理流水线,如果处理后能得出稳定的、可重复的结论,说明库的结构层经得起标准化。这类研究的数量在增加,是 ANPDB 近年来被引用的主要来源之一。
7.5 它为何能持续:因为它服务的是一个缺口
这类库能活下来的前提,通常不是商业模型,而是有人需要一个别人不做的切片。全球库没有动力为非洲做细粒度的溯源,因为那部分样本量在全球盘子里太小;非洲本地的机构有动力,但缺资源。ANPDB 恰好落在这个交叉点上:德国的生物信息学团队提供方法与算力,喀麦隆的团队提供选题与本地文献,两边共同的需求是「让非洲的化学多样性在计算化学里被看见」。
所以它的可持续性来自学术产出而非收入:论文、工作坊、合作项目是补给线。更新节奏跟着论文走,不跟用户需求走——理解这一点,就不会对「为什么没有 API」「为什么没有版本号」意外。
§8 生态位与历史
8.1 从「散件」到「库」
非洲天然产物的系统整理,历史上不是从数据库开始的。更早的形态是综述:某位化学家把几十年的分散报道按科或按化合物类型归拢成一篇长文。这种形态的优点是可读,缺点是不可检索、不可计算。
数据库化的第一步是结构化:表格变机读表,名称变结构,引用变链接。技术门槛不高,工作量极大——录入是人力密集型,校正更甚。
第二步是去重:同一化合物多次出现必须合并,判据从名字过渡到结构,这是方法论的一次升级。
第三步是加值:在结构、物种、文献之外加了骨架分级、谱图(含预测)与化合物-蛋白关系预测,把库从资料汇编推向可计算资源。
8.2 阶段痕迹留在数据里
这三个阶段不是整齐划一的,痕迹留在了数据的不同角落。
录入阶段的痕迹是字段形态:reference_title、reference_authors 是原样抄录,格式不统一,作者串用「姓 缩写」的写法且分隔符不一致。这是人工录入的典型特征。
去重阶段的痕迹是编号空洞:主键到 ANP_19565 而记录只有一万一千余,差额就是合并掉的号。§3.2 已经说过这条线索。
加值阶段的痕迹是新增字段:scaffolds、predicted interactions(站点统计页单列一项,值为五十余万条)以及谱图。这些字段在原初的文献里并不存在,是后期用算法批量生成的。
| 阶段 | 时间线索 | 数据痕迹 | 可观察性 |
|---|---|---|---|
| 综述期 | 二十世纪后期 | 无(未入库) | 不可见 |
| 录入期 | 库建立后 | 引用字段格式不一 | 直接可见 |
| 去重期 | 录入之后 | 编号空洞、同义名串变长 | 可推算 |
| 加值期 | 近年 | 骨架列、预测关系、谱图 | 直接可见 |
8.3 制度环境:采集与惠益分享
天然产物研究从来不只是化学。非洲的样本采集长期受两套规则约束:采集国国内法,以及国际公约在各国落地的形式。二十世纪九十年代后遗传资源获取与惠益分享成为正式议题,采集从「谁先去谁拿」变成「先申请、签协议、分成」。
这对数据库的直接影响是:越晚发表的文献,其样本采集的合法性链条越清晰,也越可能附带使用限制条款。而早期的文献,样本采集往往没有留下许可记录。数据库本身不承担这个责任——它只转录文献——但使用者在把库内化合物推进到实物阶段时,必须回到原产国重新走程序。
另一层影响是发表偏向:采集门槛抬高后,一部分研究转向馆藏标本的再分析或栽培种,数据里会表现为晚期文献物种范围更窄。这一推断本文不做统计验证。
8.4 它在今天的位置
按收录规模与可下载性两个维度定位,ANPDB 处在「区域专精库」这一格。它的上方是全球库(规模大、标准统一、溯源粗),下方是机构自建库(规模小、不可下载)。它的独特性在于:规模足够大到能做统计,溯源足够细到能做民族药理学,许可足够开放到能整包拿走。
这个位置并不稳固。如果全球库愿意把区域切片做细,ANPDB 的独特性会被削弱;如果区域库之间开始互操作,单一库的价值会转向「谁的去重最准」。目前看,第二条路更可能,因为互操作的成本远低于重建溯源。
§9 使用指引
9.1 三种角色的路径
不同的人来这个库,目的差得很远。把路径分开写,比给一份通用清单更省时间。
第一类是天然产物化学家,手上有一份没定出结构的样品。先做谱图检索去重复,命中就查文献比对比分;不命中看相似结构;仍不命中才按新化合物处理。关键是把「命中」放宽到骨架层面。
第二类是虚拟筛选团队。下载 SDF,用 RDKit 标准化,按骨架抽子集再对接。关键动作是剔除以平面结构录入、手性未标的分子,否则白烧算力。
第三类是知识图谱构建者。下载 CSV,展开物种与文献字段,分别以分类号、编号、文献标题建三类节点,再把活性词映射成边。关键动作是先合并物种名的拼写变体。
| 角色 | 第一动作 | 关键字段 | 最容易踩的坑 |
|---|---|---|---|
| 天然产物化学家 | 谱图检索去重复 | 谱图、species、reference_title |
把预测谱当实验谱 |
| 虚拟筛选团队 | 下载 SDF 并标准化 | smiles、scaffolds、class_name |
未处理手性缺省 |
| 知识图谱构建者 | 展开长表并建节点 | ncbi_taxonomy_id、molecule_id |
按字符串聚合物种 |
| 综述写作者 | 引论文而非站点 | 统计页四个数 | 混用多个口径 |
| 教学使用者 | 用骨架网格演示 | scaffolds |
无 |
9.2 最短可用流程
从下载到能跑,最短的路径是这样一串命令与三十行代码。前半段用 shell 拿文件,后半段用 Python 建一个可查询的结构表。
#-- 建目录、下载三个文件、记录下载日期
mkdir -p anpdb_raw && cd anpdb_raw
BASE="https://phabidb.vm.uni-freiburg.de/static/anpdb/download"
curl -sSLO "$BASE/ANPDB_molecules.csv"
curl -sSLO "$BASE/ANPDB_molecules.sdf"
curl -sSLO "$BASE/ANPDB_species.csv"
date -I > download_date.txt
ls -lh
#-- 建一份带 InChIKey 的本地化合物表,输出为 SQLite
import csv
import sqlite3
from rdkit import Chem
from rdkit import RDLogger
RDLogger.DisableLog("rdApp.*")
con = sqlite3.connect("anpdb.sqlite")
con.execute("""CREATE TABLE IF NOT EXISTS mol (
molecule_id TEXT PRIMARY KEY, name TEXT, inchikey TEXT, scaffold TEXT,
class_name TEXT, species TEXT, taxon TEXT)""")
with open("anpdb_raw/ANPDB_molecules.csv", encoding="utf-8") as f:
for r in csv.DictReader(f):
m = Chem.MolFromSmiles(r["smiles"] or "")
if m is None:
continue
ik = Chem.MolToInchiKey(m)
con.execute("INSERT OR REPLACE INTO mol VALUES (?,?,?,?,?,?,?)",
(r["molecule_id"], r["mol_name"], ik, ik.split("-")[0],
r["class_name"], r["species"], r["ncbi_taxonomy_id"]))
con.commit()
for row in con.execute("SELECT COUNT(*), COUNT(DISTINCT inchikey) FROM mol"):
print("rows / unique structures:", row)
跑完之后你会得到一份 SQLite,里面每一行都带 InChIKey。此时可以做两件事:按 scaffold 分组看类别分布,或按 inchikey 与别的库做交集。若交集里有大量「同一个 InChIKey、两边名字不同」的配对,说明两套库的命名体系差异很大,后续合并必须以结构为准。
9.3 引用方式
引用这个库有三种场合写法不同。第一种是在方法段里说「数据取自 ANPDB」,此时引 2026 年《核酸研究》那篇专刊论文,给出卷、页码与数字对象标识符,并写明下载日期——库没有版本号,日期是唯一可复现的锚点。
第二种是在图注或表注里标来源,写「数据来自 African Natural Products Database(ANPDB),CC BY-NC 4.0」即可。
第三种是再分发数据。CC BY-NC 4.0 要求标明原作者、许可名称与链接,并说明是否修改;若重算了 InChIKey 或合并了异构体,须写明「已修改」。
| 场合 | 需给什么 | 是否需下载日期 | 备注 |
|---|---|---|---|
| 方法段 | 论文全引 + 访问日期 | 需要 | 库无版本号 |
| 图表注 | 库名 + 许可 | 不需要 | 简短即可 |
| 再分发 | 作者 + 许可 + 修改说明 | 建议给 | 非商业条款须随附 |
| 商业使用 | 需另行授权 | 不适用 | 先联系维护方 |
通讯作者在站点首页与论文里都列了,联系邮箱在页面底部;商业授权直接走这条渠道。
§10 AI 使用声明
面向把 ANPDB 接入模型或管线的团队,说明哪些能直接喂、哪些先处理。
| 项 | 说明 |
|---|---|
| 可否用于训练 | 结构数据可用于非商业研究;商用需授权,须先确认许可范围 |
| 是否需要清洗 | 需要。竖线分隔字段、重复列、手性缺省都要先处理 |
| 标签质量 | 活性为词级弱标签,适合多标签分类,不适合回归 |
| 可拼接性 | 可与 COCONUT、ChEMBL 按结构归并;不可按名称拼接 |
| 隐私风险 | 无。不含任何个体信息,最细粒度是采集地与文献 |
| 地理偏差 | 采集国集中于少数国家,模型会学到这个分布 |
| 时间偏差 | 文献跨六十余年,早期分类学旧名会进入特征 |
| 最该警惕的用法 | 把行数当实验数,或用预测谱图做结构确证 |
一句话概括:它是一个结构可靠、标签粗糙、许可受限的训练来源。拿它做分子表征学习是合适的,拿它做活性预测的监督信号需要额外的清洗与验证。
7.6 DAIMS 维度对照
DAIMS 是数据提供方常用的一套元数据维度框架,用来回答「这个数据以什么规格、按什么方式供给」。把 ANPDB 逐维对上去,能看出它缺的是哪一层。
| DAIMS 维度 | 常见要求 | ANPDB 的实际情况 | 缺口 |
|---|---|---|---|
| Dataset 级元数据 | 名称、版本、发布日期、许可 | 有名称、许可;无版本号,发布日期只能看论文 | 版本与发布日期 |
| Distribution 级 | 每个文件独立描述、格式、体积 | 三个文件有体积与格式,无单文件元数据 | 文件级描述 |
| Record 级 | 每行有唯一键与类型声明 | 有 molecule_id 主键,字段类型靠推断 |
字段类型声明 |
| 标识符体系 | 持久标识符或 DOI | 内部编号 + 外链编号,库本身无 DOI | 持久标识符 |
| 溯源信息 | 数据来源与加工步骤 | 有文献出处,无加工步骤记录 | 加工流水线说明 |
| 许可与再分发 | 明确的许可与再分发规则 | 许可明确;再分发规则未单独写明 | 再分发细则 |
| 时间与空间维度 | 明确的时间覆盖与地理覆盖 | 有年份与采集国,格式未规范化 | 规范化取值 |
| 质量声明 | 已知问题与置信度 | 无(本文 §7.3 的偏差表由外部整理) | 官方质量声明 |
八维里,能算「满足」的只有许可与溯源两项;「部分满足」的是记录与标识符;「缺失」的是版本、文件级描述、加工流水线、质量声明四类。这张表的价值不在于打分,而在于告诉你——如果要把 ANPDB 接进一个需要元数据契约的管线,有哪四项必须自己补齐。
常见误读(避坑清单)
以下十条是这类库最常见的说法,逐条给出实际与证据。
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它是非洲天然产物的全集」 | 只收团队读到的文献,学位论文覆盖比例未公布 | 首页列的三个文献来源 |
| 「一万一千多行就是一万一千多次分离实验」 | 一行是一个去重后的结构,多篇文献折叠进一行 | 槲皮素行出现次数为 54 但只占一行 |
| 「它和 NAPRALERT 是一回事」 | 范围(非洲 vs 全球)、记录单位(结构 vs 文献)都不同 | 两站首页的自述 |
| 「AfroDB 就是 ANPDB 的旧名」 | 不同团队、不同去重口径的并行库 | §2.5 对照表 |
| 「核磁与质谱都是实验测的」 | 站点明确说明含预测谱图 | 论文摘要与首页说明 |
| 「能直接用于商业项目」 | CC BY-NC 4.0,商用须另谈 | 站点页脚许可声明 |
| 「有 API 可以批量查」 | 只有网页检索端点,返回 HTML | 帮助页与站点目录 |
| 「下载文件带版本号」 | 文件名固定,无版本字段 | 下载页三个文件 |
| 「化合物都是非洲特有种才有的」 | 含广布种与栽培种 | 偏差表 B3 |
| 「采集国就是原产国」 | 采集地包含植物园与标本园 | 偏差表 B2 与样例记录 |
FAQ
它是谁做的?
由德国弗赖堡大学药物生物信息学组与喀麦隆布埃亚大学药物发现中心联合维护。论文的通讯作者来自这两个团队。
什么时候发表的?
2026 年发表于《核酸研究》数据库专刊,卷 54,页码 D1336 至 D1344,数字对象标识符 10.1093/nar/gkaf1186。
有多少化合物?
站点统计页给精确值,一万一千四百余个。首页给的是取整口径,两个数字同时存在。
能免费下载吗?
能。三个文件放在静态目录下,无需注册。
许可能不能改?
不能。CC BY-NC 4.0 是固定的,商业使用需要单独协商。
为什么编号不连续?
去重时合并了大量记录,被合并的编号成为空洞。编号不能用于区间推断。
一个化合物对应多个物种怎么办?
物种字段用竖线拼接。要做一对多分析,需展开成长表,但展开会得到笛卡尔积。
能不能和中药库直接比?
可以比,但必须先用同一套标准化流程重算结构指纹,否则行数差异会掩盖真实差异。
谱图能用来做结构确证吗?
只能做辅助。库里的谱图含预测部分,结构确证需要实验谱与标准品。
有 API 吗?
没有正式的 API。网页检索返回 HTML,程序化调用不稳定。
多久更新?
官方未公布周期。论文是一个版本节点,下载日期是唯一可靠的锚点。
商用要联系谁?
站点页脚给出了维护团队的联系邮箱,商业授权走这条渠道。
术语表
| 术语 | 解释 |
|---|---|
| 天然产物 | 由生物体产生的次生代谢物,区别于全合成的化合物 |
| 去重复 | 判断一份新样品里的成分是否已被报道过的过程 |
| 结构去重 | 以结构而非名称为判据,把同一化合物的多条记录合并 |
| InChIKey | 结构的标准哈希,分骨架段与立体段,跨库通用 |
| SMILES | 一维结构线性表示法,可含手性标记 |
| SDF | 结构数据文件格式,可附分子级属性标签 |
| Bemis-Murcko 骨架 | 剥离侧链后的环系骨架,常用于多样性分析 |
| Tanimoto 系数 | 指纹相似度,取值 0 至 1 |
| 指纹 | 把分子编码成比特串的表示法,用于相似度检索 |
| 去重复阈值 | 判定相似的相似度下限,常取 0.85 |
| 化学空间 | 全体化合物在高维描述符空间中的分布 |
| 民族植物学 | 研究人群如何使用植物的学科 |
| 惠益分享 | 遗传资源利用所获利益的分配机制 |
| 采集国 | 样本被采集的地点所在国,不等于原产地 |
| 接受名 | 分类学上当前有效的物种学名 |
| NCBI 分类号 | 美国生物技术信息中心的生物分类编号 |
| PubChem CID | PubChem 的化合物编号 |
| CAS 号 | 美国化学文摘社的化合物登记号 |
| 预测谱图 | 由算法模拟出的谱图,非实验测量 |
| 弱标签 | 只给类别不给强度的监督信号 |
| 笛卡尔积 | 两个列表全组合,用于说明展开后的膨胀 |
| 非商业许可 | 允许非营利使用、限制商业使用的许可类型 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 化合物数 | 一万一千四百四十八 | 站点统计页 | 官方页面 |
| 物种数 | 一千八百八十二 | 站点统计页 | 官方页面 |
| 科数 | 269 | 站点统计页 | 官方页面 |
| 文献数 | 2,121 | 站点统计页 | 官方页面 |
| 活性类别数 | 192 | 站点统计页 | 官方页面 |
| 化合物大类数 | 1,355 | 站点统计页 | 官方页面 |
| 有毒性信息的化合物 | 11,408 | 站点统计页 | 官方页面 |
| 有活性信息的化合物 | 2,669 | 站点统计页 | 官方页面 |
| 预测的化合物-蛋白关系 | 504,719 | 站点统计页 | 官方页面 |
| 有外部编号的化合物 | 与总数相同 | 站点统计页 | 官方页面 |
| 有核磁的化合物 | 与总数相同 | 站点统计页 | 官方页面 |
| 有质谱的化合物 | 11,446 | 站点统计页 | 官方页面 |
| 有骨架的化合物 | 10,797 | 站点统计页 | 官方页面 |
| 关联多物种的化合物 | 1,784 | 站点统计页 | 官方页面 |
| CSV 体积 | 14.8 MB | 下载页 | 官方页面 |
| SDF 体积 | 34.4 MB | 下载页 | 官方页面 |
| 物种表体积 | 1.3 MB | 下载页 | 官方页面 |
| 主表列数 | 39(含一列重复) | 下载文件表头 | 官方文件 |
| 首页卡片口径 | 一万一千四百加 / 一千八百五十加 | 首页 | 官方页面 |
| 首页正文口径 | 一万一千加 / 一千七百五十加 | 首页 | 官方页面 |
| 论文口径 | over 11 000 | 论文摘要 | 论文摘要 |
| 文献年份跨度 | 1961 至 2024 | 论文摘要 | 论文摘要 |
| 采集国口径跨度 | 1962 至 2024 | 首页正文 | 官方页面 |
| 无活性记录 | 约 562 | 统计页两数相减 | 派生 |
| 主键末值 | ANP_19565 | 下载文件末行 | 官方文件 |
| 许可 | CC BY-NC 4.0 | 页脚 | 官方页面 |
首页卡片写「一万一千四百加」、首页正文写「一万一千加」、统计页写精确值,三处同时存在。年份跨度也有两个口径:论文说 1961 至 2024,首页说 1962 至 2024。差额的构成官方没有说明,本文只记录,不判定。
附录 B:数字的来源分层
第一级:官方页面。 站点统计页的十四个计数、下载页的三个文件体积、页脚的许可声明、首页的口径描述。这些可以直接引用,但要在引用时注明是哪个页面,因为同站不同页的数字并不一致。
第二级:论文摘要。 「over 11 000」「1961 至 2024」「实验与预测谱图」「开放获取、可下载」这四条。摘要的口径比站点保守,用于正式写作时更稳妥。
第三级:派生与未核实。 无活性记录的条数由统计页两数相减得出,属派生;列数里有一列重复,属文件事实而非官方声明;学位论文占比、更新周期、商用授权流程细节,均未在可及页面找到明确说明,按未核实处理,本文不给具体数字。
按这套分层,本文的正文数字有九成来自第一级与第二级,派生数字只在说明「有多少记录没有活性」时使用,且明确标注了推导方式。
附录 C:完整参考文献
-
Betow JY, Qaseem A, Bekono BD, Feng Y, Moumbock AFA, Simoben CV, Babiaka SB, Tanyi SA, Shu VA, Ndi AT, Onguéné PA, Metuge CS, Akame S, Eni DB, Namba-Nzanguim CT, Tjegbe MJM, Dikande MNL, Akeh PT, Balgah S, Meh CD, Ibezim A, Tabi IF, Malange YI, Ndingkokhar B, Njume LE, Telukunta KK, Amrani S, Ebob OT, Sippl W, Günther S, Ntie-Kang F. African Natural Products Database (ANPDB): a resource for exploring the therapeutic potential of natural compounds from Africa. Nucleic Acids Research, 2026, 54: D1336–D1344. DOI: 10.1093/nar/gkaf1186. PMID: 41243981. PMCID: PMC12807775.
-
ANPDB 官方站点首页.
https://african-compounds.org(数据服务地址https://phabidb.vm.uni-freiburg.de/anpdb/)。访问日期 2026-10-27。 -
ANPDB 数据库统计页.
https://phabidb.vm.uni-freiburg.de/anpdb/statistics。访问日期 2026-10-27。 -
ANPDB 下载页.
https://phabidb.vm.uni-freiburg.de/anpdb/download。访问日期 2026-10-27。 -
ANPDB 帮助与常见问题页.
https://phabidb.vm.uni-freiburg.de/anpdb/help/。访问日期 2026-10-27。 -
ANPDB 数据文件
ANPDB_molecules.csv表头与首若干行、ANPDB_molecules.sdf首个分子块。https://phabidb.vm.uni-freiburg.de/static/anpdb/download/。访问日期 2026-10-27。 -
交叉检索:非洲天然产物化学空间比较研究(预印本,2026,研究使用资源标识 10.21203/rs.3.rs-9904436/v1),用于确认 ANPDB 与 NANPDB 的并行关系。仅作旁证,未采用其统计结论。
附录 D:任务代码
本文使用的核验任务分三步,命令与产出如下,便于复现。
#-- 第一步:检索论文元数据与摘要
curl -s "https://www.ebi.ac.uk/europepmc/webservices/rest/search?query=ANPDB&resultType=core&format=json&pageSize=10" \
| python3 -c "import json,sys; d=json.load(sys.stdin); print(d['hitCount'])"
#-- 第二步:取站点统计页的计数
curl -s "https://phabidb.vm.uni-freiburg.de/anpdb/statistics" \
| tr '<' '\n' | grep -iE "11,|1,8|2,1|504" | head -20
#-- 第三步:核对 CSV 行数与列名重复
import csv
with open("anpdb_raw/ANPDB_molecules.csv", encoding="utf-8") as f:
rd = csv.reader(f)
cols = next(rd)
n = sum(1 for _ in rd)
print(n, len(cols), sorted({c for c in cols if cols.count(c) > 1}))
三步的产出分别是:论文命中数、统计页的计数行、以及「行数 / 列数 / 重复列名」。三者合起来足以支撑本文的全部规模与结构数字。其余页面的内容(首页口径、下载体积、许可)通过直接取页文本获得,未做二次加工。
附录 E:如果只记五件事
第一,它的规模是一万一千四百余个结构、近两千个物种、两千余篇文献,可整包下载,非商业使用免申请。
第二,它是按物种来源收的非洲,不是按研究地点收的非洲,所以不能用来衡量非洲本土的科研能力。
第三,一行是一个去重后的化合物,不是一次分离实验。常见分子被折叠进一行,行数会低估它们的被研究密度。
第四,活性字段是词不是数,适合粗筛,不适合做定量构效关系;谱图混合了实验与预测,不能直接用于结构确证。
第五,许可为非商业,商用须另谈;引用时用 2026 年那篇论文,并写明下载日期。
编辑说明
本篇的事实核验于 2026 年 10 月 27 日完成,主要依据是官方站点的首页、统计页、下载页、帮助页四处的页面文本,下载目录里三个文件的实际表头与首个分子块,以及 2026 年《核酸研究》数据库专刊论文的摘要与作者列表。时间盒内没有访问论文全文,因此凡涉及收录流程细节、学位论文占比、更新机制的部分,均按未核实处理,未给数字。
口径处理两处说明:首页卡片与同页正文给两套取整数字,统计页给精确值,本文以统计页为准,§2.4 与附录 A 并列三种口径,不判定哪个「对」;无活性记录数由统计页两数相减得出,属派生,已在附录 B 归入第三级。
与易混资源的区分是本文的一个重点,所有判断都基于各资源自身的页面自述与并行的字段结构,没有依赖二手综述的转述。若后续出现新的官方页面或版本说明,§2.4 与附录 A 应优先更新。
文中所有代码块均为示意性流程,未在本文写作环境中完整跑通全量数据,使用者应按自己的环境调整路径与依赖。图片与可视化不在本篇范围内。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- foodb — 共享标签:药物发现与化学 / 化学信息学 / 代谢组学 / 公共卫生与流行病学
- massbank — 共享标签:药物发现与化学 / 化学信息学 / 代谢组学
- hmdb — 共享标签:药物发现与化学 / 化学信息学 / 代谢组学
- chebi — 共享标签:药物发现与化学 / 化学信息学 / 代谢组学
- meddra — 共享标签:药物发现与化学 / 公共卫生与流行病学
- lotus-ref — 共享标签:药物发现与化学 / 化学信息学 / 代谢组学
- comptox-dashboard — 共享标签:药物发现与化学 / 化学信息学 / 公共卫生与流行病学
- zinc — 共享标签:药物发现与化学 / 化学信息学
- pdbbind — 共享标签:药物发现与化学 / 化学信息学
- toxcast — 共享标签:药物发现与化学 / 化学信息学
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

