解决Wikibase手动导入数据后无法新建实体之问题

Wikibase简介

Wikibase是一组MediaWiki的扩展功能,用于在中央存储库中处理版本化数据。其主要组件包括:

  • Wikibase存储库:这是一个用于存储和管理数据的扩展功能。
  • Wikibase客户端:它可以从Wikibase存储库检索和嵌入结构化数据。

Wikibase的核心功能是提供一个协作空间,供个人和团体以结构化的方式贡献、编辑和管理信息。它可以轻松地被计算机消费,翻译成多种语言,并作为链接开放数据网络的一部分与世界共享。

解题

MediaWiki具备以.xml格式导出内容的功能,结构化的Wikibase内容(属性、项目、词位)自然不例外。

但是,如果直接从[[Special:Import]]页面上传.xml,会被告知无法导入Wikibase内容。因为系统默认阻止这样的批量上传,避免Wikibase属性(P后面的数字)、项目(Q后面的数字)、词位(L后面的数字)的唯一标识符冲突。

通过在MediaWiki服务器根目录的LocalSettings.php中,加入一行这样的代码:

# 启用Wikibase项目的导入
$wgWBRepoSettings['allowEntityImport'] = true;

来取消限制。

但是这样导入之后,再想通过[[Special:NewItem]]新建项目,却会被告知:

不可以建立一个新页面。 它已经存在。

这是因为想要新建的页面的唯一标识符与现存页面已有的唯一标识符冲突了。

——等等,可是我们在新建项目的时候,又没办法强行指定唯一标识符。难道是系统在不知道唯一标识符已经被占用的情况下,还想要指定该唯一标识符?

原因

是的。

在MediaWiki所使用的数据库里,我们能看到这一数据表:

****_wb_id_counters

****是实际设置的表头。每个人设的表头并不一样。在LocalSettings.php中可以找到表头设定。例如笔者是这么设置的:

# MySQL具体设置
$wgDBprefix = "sanguok_";

那么我就会看到这样的数据表名:

sanguok_wb_id_counters

好的。那么在这一数据表中,有以下内容(以笔者情况为例):

id_typeid_value
77696B69626173652D6974656D6

在Wikibase的wb_id_counters表中,id_typeid_value列用来追踪不同类型实体的ID计数。这里的77696B69626173652D6974656D实际上是一个十六进制编码的字符串。当将这个十六进制字符串解码为ASCII文本时,它代表了某种类型的实体标识符。

让我们将77696B69626173652D6974656D这串十六进制代码解码成ASCII文本来看看它表示什么:

hex_string = "77696B69626173652D6974656D"
ascii_string = bytes.fromhex(hex_string).decode('utf-8')
ascii_string

解码后,77696B69626173652D6974656D代表的ASCII文本是wikibase-item。这意味着在wb_id_counters表中,这个条目是用来追踪Wikibase中“项目”(即item,例如Q1Q2等)的最新ID计数的。在我的情况中,id_value6,这表明追踪到的最新项目ID是Q6

然而,在我的实际情况里,经过批量导入后,Wikibase中最新的条目是item:Q10000,这显然与wb_id_counters表中的记录不匹配。

解决

为了解决这个问题,需要根据实际的最新项目ID(在我的情况下是Q10000),手动更新wb_id_counters表中相应wikibase-item类型的id_value——例如在我的情况下,改为10000

之后,再试看看能否透过[[Special:NewItem]]新建条目。

应该能够成功的。

Discover more from 山月

Subscribe now to keep reading and get access to the full archive.

Continue reading