内容预告
今天,我们深入探索如何从 wikipedia 和 wikidata 这两大公共知识图谱平台上提取数据。文章将首先解析 wikidata 背后的复杂数据模型,通过具体案例来阐释其工作原理,继而详细指导您如何运用 sparql 语言,从 wikidata 和 wikipedia 获取所需数据。文末特别赠送一本精选的知识图谱开源书籍 📚。
dbpedia 历史简介

简要概述:dbpedia 的数据源自 wikipedia 的信息框和文章,而 wikidata 的数据则基于 dbpedia,进一步为 wikipedia 提供信息支持。通过社区成员的持续贡献,这两个平台每年都在不断地丰富和更新数据。in short: wikipedia
→
\rightarrow
→ dbpedia
→
\rightarrow
→ wikidata。wikidata 的数据质量整体要比 dbpedia 上的要好。
很多同学不知道如何从 wikidata 上获取数据主要有两个难点:
- 不了解 wikidata 的数据模型
- 因为 wikidata 奇怪的命名实体和属性的方式,让我们摸不着头脑
难点一:wikidata 数据模型

前缀命名空间介绍:
wd: wikidata. 用于命名实体 uri 。比如 wd:q317521 (埃隆马斯克)。
wdt: wikidata truth. 用于命名属性。比如 wdt:p26 (配偶)。
p: property. 用于命名某个属性(property) 的 statement 节点 (wikidata statement 节点来连接所有跟某个属性相关的信息。相当于属性的注解)。比如 p:p26 (配偶的 statement 节点)。
ps: property statement. 用于命名 statement 节点值的属性,也就是用 wdt 为前缀的属性的值。比如 ps:p26 (配偶 statement 节点的值,跟 wdt:p26 获取的值一样)。
pq: property qualifier. 用于命名描述 statement 节点值的属性。
prov:wasderivedfrom: 用于获取 statement 节点的参考节点。也就是说这个 statement 是根据什么网上的信息得来的。
pr: property reference. 用于命名参考节点信息的属性,比如参考链接 pr:p854。
埃隆马斯克例子
我在埃隆马斯克 (他的 uri 是 wd:q317521) 的 wikidata page: https://www.wikidata.org/wiki/q317521 中截取了一段关于他第一任老婆 贾丝廷·威尔逊 (后改姓 musk) 的信息。

sparql 查询从 wikidata 获取埃隆马斯克所有老婆的信息
wikidata 的查询入口: https://query.wikidata.org
select ?spousename ?marriagestarttime ?marriageendtime ?referenceurl ?referenceretrievedtime where {
wd:q317521 p:p26 ?marriagestatement.
?marriagestatement ps:p26 ?spouse.
?spouse rdfs:label ?spousename.
optional { ?marriagestatement pq:p580 ?marriagestarttime. }
optional { ?marriagestatement pq:p582 ?marriageendtime. }
optional {
?marriagestatement prov:wasderivedfrom ?refnode.
optional { ?refnode pr:p854 ?referenceurl. }
optional { ?refnode pr:p813 ?referenceretrievedtime. }
}
filter(lang(?spousename) = "en")
}
查询结果如下:

难点二:不知道属性的 uri
这里有三个方法帮助找到你想要的属性 uri
- 用 propbrowse 查询 https://hay.toolforge.org/propbrowse/. 这个工具可以根据你给的关键猜你想要的属性 uri。比如 end time (
p582)。这个方法比较宽泛。

- 用 wikidata graph builder https://angryloki.github.io/wikidata-graph-builder/. 输入 wiki page link 后,可以像上面方法一样去根据关键词检索可用的属性 uri。这个方法可以针对具体的实体。

- 用 sparql 直接搜。比如搜索所有以 埃隆马斯克 为主语,并且 prefix 为
wdt的属性 uri。
select distinct ?p where {
wd:q317521 ?p ?o .
filter(strstarts(str(?p), str(wdt:)))
}
sparql 查询获取 dbpedia 数据
dbpedia 的查询入口: https://dbpedia.org/sparql
首先搜索到埃隆马斯克的 dbpedia 页面 https://dbpedia.org/page/elon_mus.
可以推出他的 uri 是 http://dbpedia.org/resource/elon_musk
dbpedia 上的实体都是以 dbr 做为 prefix,属性都是以 dbo 或者 dbp 作为 prefix

这里可以直接看到他所有可用的属性 uri. 比 wikidata 来说,写 sparql 的难度低了很多。随便写一个,查找他的出生地和教育 :
prefix dbo: <http://dbpedia.org/ontology/>
prefix dbr: <http://dbpedia.org/resource/>
select ?birthplace ?edu where {
dbr:elon_musk dbo:birthplace ?birthplace .
dbr:elon_musk dbo:education ?edu
}

这里提示下,在 wikidata 和 dbpedia 上的查询,如果你使用它们的默认 prefix 名可以省略 prefix 语法. 这意味下面这个查询可以直接在 dbpedia 上执行。
select ?birthplace ?edu where {
dbr:elon_musk dbo:birthplace ?birthplace .
dbr:elon_musk dbo:education ?edu
}
文末送书 (开源的)
分享一本2021发布的好书 《knowledge graph》by aidan hogan 等。包含了知识图谱基础,知识图谱 deductive 和 inductive inference,知识图谱创建和质量评估等内容。这是一本 open source 的书,大家可在公众号回复: 20240112 领取,省去科学上网。
之前的文章
知识图谱 (1)
本体论介绍 (2)
动手构建你的第一个知识图谱 by rdf (3)
图数据模型介绍 (4) 数学符号警告
sparql查询:如何高效检索web数据 (5)
深入探索 sparql,复杂查询和聚合函数 (6)
用逻辑降维打击 sparql 查询:无痛写 not exists (7)
不定期更新专业知识和有趣的东西,欢迎反馈、点赞、加星
您的鼓励和支持是我坚持创作的最大动力!ღ( ´・ᴗ・` )

参考
- https://en.wikibooks.org/wiki/sparql/wikidata_qualifiers,_references_and_ranks
- scientific data management & knowledge graph, by maria-esther vidal
- dbpedia endpoint: https://dbpedia.org/sparql
- wikidata endpoint: https://query.wikidata.org
- wikidata property browser: https://tools.wmflabs.org/hay/propbrowse/
- wikidata graph builder: https://angryloki.github.io/wikidata-graph-builder/
发表评论