内容预告
今天,我们深入探索如何从 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/