wikidata 数据结构
1 wikidata中的值类型
2 Entity的三种类型
2.1 Item的顶级字段
Q31.json下载
https://pan.baidu.com/s/14K7d-9xy7xNUO3AzUEGr0A cvg7
type
实体类型, str(字符串), 值有 item, property, datatype
id
实体编号, str
labels
实体的名称,多语言, KV(键值对)类型
{'labels': {'zh-sg': {'language': 'zh-sg', 'value': '比利时'}, ......}}
descriptions
实体的描述, 多语言, KV
{'descriptions': {'zh-cn': {'language': 'zh-cn', 'value': '西欧国家'}, ......}}
aliases
实体的别名, 多语言, KV+List
一个实体在一种语言中可能有多个说法, 例如 “比利时” 在法语中:
{
'aliases': [
{
'language': 'fr',
'value': 'Royaume de Belgique'
},
{
'language': 'fr',
'value': 'BE'
},
{
'language': 'fr',
'value': '🇧🇪'
},
{
'language': 'fr',
'value': 'Belgique'
},
{
'language': 'fr',
'value': 'le Royaume de Belgique'
}
]
}
claims
实体的各属性, 多层 KV + List,[具体分析](#4. claims 字段分析)
sitelinks
实体相关的链接如维基百科、维基语录和维基新闻等链接,多层KV
{
'sitelinks': {
'zhwikinews': {
'site': 'zhwikinews',
'title': 'Category:比利時',
'badges': []
},
......
}
}
lastrevid
版本号, int(整型),如 1254646632
2.2 wikidata官方数据模型展示
2.3 wikidata 数据模型详细分析(Entity:item:Q31)
2.4 claims 字段分析
claims是一个以属性id为key,描述属性的值为value的键值对
{
'claims': [{
'P1082': [{
'mainsnak': {
'snaktype': 'value',
'property': 'P1082',
'datavalue': { ... },
'datatype': 'quantity'
},
'type': 'statement',
'qualifiers': [{
'snaktype': 'value',
'property': 'P585',
'datavalue': { ... },
'datatype': 'time',
'hash': '489481dca5f5660d9fe15875b4dc94a57389e4bd'
}],
'qualifiers-order': [],
'id': 'Q31$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
'rank': 'normal',
'references': [{
'hash': '9b216970abe8fb8f730ebadbbfecc1b19d17c900',
'snak': {
'P123': [{
'snaktype': 'value',
'property': 'P123',
'datavalue': { ... },
'datatype': 'wikibase-item'
}],
'P585': [{
'snaktype': 'value',
'property': 'P585',
'datavalue': { ... },
'datatype': 'time'
}]
},
'snaks-order': ['P123', 'P585']
}]
}]
}]
}
claims
是一个属性字典(键值对类型)
一个属性P0000中可能有多个描述的值,例如比利时
的性质
:
'P31': ['主权国家', '联邦制', '国家', ......]
P31属性中每一项的具体值在mainsnak
中
qualifiers
是对属性的限定
qualifiers
是对P31
属性的限定属性的排序
id
可唯一标识当前描述P31
的全部属性,包括mainsnak
、qualifiers
、references
rank
是当前属性P31
的排序优先级,preferred
为优先排序,normal
为按顺序展示
references
表示mainsnak
引用自哪里
2.2 property的顶级字段
P19.json下载
https://pan.baidu.com/s/14K7d-9xy7xNUO3AzUEGr0A cvg7
相对于item,没有sitelinks
,替换为datatype
,其余字段不变
2.3 datatype的顶级字段
datatype类型实体不存在于wikidata-20200817-all.json
文件中
wikidata 数据类型解释
3 实体关系分析
顶级属性labels
、aliases
、descriptions
、sitelinks
直接多对一关联到id
建表存储
例:labels
表
labels_id | q_id | language | value |
---|---|---|---|
1 | Q31 | zh | 比利时 |
2 | Q31 | zh-hk | 比利時 |
其他顶级属性同理
3.1 claims属性内关系分析
mainsnak
、qualifiers
、references
中均有相同属性,应将这四种属性存在一张表内,由他们引用。
而一个qualifiers
包含多个qualifier
,references
包含多个reference
,所以他们应构成一对多关系。
3.2 claims中属性 E-R 图
snak
中的datavalue
存储的就是属性的值,最终的值一般是string
或int
类型,没有再进行更细致的分析。若解析datavalue
则需要找到对应的datatype
类型进行解析,这里就当做一个非常长的字符串存储进数据库。
3.3 当前E-R图中的问题及优化
问题:
1、 太多的主外键关系会影响查询速度
2 、snaks
表中的datavalue
字段是text
类型严重影响查询速度
3、关联查询效率太低,如查询claims
对应的qualifiers
将是全表查询:
SELECT * FROM qualifiers qu LEFT JOIN claims c WHERE qu.cid = c.cid;
解决办法:
1、在数据库中不创建外键约束,由上层程序保证约束完整性。id
可唯一标识当前描述P31
的全部属性,包括mainsnak
、qualifiers
、references
,直接用id
作为这三张表的主键即可。
2、最好将datavalue
继续拆分为粒度更细的字段存储,或者将datavalue
单独存储在一张表中,需要使用时在进行查找。
3、给qualifiers
的cid
字段增加 BTREE 索引,效率提升100倍。
3.4 优化后的 E-R 图
图中的主外键关系均为逻辑关系,不存在数据库中,仅靠上层程序保证主外键完整性。
wikidata Navicat 模型文件下载
链接:https://pan.baidu.com/s/19oHW2LglBIniZ2oSWBDo3g
提取码:c6pv
欢迎mark,每天更新
单个实体下载
https://www.wikidata.org/wiki/Special:EntityData/Q31.json