找回密码
 立即注册
首页 业界区 业界 wikidata介绍和查询

wikidata介绍和查询

搁胱 2025-6-4 22:32:22
  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)。
    • datatype:值的数据类型,通常是 wikibase-item(指向另一个实体)或 quantity(表示数量)。
    • datavalue:属性的值,可能是不同的数据类型,如实体、时间、量化数据等。

      • value:属性值,对于不同类型结构不同(如对于wikibase-entityid类型,值为字典,包含实体id)。
      • type:值的类型,常见的类型有:

        • wikibase-entityid:表示实体(Item 或 Property)类型。value为字典,包含key: entity-type, id, numeric-id。entity-type为实体类型,通常为"item";id为实体id,如"Q3247091";numeric-id为实体id对应的数字,如3247091。
        • string/math:string和math都为字符串类型(例如:文本类型的描述、数学公式等),value为一个字符串,其中math的value通常为latex公式。
        • quantity:表示量化数据。value为字典,包含key: amount, unit。amount为数值本身,如"+894123","-1811";unit为数值单位,如"1"对应数值最小刻度,"https://www.wikidata.org/wiki/Q25267"对应摄氏度。
        • time:表示时间。value为字典,包含key: time, timezone, before, after, precision, calendarmodel。time为时间,用ISO 8601标准表示,结构如"+YYYY-MM-DDTHH:MM:SSZ"(T和Z为固定结构,T将日期和时间分隔,Z表示协调世界时,Zulu时间);timezone指示时区,0表示协调世界时(UTC);before、after表示时间点的相对时间,表达不确定性,0表示没有不确定性;precision表示时间的精度等级,0为十亿年,1为一亿年,3为百万年,4为十万年,5为一万年,6为千年,7为世纪,8为十年,9为年,10为月,11为天,12为小时,13为分钟,14为秒;calendarmodel表示使用的日历模型,如"http://www.wikidata.org/entity/Q1985727"为格里历(公历)。
        • globecoordinate/globe-coordinate:表示地球坐标。value为字典,包含key: latitude, longitude, altitude, precision, globe。分别表示纬度、经度、海拔、精度、天体。经纬度、精度表示如Decimal("52.1561")。海拔通常为None。天体用天体实体的网址来表示,如"http://www.wikidata.org/entity/Q2",表示地球。
        • monolingualtext:表示单一语言的文本内容。value为字典,包含key: text, language。text为文本内容,如"பெல்ஜியர்",义为"比利时";language为对应语言的简写,如"ta",表示泰米尔语。



  • 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,利用SELECT和WHERE,其关键是使用主谓宾三元组来构成查询。
基本用法 — 主谓宾三元组

  查询巴赫的所有孩子:
  1. SELECT ?child
  2. WHERE
  3. {
  4. # ?child  father   Bach
  5.   ?child wdt:P22 wd:Q1339.
  6. }
复制代码
  其中?child为待查询变量,可随意命名;wd表示WikiData的简写,用于引用实体;wdt表示WikiData Truthy,用于引用实体属性的值。语句连起来即:有属性father (P22)值为实体Bach (Q1339)的实体。以上将查询到实体ID的列表。如果要在列表中加上标签列,可加上wikidata的魔术语句:
  1. SELECT ?child ?childLabel
  2. WHERE
  3. {
  4. # ?child  father   Bach
  5.   ?child wdt:P22 wd:Q1339.
  6.   SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  7. }
复制代码
  其中wikibase:label为指定实体标签的固定字段。标签变量?childLabel的命名是固定的:必须以为要查询的实体的变量为前缀,即?child;并以首字母大写的待查询字段为后缀,即Label。
  巴赫和Maria Barbara Bach生的孩子中,既是作曲家又是钢琴家的孩子:
  1. SELECT ?child
  2. WHERE
  3. {
  4.   ?child wdt:P22 wd:Q1339;
  5.          wdt:P25 wd:Q57487; # P25: mother  
  6.          wdt:P106 wd:Q36834, wd:Q486748. # P106: occupation  
  7. }
复制代码
  这里展示了分号;逗号,和句号.的用法和区别。如分号可用于省略主语?child,逗号可用于省略谓语wdt106。
  巴赫的(外)孙子/女:
  1. SELECT ?grandChild
  2. WHERE
  3. {
  4.   wd:Q1339 wdt:P40 ?child. # P40: child  
  5.   ?child wdt:P40 ?grandChild.
  6. }
复制代码
  这里展示了一个多跳查询,即通过?child作为中间跳板,限定了?grandChild与巴赫Q1339的关系。可进一步简化为:
  1. SELECT ?grandChild
  2. WHERE
  3. {
  4.   wd:Q1339 wdt:P40 [ wdt:P40 ?grandChild ].
  5. }
复制代码
  以上使用方括号[]来表达“有以?grandChild为孩子的实体”,从而省略了前面的跳板变量?child。可理解为一个使用定语从句的复合句:Bach has a child who has a child ?grandchild.。
符号拓展/*+|

  符号/表示属性路径,用于连接多条属性,构成多跳查询;符号*+类似正则表达式,*表示匹配零个或多个属性,+表示匹配一个或多个属性;符号|表示“或”。以下展示代码实例。
  所有艺术作品:
  1. SELECT ?work ?workLabel
  2. WHERE
  3. {
  4.   ?work wdt:P31/wdt:P279* wd:Q838948. # instance of any subclass of work of art
  5.   SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
  6. }
复制代码
  巴赫的所有后代:
  1. SELECT ?descendant ?descendantLabel
  2. WHERE
  3. {
  4.   wd:Q1339 wdt:P40+ ?descendant.
  5.   SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
  6. }
复制代码
  巴赫的所有后代:
  1. SELECT ?descendant ?descendantLabel
  2. WHERE
  3. {
  4.   ?descendant (wdt:P22|wdt:P25)+ wd:Q1339.
  5.   SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
  6. }
复制代码
  此外,其中的问号?也是有语义的,表示:匹配一个或零个元素。
声明限定 Qualifiers

  用Qualifiers来对要查询的实体进行细粒度限定。
排序和数量限制

  用ORDER BY对查询结果进行排序,用LIMIT限定返回结果的最大数量。
  降序返回人口最大的前十个主权国家:
  1. SELECT ?country ?countryLabel ?population
  2. WHERE
  3. {
  4.   ?country wdt:P31/wdt:P279* wd:Q3624078; # P31: instance of; P279: subclass of; Q3624078: sovereign state
  5.            wdt:P1082 ?population. # P1082: population
  6.   SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  7. }
  8. ORDER BY DESC(?population)
  9. LIMIT 10
复制代码
  DESC表示降序,ASC表示升序,默认升序。
可选条件

  如果想返回部分字段,但不想让其影响检索条件,可使用OPTIONAL。
  所有Arthur Conan Doyle的书,并且检索的字段title等是可选的:
  1. SELECT ?book ?title ?illustratorLabel ?publisherLabel ?published
  2. WHERE
  3. {
  4.   ?book wdt:P50 wd:Q35610. # P50: auther; Q35610: Arthur Conan Doyle
  5.   OPTIONAL { ?book wdt:P1476 ?title. }
  6.   OPTIONAL { ?book wdt:P110  ?illustrator. }
  7.   OPTIONAL { ?book wdt:P123  ?publisher. }
  8.   OPTIONAL { ?book wdt:P577  ?published. }
  9.   SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
  10. }
复制代码
  其中title、illustrator等的匹配并不影响?book wdt50 wd35610.的结果,能匹配上就返回值,否则该值填空。注意和下面代码的区别:
  1. SELECT ?book ?title ?illustratorLabel ?publisherLabel ?published
  2. WHERE
  3. {
  4.   ?book wdt:P50 wd:Q35610.
  5.   OPTIONAL {
  6.     ?book wdt:P1476 ?title;
  7.           wdt:P110 ?illustrator;
  8.           wdt:P123 ?publisher;
  9.           wdt:P577 ?published.
  10.   }
  11.   SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  12. }
复制代码
  这个是OPTIONAL中任意字段不匹配,全都填空。
表达式FILTER和BIND

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

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册