Wikidata是一个大型结构化开源知识图,为维基百科等项目提供支持。我们可使用SPARQL(Wikidata官方Tutorial对其进行查询。SPARQL是一种专为 RDF(Resource Description Framework)数据模型设计的查询语言。RDF通过三元组(主语subject,谓词predicate,宾语object)来组织数据。我们可在WDQS (WikiData Query Service)中使用SPARQL对Wikidata进行在线查询。

Wikidata介绍

实体和属性

  Wikidata中最基本概念为实体(Entity)属性(Property)。由于语义多样性,每个实体和属性都会以字母加数字的形式进行唯一化,实体以Q为前缀,属性以P为前缀,如Q148 (China),P31 (Instance of)。实体和属性分别构成了整个Wikidata知识图的节点和边。需注意的是,属性并不一定为知识图的一条边(连接两个实体)。这种情况十分常见,如P31 (Instance of) 用于表明实体所属的类别,将指向该实体对应的父类实体;而P1082 (Population) 用于表明实体(如某个国家)的人口数量,将直接对应一个数字。此外,属性不一定只对应一个值,由于人口会随时间不断变化,因此P1082 (Population) 通常会有多个对应不同时间戳的值。

数据结构

  由于在线查询受制于网速,可在WikidataDumps下载Wikidata的数据备份。如下载entities/latest-all.json.bz2,即可将整个Wikidata的知识图数据下载至一个json文件中(压缩文件约100GB,解压文件超过1TB)。json文件包含一个列表,列表中每个元素为一个字典,每个字典包含如下字段:

  • type:类型,实体item或属性property。大部分是实体item,还有property。
  • id:唯一标识符。
  • labels:多语言标签,即名称。
  • descriptions:多语言描述。
  • aliases:多语言别名。
  • claims:声明,包含属性及其对应的值。构建知识图最重要的字段。
  • sitelinks:在其他维基项目中的链接,如中文wiki、法文wiki等。
  • pageid:在维基百科等站点中的页面 ID。
  • ns:所在的命名空间 (namespace)。条目通常在 0 命名空间,而用户页面在 2 命名空间。
  • title:标题。
  • lastrevid:最后一次修改的版本 ID。
  • modified:最后修改时间。

  其中,声明claims的字典结构较为复杂,以属性标识符P[...]为键。每个键对应一个列表,存放相应的多条属性内容。属性内容字典结构如下:

  • mainsnak:主体部分,包含属性和属性值

    • snaktype:mainsnak 的类型。常见有:value表示有有效的属性值;novalue表示没有值;somevalue表示值未知或不确定。
    • property:属性的ID(例如:P31)。
    • datavalue:属性的值,可能是不同的数据类型,如实体、时间、量化数据等。
      • value:具体的值(例如:Q5,表示人类)。
      • type:值的类型,常见的类型有:
        • wikibase-entityid:表示实体(Item 或 Property)类型。
        • time:表示时间。
        • quantity:表示量化数据。
        • string:表示字符串(例如:文本类型的描述)。
      • datatype:值的数据类型,通常是 wikibase-item(指向另一个实体)或 quantity(表示数量)。
  • type:性质。可取值如:statement,最常见,表示这是一个有效的声明;mediainfo表示与媒体文件相关的信息;sitelinks涉及网站链接。
  • qualifiers:限定条件,用来描述属性值的更多信息(通常是一个列表)。例如,某个属性值可能会有时间戳(时间限定)、地点限定等。
    • property:限定条件的属性ID。
    • datavalue:限定条件的值,通常是某个属性的具体内容。
  • qualifiers-order:限定条件的字段顺序,帮助理解属性的附加信息。
  • rank:声明的等级。常见的等级有:
    • normal:普通等级。
    • preferred:首选等级(如果存在多个声明)。
    • deprecated:已弃用的声明。
  • references:该声明的参考来源,通常是引用的文献或其他来源。
    • snaks:引用的具体内容,类似于声明的 mainsnak,包括属性ID和对应的值。
    • snaks-order:引用的属性的顺序。
  • id:声明的唯一ID(用于区分不同的声明)。

SPARQL-Wikidata查询

  以下通过简单例子来介绍如何使用SPARQL查询Wikidata知识图。语法类似SQL,利用SELECTWHERE,其关键是使用主谓宾三元组来构成查询。

基本用法 — 主谓宾三元组

  查询巴赫的所有孩子:

SELECT ?child
WHERE
{
# ?child father Bach
?child wdt:P22 wd:Q1339.
}

  其中?child为待查询变量,可随意命名;wd表示WikiData的简写,用于引用实体;wdt表示WikiData Truthy,用于引用实体属性的值。语句连起来即:有属性father (P22)值为实体Bach (Q1339)的实体。以上将查询到实体ID的列表。如果要在列表中加上标签列,可加上wikidata的魔术语句:

SELECT ?child ?childLabel
WHERE
{
# ?child father Bach
?child wdt:P22 wd:Q1339.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

  其中wikibase:label为指定实体标签的固定字段。标签变量?childLabel的命名是固定的:必须以为要查询的实体的变量为前缀,即?child;并以首字母大写的待查询字段为后缀,即Label

  巴赫和Maria Barbara Bach生的孩子中,既是作曲家又是钢琴家的孩子:

SELECT ?child
WHERE
{
?child wdt:P22 wd:Q1339;
wdt:P25 wd:Q57487; # P25: mother
wdt:P106 wd:Q36834, wd:Q486748. # P106: occupation
}

  这里展示了分号;逗号,和句号.的用法和区别。如分号可用于省略主语?child,逗号可用于省略谓语wdt:P106

  巴赫的(外)孙子/女:

SELECT ?grandChild
WHERE
{
wd:Q1339 wdt:P40 ?child. # P40: child
?child wdt:P40 ?grandChild.
}

  这里展示了一个多跳查询,即通过?child作为中间跳板,限定了?grandChild与巴赫Q1339的关系。可进一步简化为:

SELECT ?grandChild
WHERE
{
wd:Q1339 wdt:P40 [ wdt:P40 ?grandChild ].
}

  以上使用方括号[]来表达“有以?grandChild为孩子的实体”,从而省略了前面的跳板变量?child。可理解为一个使用定语从句的复合句:Bach has a child who has a child ?grandchild.

符号拓展/*+|

  符号/表示属性路径,用于连接多条属性,构成多跳查询;符号*+类似正则表达式,*表示匹配零个或多个属性,+表示匹配一个或多个属性;符号|表示“或”。以下展示代码实例。

  所有艺术作品:

SELECT ?work ?workLabel
WHERE
{
?work wdt:P31/wdt:P279* wd:Q838948. # instance of any subclass of work of art
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}

  巴赫的所有后代:

SELECT ?descendant ?descendantLabel
WHERE
{
wd:Q1339 wdt:P40+ ?descendant.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}

  巴赫的所有后代:

SELECT ?descendant ?descendantLabel
WHERE
{
?descendant (wdt:P22|wdt:P25)+ wd:Q1339.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}

  此外,其中的问号?也是有语义的,表示:匹配一个或零个元素。

声明限定 Qualifiers

  用Qualifiers来对要查询的实体进行细粒度限定。

排序和数量限制

  用ORDER BY对查询结果进行排序,用LIMIT限定返回结果的最大数量。

  降序返回人口最大的前十个主权国家:

SELECT ?country ?countryLabel ?population
WHERE
{
?country wdt:P31/wdt:P279* wd:Q3624078; # P31: instance of; P279: subclass of; Q3624078: sovereign state
wdt:P1082 ?population. # P1082: population
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY DESC(?population)
LIMIT 10

  DESC表示降序,ASC表示升序,默认升序。

可选条件

  如果想返回部分字段,但不想让其影响检索条件,可使用OPTIONAL

  所有Arthur Conan Doyle的书,并且检索的字段title等是可选的:

SELECT ?book ?title ?illustratorLabel ?publisherLabel ?published
WHERE
{
?book wdt:P50 wd:Q35610. # P50: auther; Q35610: Arthur Conan Doyle
OPTIONAL { ?book wdt:P1476 ?title. }
OPTIONAL { ?book wdt:P110 ?illustrator. }
OPTIONAL { ?book wdt:P123 ?publisher. }
OPTIONAL { ?book wdt:P577 ?published. }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}

  其中title、illustrator等的匹配并不影响?book wdt:P50 wd:Q35610.的结果,能匹配上就返回值,否则该值填空。注意和下面代码的区别:

SELECT ?book ?title ?illustratorLabel ?publisherLabel ?published
WHERE
{
?book wdt:P50 wd:Q35610.
OPTIONAL {
?book wdt:P1476 ?title;
wdt:P110 ?illustrator;
wdt:P123 ?publisher;
wdt:P577 ?published.
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

  这个是OPTIONAL中任意字段不匹配,全都填空。

表达式FILTERBIND

  用表达式进行判断等操作。用到再记录。

组合GROUPING

  把结果通过某个字段组合起来。用到再记录。

wikidata介绍和查询的更多相关文章

  1. [译]LINT TO SQL 介绍(数据库查询) - Part.3

    出处:Linq To Sql (Part.3 – Querying our database) 术语表 Built-in:内置的 Clause:子句 Debugger:调试器 Object Relat ...

  2. Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)

    一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...

  3. spring-data-jpa 介绍 复杂查询,包括多表关联,分页,排序等

    本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求.这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring ...

  4. MySQL auto_increment介绍 以及 查询和修改auto_increment的方法

    一.auto_increment使用方法 .创建table时设置auto_increment属性和初始值100 create table nonove ( id bigint unsigned not ...

  5. Linux内核版本介绍与查询

    Linux内核版本命名在不同时期有着不同的规范,在涉及到Linux版本问题时经常容易混淆,主线版本/稳定版/长期支持版本经常搞不清楚,本文主要记录下内核版本命名的规则以及如何查看Linux系统版本信息 ...

  6. SSH动态查询封装接口介绍

    SSH动态查询封装接口介绍 1.查询记录总条数 public int count(Class c,Object[][] eq,Object[][] like,String[] group,String ...

  7. elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)

    一.查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验.主要包括: 拼写检查: 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全): 2. ES中查询建议的A ...

  8. 基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的处理

    在做一些常规应用的时候,我们往往需要确定条件的内容,以便在后台进行区分的进行精确查询,在移动端,由于受限于屏幕界面的情况,一般会对多个指定的条件进行模糊的搜索,而这个搜索的处理,也是和前者强类型的条件 ...

  9. 深入理解脚本化CSS系列第二篇——查询计算样式

    × 目录 [1]getComputedStyle [2]注意事项 [3]currentStyle[4]IE 前面的话 元素的渲染结果是多个CSS样式博弈后的最终结果,这也是CSS中的C(cascade ...

  10. Linq查询基本操作

    摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...

随机推荐

  1. R数据分析:网状meta分析的理解与实操

    meta分析之前有给大家写过,但是meta分析只能比较两个方法.经常是被用来证明在现有研究中显示矛盾结果的干预方法到底有没有效的时候使用,通过证据综合得到某种干预到底有没有用的结论.但是如果我要证明好 ...

  2. 【Linux】当初的学习笔记

    目录 Linux 笔记 linux基本概念 linux终端四部分 linux的实质 linux系统操作命令 查询用户 who who -H whoami 修改密码 快速切换到用户目录 sshd sys ...

  3. 【Docker】安装镜像报错warning: /var/cache/yum/x86_64/7/extras/packages/epel-release-7-11.noarch.rpm: Header

    这个的解决方法就是加上这个就可以了

  4. virtualbox设置了共享文件夹却无权限访问

    在virtualbox中设置共享文件夹后,然后登陆ubuntu系统访问共享文件夹,发现没有权限.查看共享文件夹的属性可知,共享文件夹的所有者是root,所属的组是vboxsf.以用户登录的时候,自然是 ...

  5. Qt音视频开发37-USB摄像头解码ffmpeg方案

    一.前言 用ffmpeg来处理USB摄像头,是前段时间研究视频监控ffmpeg内核的时候搞定的,既然ffmpeg这么牛逼的库可以解析各种音视频,我想处理个本地USB摄像头应该也不是什么难事,果真搜索也 ...

  6. 解决mapper重名问题

    问题 公司有一个集成开发平台,导入数据库表会自动生成实体类.mapper和xml等文件,这是一件很方便的事,可以省去很多没有技术性的重复工作. 但是最近我在使用这个平台的时候遇到了一个问题,那就是ma ...

  7. 新一代python版本与依赖管理工具 uv

    uv python版本与依赖管理 选择原因 1. 新的好玩.rust开发的执行速度快 2. 确实方便 3. 轻,软件就十几二十兆,占磁盘小 4. uv.lock可以锁版本 场景应用 场景一 从 ana ...

  8. R语言系列—Rstudio简介和安装

    同学们,大家好,今天继续更新R语言系列.今天我们开始讲R语言的集成开发环境(IDE)-Rstudio,这里会对Rstudio及其安装进行介绍,感兴趣的同学可以重点关注一下. Rstudio简介 Rst ...

  9. ffmpeg 去除音频中的静音

    去除音频中的静音 //去除所有超过0.3秒的静音部分 ffmpeg -i input.mp3 -af silenceremove=stop_periods=-1:stop_duration=0.3:s ...

  10. 浅说 c++20 coroutine

    浅说cppcoro 上一篇<浅说c/c++ coroutine>介绍了stackful协程,举了win32 Fiber跟tencent/libco为例. 本篇https://www.cnb ...