#sqlite #dump #json #wikidata #transform #id

app wd2sql

将 Wikidata JSON 导出转换为 SQLite 数据库

1 个不稳定版本

0.1.0 2022 年 11 月 29 日

#1996数据库接口

GPL-3.0 或更高版本

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,其中包含每个实体的英文 labeldescription,或者如果实体没有英文标签或描述,则为 NULL
  • stringentitycoordinatesquantitytime,它们包含与每个实体关联的声明值。存储单个声明值的表对应于属性的 值类型,属性通过 property_id 列进行识别。
  • noneunknown,其中包含标识“无值”和“未知值”声明的 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 10000002791000000462

“红色”和“水果”都是实体,因此关于它们的声明可以在 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_staticclaprusqlitesimd-jsonwikidatachronohumansizehumantimejemallocator

如果没有无数人为 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