动手构建你的第一个知识图谱 by RDF

发布时间 2023-11-05 03:55:55作者: JasonHao

本文内容预告

今天分享如何使用 RDF 语言创建知识图谱,一些基本的 RDF 语法规则。

RDF 介绍

RDF 的全称叫 Resource Description Framework (资源描述框架)。它是实现语义网络的三个基础技术之一 (其他两个是 SPARQL 和 OWL)。 它是被 W3C 推荐的一个数据模型:这意味着所有的语义网络数据都用 RDF 来存储;另外它也是一种在万维网中表示资源信息的语言,有着一套自己的语法规则。

RDF 基本元素

URI (Uniform Resource Identifier) 叫做 ”统一资源标识符“,它的语法如下

URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment]

其中 schema 指定协议类型,比如 http, ftpauthority 指定域名 (IP地址) 和端口信息;path 指定资源在服务端的路径;query 指定传到服务端应用的数据; fragment 是一个内部页面标签,指定该资源在网页的具体位置;[] 表示里面的内容可选。

Literal 叫做 ”字面量“ (很奇怪的叫法),只要表示一些数据值,有很多类型,比如字符 (”刘备“^^xsd:string),浮点类型: ("26"^^xsd:float) 等。

Blank Node 叫做 "空白节点",表示某个存在某个实体,对应一阶逻辑中的 \exists x

RDF Triple 叫做 "RDF 三元组":(s,p,o),其中 s 叫做主语,可以是 URI 或者 Blank Node; p 叫做谓语,是一个 URI;o 叫做宾语,可以是 URI Blank Node,或者 Literal。

RDF 基本语法

Namespace: 命名空间是一个 URI, 不同命名空间下使用不同的 URI 定义方式来表示真实世界的实体,防止实体或者谓语表示冲突,跟 Python 的各种包名作用类似。比如刘备在 DBPedia 上的 URI 是 <http://dbpedia.org/resource/Liu_Bei>,在 Wikidata 上的 URI 是 <http://www.wikidata.org/entity/Q245315> (你可以输入这两个 URI 到浏览器查看)。

Prefix: 用于指定命名空间的简写。比如在 DBpeida 上资源的命名空间可以表示如下:

@prefix dbr: <http://dbpedia.org/resource/> . 

RDF Statement: 使用声明的方式来定义三元组,它的基本格式是:<subject> <predicate> <object>, 比如在 DBPedia 上我们用 RDF 定义刘备的老婆有孙夫人,糜夫人,甘夫人,儿子是刘婵:

@prefix dbr: <http://dbpedia.org/resource/> .
@prefix dbo: <http://dbpedia.org/ontology> .

dbr:Liu_Bei dbo:spouse dbr:Lady_Sun .
dbr:Liu_Bei dbo:spouse dbr:Lady_Mi .
dbr:Liu_Bei dbo:spouse dbr:Lady_Gan .
dbr:Liu_Bei dbo:child dbr:Liu_Shan 

上面定义了 prefix dbrdbr:Liu_Bei 表示 <http://dbpedia.org/resource/Liu_Bei> 的缩写,符号 . 用于连接三元组,表示逻辑 ”与“。

Blank Node 表示:如果我们想描述刘备有一个死了的不知名的儿子,我们可以这样表示

@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

dbr:Liu_Bei dbo:child _:b1 . 
_:b1 dbo:gender "man"^^xsd:string.

这里 _:b1 表示存在某个实体,这个实体的 URI 用 _:s 表示其中 s 可以是任何字符或者"_" 加数字的格式。 其中 xsd 这个前缀指定的命名空间下定义了所有的语义网络上通用的数据类型,比如 xsd:floatxsd:stringxsd:dateTime等。 Blank Node 的另外一种表示格式:

dbr:Liu_Bei dbo:child [dbo:gender "man"^^xsd:string].

其中[]表示 Blank Node, 它是 dbo:child的宾语,而[] 里面之间表示这个 Blank Node 的谓语和宾语。

符号, ; .的使用, 用于分割共用同一个谓语的多个宾语;; 用于分割共用同一个主语的多个谓语;. 用于连接 RDF Staements。我们重写一些上面所有的例子:

@prefix dbr: <http://dbpedia.org/resource/> .
@prefix dbo: <http://dbpedia.org/ontology> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

dbr:Liu_Bei dbo:spouse dbr:Lady_Sun, dbr:Lady_Mi, dbr:Lady_Gan;
            dbo:child dbr:Liu_Shan, [dbo:gender "man"^^xsd:string]

RDF Satement: 对三元组做注解,比如我们想描述 “刘备说‘刘婵是我儿’”,这时我们可以这么表示

@base <http://example.org/> .
@prefix dbr: <http://dbpedia.org/resource/> .
@prefix dbo: <http://dbpedia.org/ontology> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 

dbr:Liu_Bei :said _:b .
_:b rdf:type rdf:Statement.
_:b rdf:subject dbr:Liu_Bei . 
_:b rdf:predicate dbo:child . 
_:b rdf:object dbr:Liu_Shan 

这里有个新的 prefix rdf 指定了一个命名空间,该命名空间下有很多语义网络通用的保留字:比如rdf:type用于指定实体类别,rdf:subject 用于指定 RDF statement 的主语。这里再次用到 Blank Node _:b 用来表示某个陈述。其中 :said 是一个我们定义的本地谓语 (@base用于指定本地 URI) ,因此没有 prefix。

多元关系: 我们可以看到前面我们定义的都是可以自然表示为 (s,p,o) 这样的二元关系,如果我们想表示多元关系怎么办呢?比如 ”刘关张桃园结义“。

@base <http://example.org/> .
@prefix dbr: <http://dbpedia.org/resource/> .

:three_ally :first_bro dbr:Liu_Bei . 
:three_ally :second_bro dbr:Guan_Yu . 
:three_ally :third_bro dbr:Zhang_Fei . 

上面的:three_ally是我们定义的一个新的本地 URI,作为一个 helper node 来帮助构建三元关系。

最后在 RDF PlayGround 中可视化我们定义的RDF数据

@base <http://example.org/> .
@prefix : <http://example.org/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix dbr: <http://dbpedia.org/resource/> .
@prefix dbo: <http://dbpedia.org/ontology/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

dbr:Liu_Bei dbo:spouse dbr:Lady_Sun, dbr:Lady_Mi, dbr:Lady_Gan;
            dbo:child dbr:Liu_Shan, [dbo:gender "man"^^xsd:string] .

:three_ally :first_bro dbr:Liu_Bei . 
:three_ally :second_bro dbr:Guan_Yu . 
:three_ally :third_bro dbr:Zhang_Fei . 

dbr:Liu_Bei :said _:b .
_:b rdf:type rdf:Statement.
_:b rdf:subject dbr:Liu_Bei . 
_:b rdf:predicate dbo:child . 
_:b rdf:object dbr:Liu_Shan  .

关注不走丢,欢迎反馈、点赞、加星

参考

  1. Scientific Data Management & Knowledge Graph, by Maria-Esther Vidal
  2. https://cambridgesemantics.com/blog/semantic-university/learn-rdf/
  3. https://iccl.inf.tu-dresden.de/w/images/d/dc/FSWT-L2-Introduction-to-RDF.pdf
  4. RDF Playground: http://rdfplayground.dcc.uchile.cl