RDF基本概念及序列化方法

前言
RDF(Resource Description Framework,资源描述框架) 被称为语义网技术体系的基石。他是W3C提倡的一个数据模型,用于描述万维网上的资源及其相互间的联系。

本文不做过深的讲解,主要集中在两个方面:

  1. 保证清晰讲述RDF数据模型的概念
  2. 基本的语法介绍
  3. RDF、RDFS、OWL的关联及使用

一、RDF数据模型

RDF数据模型的核心:资源、属性、字面量、RDF陈述。RDF数据模型只适用于表达二元关系,当希望表达多元关系时,需要借助空白节点。

1. 资源

资源可以是任何想要描述的事物,可以是具体的,也可以是抽象的。例如,资源可以是“水果”,“香蕉”。

资源除了可以分为抽象的和具体的,还可以分为 “有名字的” 和 “没名字的” 。

  • 有名字的资源
    在万维网中,各类资源十分庞杂,在这样的条件下为一个资源起一个唯一的名字是十分难的,用咱们常用的命名法肯定是行不通的。为了给资源赋予一个唯一的名字,RDF中采用了URI(Uniform resource identifier, 统一资源标识符)来作为资源的名字,从而保证唯一性。

  • URI
    URI语法由URI协议名(如“http”、“ftp”)、冒号,以及协议对应的内容构成。URI包含URL和URN。

    • 形式上,URI的形式类似于普通网址的构造方式,但是要注意,URI不一定指称万维网上的资源。当我们用来标识万维网上的资源时,会使用统一资源定位符 URL(uniform resource locator),它是一种常用的URI。另一个常用的URI是统一资源名称URN(uniform resource name),如一本书的ISBN。
    • 不同协议之间的协调。不同协议有不同的内容,为了协议之间的协调,所有协议都必须遵循一定的URI语法通用规则,也就是为某些专门目的保留部分特殊字符。当在协议内容中要使用这些字符的时候,可以使用百分号编码为URI提供附加信息。
  • 没名字的资源
    RDF中允许使用空白节点或匿名资源,它表示一种存在变量,这种资源是不包含任何URI标识的,也就是 “没有名字”。因为这些空白节点没有“名字”,所以也就无法判断不同的空白节点是否指向相同的资源。但是在具体的实现中,RDF解析器一般会为每个空白节点分配一个系统生成的内部名用以区分。

2. 属性

属性也是一种资源,所以也是用URI来标识,这样就使得万维网环境下全局性的标识资源以及资源间的联系成为可能。同时,属性是一种较为特殊的资源,它的功能是描述资源间的联系。

3. 字面量

RDF中的字面量分为两种:朴素字面量、有类型字面量。

  • 朴素字面量
    由一个字符串和一个可选的语言标签组成,如 “Wei Hu”@en,语言标签只可以用在朴素字面量上。
  • 有类型字面量
    由一个字符串和一个数据类型组成,如“25”^^xsd:integer。其中,25是值,而xsd:integer是XML模式定义中的整形。没错,在RDF中没有专门定义数据类型,而是使用XML模式定义中的数据类型。唯一的例外是,RDF定义了唯一的内嵌数据类型 rdf:XML Literal,它允许嵌入形式良好的XML作为RDF中字面量的值。

4. RDF陈述

  • RDF陈述
    一个RDF陈述就是一个三元组 <资源 属性 取值>,可见,它描述了某个资源的特定属性及其值。通常我们也将其表达为 <主语 谓语 宾语> 即 <Subject Predicate Object> \text{<Subject Predicate Object>} <Subject Predicate Object>。其中,不同部分可取成分如下:

    部分可取成分
    主语URI、空白节点
    谓语URI
    宾语URI、空白节点、字面量
  • RDF图
    一个RDF图是一个由RDF三元组构成的集合,可以用一个URI来标识这个RDF图,有URI标识的RDF图叫做具名图。

  • 词汇表
    词汇表通常指在某个命名空间中的一组URI。RDF词汇表是一组以 " http://www.w3.org/1999/02/22-rdf-syntax-ns# " 为XML命名空间的URI,习惯上使用"rdf:"作为其命名空间前缀,这类预定义命名空间的词汇表也被称为原语。

  • RDF三元组的图解
    RDF三元组可以图解为“节点–边–>节点”的有向图结构,节点对应于主语或宾语,以URI或字面量命名,如果没有名字则为空白节点;节点之间的边用谓语标识,并且谓语也可以作为其他RDF三元组的主语或宾语。
    请添加图片描述
    如图,椭圆节点表示“资源”,空白的椭圆节点为“匿名资源“,矩形的节点为“字面量的值”。这个图表示一个使用“http://ws.nju.edu.cn/~whu”标识的人,认识一个姓名叫做“Yuzhong Qu”的人。

  • B连接
    如果2个RDF三元组至少共用一个空白节点,就称它们形成了一个B连接。B连接具有传递性,即如果2个RDF三元组都和同一个RDF三元组B连接,则这2个RDF三元组也是B连接的。

  • 子图
    基于B连接,RDF句子被定义为RDF图的子图(子集),它是由B连接的RDF三元组构成的极大集合。

二、RDF语法

RDF(资源描述框架),给出了一个描述所有资源的方法,基本单位是RDF三元组 <主语,谓语,宾语>。RDF图是一组RDF三元组,为了方便RDF图的存储和传输,需要将RDF图序列化为RDF文档。

如何传输和存储RDF图?
通常将RDF图序列化为RDF文档,在序列化的时候我们使用RDF/XML、Turtle等语法将RDF图转化为RDF文档。

RDF能够描述复杂的现实世界吗?
现实世界是复杂的,有抽象有具象,仅仅靠RDF是难以将事物之间的联系描述清楚的,所以提出了一组补充属性帮助描述现实世界中的模式,这样一组补充属性称为RDF Schema。然而,RDF Schema只能保证基本的描述,表达能力弱,并且没有推理能力,所以Web 本体语言(OWL)被提出了。OWL中提出了新的语法和公理,使得对模式的描述能力更强,并有了智能推理的能力。

从以上的描述,RDF、RDFS、OWL的联系应该很清晰了。除此之外还有RDFa,RDFa是一个新的W3C标准,通过它可以在网页中嵌入可供机器读取的RDF数据,同时避免了RDF数据和显示用户网页数据间的冗余。与RDF数据模型的对应关系使得可以将RDF三元组添加到XHTML文档中,也可以从中提取出这些RDF三元组。

这里要捋清楚这样的问题:

  • RDF图的序列化必须使用RDFS或者OWL吗
    不是的,RDF本身就能够描述一些知识,只是对复杂模式的描述需要借助RDFS和OWL。举例来说,RDF无法表示“类”和“实例”这样的概念,如果要表示一个类是另一个类的子类,RDF本身是无能为力的。

  • RDF文档一定要使用RDF/XML或者Turtle等语法吗
    是的,无论是否使用RDFS或OWL,只要是需要将RDF图序列化,就必须使用相关的语法。

如果对于XML语法不了解,可以看我的这篇文章,是此篇的知识基础。

本部分的介绍致力于读懂相关的RDF的文档,不做深挖,所以对一些概念的介绍主要从个人理解出发,有不足的地方欢迎指正。

1. RDF/XML 和 Turtle

我们前面讲到过,在不使用RDFS和OWL提供的属性的情况下,RDF本身是能够表示RDF图的,这一部分我们就来看一下如何表示。这里关注对同一个RDF图,如何使用RDF/XML语法和Turtle语法来表示。RDF图如下:

图中可以看出,这个RDF图包含三个三元组,椭圆形代表的是主语,矩形代表的是字面量值,其在这里是宾语,箭头代表的是谓语。这里需要说明的是,这里的主语和谓语其实都是URI,在这里我们省略了其命名空间。

PS:RDF/XML格式文件的后缀是.xml,Turtle格式文件的后缀是.ttl。

RDF/XML(程序1)

Turtle(程序2)

观察两段程序,RDF/XML格式的程序第一行必须做版本和编码方式的声明,接下来的2、3行和Turtle格式程序的1、2行作用相同,前一行都是声明了一个默认的命名空间,后一行都是声明了一个叫做rdf的命名空间。
接下来在RDF/XML格式的程序中,用rdf:Description标签声明了一个三元组,其中的rdf:about标签标识了三元组的主语,在rdf:Description标签包括的范围中分别有population、area、timezone三个谓语及对应的字面量。这段程序中展示的就是一个典型的RDF序列化RDF图,这里的rdf:Description、rdf:about都是RDF定义的属性。要注意的是,并不是所有以rdf:开头的属性都是RDF定义的,如rdf:type就是在RDFS中补充的属性。
在第二段Turtle格式的程序中,4-7行以更加简洁的方式表示了RDF图,以分号分割同一主语的不同关系及其对应的宾语,以句号结尾。不难看出,Turtle格式要简洁明了很多,所以在实际中的使用也是最多的。

使用rdf:ID和xml:base属性改写第一段程序:(程序三)

这里我们主要对比程序一和程序三的3、4、5行,可以看到程序一中的 rdf:about 换成了程序三中的 xml:base 以及 rdf:ID。其区别在于,rdf:about的值是“全地址”,rdf:ID是相对地址,其相对于xml:base,也就是说rdf:about相当于在xml:base的基础上加上“#”再加上rdf:ID。对于二者的使用应遵从以下原则:当介绍一个资源并且为资源提供初始信息时建议使用 rdf:ID,而当为一个已有资源扩充信息时则建议使用rdf:about。

关于Turtle的详细语法可以参考这篇博客,此处不再赘述。

2. RDFS 和 OWL

我们在前面已经说过,RDFS和OWL都是对RDF属性的扩充,他们各自都是一个属性集合,对于RDF、RDFS、OWL都有各自的命名空间,直接在浏览器访问该命名空间就可以看到在相应命名空间中定义的所有属性,其语法使用的均是Turtle。三者的命名空间如下:

名称命名空间
RDFhttps://www.w3.org/1999/02/22-rdf-syntax-ns#
RDFShttps://www.w3.org/2000/01/rdf-schema
OWLhttps://www.w3.org/2002/07/owl

其实对于RDF序列化的例子,我认为最好的范例就是这几个命名空间的定义,大家可以看看。接下来我会罗列出RDFS 以及 OWL 定义的一些属性及其功能作为备查:

1)RDFS属性

类别属性名介绍
核心类rdfs:Resource通过RDF描述的事物被称为资源,每个资源被认为是rdfs:Resource的一个实例。rdfs:Resource类抽象表达了资源的集合。
核心类rdf:PropertyRDF资源的自己,用来表示属性,即集合中的所有元素被抽象的称为“属性”。
核心类rdfs:Class对应类型或者类别的概念,和面向对象程序设计中的类相似。当一个模式定义一个新类时,表示该类的资源必须有一个rdf:type属性,属性值是rdfs:Class。注意,类成员关系不一定是胡吃的,一个资源很可能是多个类的实例。
容器类rdf:Seq用于表示一个有序列表的容器,即宾语的顺序是有意义的。
容器类rdf:Bag用于表示一个无序集合的容器,即宾语的顺序是无关的。
容器类rdf:Alt用于表示选项集合的容器,尽管指定了多个宾语,但只能选择一个作为宾语。
容器类rdfs:Container被指定为所有RDF容器 rdf:Seq、rdf:Bag、rdf:Alt的超类,允许标记一个资源为列表而不明确说明类型。
容器类rdfs:member所有不同的包含属性的超集。
为定义联系的核心属性rdf:type表明了一个资源是某个类的成员,因此它拥有类的成员所具有的所有特征。某个资源的 rdf:type 属性的值是另一个资源时,它必须是rdfs:Class的实例。
为定义联系的核心属性rdfs:subClassOf指定了类之间的子集/超集关系。
为定义联系的核心属性rdfs:subPropertyOfrdf:Property的实例,指出了一个属性时另外一个属性的具体化。
为约束属性的核心属性rdfs:domainrdf:Property的一个实例,用来指明一个属性的定义域。其作用是全局的。
为约束属性的核心属性rdfs:rangerdf:Property的一个实例,用来指明一个属性的值域,其语义解释和rdfs:domain类似。其作用是全局的。
为具体化的有用属性rdf:subject、rdf:predicate、rdf:object分别具体化一个RDF陈述到它的主语、谓语和宾语。
为具体化的有用属性rdf:Statement用于标记一个被具体化的三元组的“中心”节点。
功能属性rdfs:seeAlso指出了一个资源可能为主语资源提供额外的信息,这可能是某个网站的URL或者指向某个纸质媒体的URI。
功能属性rdfs:isDefinedByrdfs:seeAlso的子属性,指出了定义主语资源的资源。
功能属性rdfs:label提供一个人类可读的资源的名称,他为某个资源附加了一个比URI更便于理解的名字。
功能属性rdfs:comment提供一个人类可读的有关资源的描述。

2)OWL属性

类别属性名介绍
本体文档owl:imports允许引用另外一个包含定义的OWL本体,并将其含义作为定义本体的一部分。每一个引用都包含一个URI,他指向被导入的本体。owl:imports具有传递性。
本体文档owl:versionInfo、owl:priorVersion、owl:backwardCompatibleWith、owl:incompatibleWith等在本体头部添加有关版本的一些信息
本体文档dc:title、dc:creator等Dublin Core(DC)提供的一些潮涌词汇用来描述本题的名称和创建者信息
本体类公理owl:Class本体类是被定义为owl:Class的资源,owl:Class是rdfs:Class的子类,在OWL DL中,rdfs:Class和rdf:Property的使用是被禁止的。
本体类公理owl:Thing、owl:Nothing分别定义了最一般的类和空类。
本体类公理owl:equivalentClass定义两个类的等价关系
本体类公理owl:disjointWith、owl:complementOf定义两个类时不相交的和互补的。
本体类公理owl:oneOf枚举所有实例来定义一个类
本体类公理owl:unionOf、owl:disjointUnionOf、owl:intersectionOf定义一个类和其他多个类的关系
属性和属性公理对象属性关联一个实例到另一个实例
属性和属性公理数据类型属性关联一个实例到某个数据类型的字面量
属性和属性公理owl:topObjectProperty所有的对象属性都是其子属性
属性和属性公理owl:bottomObjectProperty不与任何实例关联
属性和属性公理owl:topDataProperty所有的数据类型属性都是其子属性
属性和属性公理owl:bottomObjectProperty不与任何数据类型的字面量关联
属性和属性公理owl:TransitiveProperty具有传递性的属性
属性和属性公理owl:SymmetricProperty、owl:AsymmetricProperty对称属性和非对称属性
属性和属性公理owl:FunctionalProperty、owl:InverseFunctionalProperty函数型属性和反函数型属性,他们可以用来推理等价关系,例如,如果两个资源URI的电子邮件地址相同,那么这两个字资源URI应该指称真实世界中的相同对象。
属性和属性公理owl:ReflexiveProperty、owl:IrreflexiveProperty定义了自反属性和反自反属性
属性和属性公理owl:inverseOf定义了两个属性是互逆的关系
属性和属性公理owl:equivalentProperty定义了两个属性是等价的关系
属性和属性公理owl:disjointProperty定义了两个属性是不相交的关系
属性和属性公理owl:propertyChainAxiom定义了属性链关系
属性上的类公理owl:allValuesFrom、owl:someValuesFrom类型的任意值和存在值约束,注意,他们通常与owl:onProperty一起在owl:Restriction中使用。注意,与rdfs:domain以及rdfs:range不同,它们的作用域是局部的。
属性和属性公理owl:Cardinality、owl:minCardinality、owl:maxCardinality分别指明属性值的基数、最小基数和最大基数
个体事实owl:sameAs、owl:differentFrom声明两个个体实例是相同的或不同的
个体事实owl:AllDifferent声明一组个体是各不相同的
个体事实owl:assertionProperty声明负关系

在RDF中一类常见的谓语和宾语是都柏林核心,具体可看这篇文章的介绍。

3)举例

在这里插入图片描述
这是RDF命名空间定义的前面一小部分,通过对照前面的语法以及相关属性的介绍,相信是非常易懂的。

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值