1 个不稳定版本
0.1.0 | 2022 年 11 月 29 日 |
---|
#1996 在 数据库接口
27KB
456 行
wd2sql
wd2sql
是一个工具,可以将 Wikidata JSON 导出转换为完全索引的 SQLite 数据库,该数据库比原始导出小 90%,但包含大部分信息。生成的数据库可以在通用硬件上执行高性能查询,无需安装和配置专业的三元组存储软件。大多数编程语言都支持 SQLite,并且有很多相关工具。我认为这是目前与本地 Wikidata 工作最简单的方法。
wd2sql
的速度比大多数其他导出处理工具要快得多。实际上,它可以像 bzip2
解压缩一样快地处理 JSON 数据。它使用本地代码、SIMD 加速的 JSON 解析、优化的分配器、批处理事务、预编译语句以及其他 SQLite 优化来实现这种性能。在 2015 年的消费级笔记本电脑上,它可以在不到 12 小时内处理完整的 Wikidata 导出(1.5 太字节),同时只使用大约 10 兆字节的 RAM。
wd2sql
不是
- 一个通用三元组存储。它对导出结构的假设特定于 Wikidata,在其他语义数据库上运行时会失败。
- 是传统数据存储(如 Wikibase)的完整替代品。特别是,当前的 SQLite 数据库不包含站点链接、别名、量词、参考、非英语标签和描述,以及一些其他在导出中存在的信息。
- 与 Wikidata 项目和/或 Wikimedia 基金会有关联或被其支持。
安装
安装 Rust 1.61 或更高版本,然后运行
cargo install wd2sql
这将编译 wd2sql
以适应您的本地 CPU 架构,这对于性能至关重要。
请注意,尽管 wd2sql
应该在所有平台上工作,但我只测试了 Linux。
用法
wd2sql <JSON_FILE> <SQLITE_FILE>
使用 -
作为 <JSON_FILE>
从标准输入读取,而不是从文件读取。这使得可以在数据解压缩的同时构建处理 JSON 数据的管道,而无需将完整的导出解压缩到磁盘
bzcat latest-all.json.bz2 | wd2sql - output.db
数据库结构
标识符
Wikidata ID 由类型前缀(Q
/ P
/ L
)和一个整数组成。 wd2sql
将这两个信息编码为一个单一的32位整数(形式和意义ID为64位)。
- 实体ID 简单地表示为其ID的整数部分。例如,
Q42
变为42
。 - 属性ID 表示为其ID的整数部分加上10亿。例如,
P31
变为1000000031
。 - 语素ID 表示为其ID的整数部分加上20亿。例如,
L234
变为2000000234
。 - 形式ID 表示为其相关语素的编码ID(见上文),加上其整数形式ID的100亿倍。例如,
L99-F2
变为202000000099
。 - 意义ID 表示为其相关语素的编码ID(见上文),加上其整数意义ID的100亿倍,再加上10亿。例如,
L99-S1
变为112000000099
。
这种编码简单且紧凑,既可以通过算法自动应用,也可以通过人工方式应用。
表格
在所有表格中,id
列包含主题实体的 Wikidata ID,按照上述描述进行编码。以下表格生成
meta
,其中包含每个实体的英文label
和description
,或者如果实体没有英文标签或描述,则为NULL
。string
、entity
、coordinates
、quantity
和time
,它们包含与每个实体关联的声明值。存储单个声明值的表对应于属性的 值类型,属性通过property_id
列进行识别。none
和unknown
,其中包含标识“无值”和“未知值”声明的id/
property_id
对。
示例:查找红色水果
首先,我们需要获取相关实体的ID
sqlite> SELECT * FROM meta WHERE label = 'red';
id label description
--------- ----- ----------------------------------------------------------
17126729 red eye color
101063203 red 2018 video game by Bart Bonte
3142 red color
29713895 red genetic element in the species Drosophila melanogaster
29714596 red protein-coding gene in the species Drosophila melanogaster
从这些结果中,我们可以看到我们感兴趣的实体(红色)的ID为 3142
。重复此过程可揭示“水果(食品)”的ID为 3314483
,而“子类”和“主题的颜色”属性分别具有ID 1000000279
和 1000000462
。
“红色”和“水果”都是实体,因此关于它们的声明可以在 entity
表中找到。我们现在可以轻松构建一个查询,返回所需信息
sqlite> SELECT * FROM meta WHERE
...> id IN (SELECT id FROM entity WHERE property_id = 1000000462 AND entity_id = 3142)
...> AND id IN (SELECT id FROM entity WHERE property_id = 1000000279 AND entity_id = 3314483);
id label description
-------- ----------- --------------------------------------------------------------------------------------------------------
89 apple fruit of the apple tree
196 cherry fruit of the cherry tree
503 banana elongated, edible fruit produced by several kinds of large herbaceous flowering plants in the genus Musa
2746643 fig edible fruit of Ficus carica
13202263 peach fruit, use Q13189 for the species
13222088 pomegranate fruit of Punica granatum
所有这些查询的执行时间都在一秒以内,并且结果与使用 Wikidata 查询服务执行的 SPARQL 查询结果相同
SELECT ?item ?itemLabel
WHERE
{
?item wdt:P462 wd:Q3142.
?item wdt:P279 wd:Q3314483.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
相同。
致谢
wd2sql
依赖于以下 crate:lazy_static
、clap
、rusqlite
、simd-json
、wikidata
、chrono
、humansize
、humantime
和 jemallocator
。
如果没有无数人为 Wikidata 及其内容做出的努力,wd2sql
将毫无用处。对这一令人惊叹的开放数据项目,我们无论如何称赞都不过分。
相关项目
import-wikidata-dump-to-couchdb 是一个工具,可以将 Wikidata 数据包传输到 CouchDB 文档数据库。
知识图谱工具包 (KGTK) 是一个更全面的系统,用于处理语义数据,包括导入 Wikidata 数据包的功能。
dumpster-dive 是一个概念上类似的工具,它可以解析 维基百科 数据包并将其存储在 MongoDB 数据库中。
许可证
版权所有 © 2022 Philipp Emanuel Weidmann ([email protected])
本程序是自由软件:您可以按照自由软件基金会发布的 GNU 通用公共许可证的条款重新分发和/或修改它,许可证版本可以是第 3 版,也可以是您选择的任何后续版本。
本程序的发布是希望它有用,但没有任何保证;甚至没有关于其适销性或适用于特定目的的隐含保证。有关详细信息,请参阅 GNU 通用公共许可证。
您应该已经随本程序收到了 GNU 通用公共许可证的一份副本。如果没有,请参阅 https://www.gnu.org/licenses/。
通过向本项目做出贡献,您同意在相同的许可证下发布您的贡献。
依赖项
~35MB
~569K SLoC