RDF-语义网体系的基础技术
RDF(Resource Description Framework)即资源描述框架,是W3C提倡的一个数据模型,用来描述万维网上的资源及其相互间的关系。
RDF数据模型的核心包括资源(resource)、属性(property)、RDF陈述(RDF statement)等,最核心的就是三元组,资源——关系——资源,接下来简单介绍。
资源
这里的资源可以是具体的事物也可以是抽象的概念,比如书(具体)、计算机(具体)、量子力学(抽象)等。
在RDF中,每个资源拥有一个统一资源标识符(URI)来标识,URI是一个用来标识资源的字符串,它是万维网体系结构的重要组成部分。我们常用的网址叫做统一资源定位符(URL)是URI的一种。
RDF中是允许引入不包含任何URI标识的资源,被称为空白节点或匿名资源,用于表示一种存在变量,空白节点不能用URI来全局处理,所以为了区分不同的空白节点RDF解析器一般会为每个空白节点分配一个系统生成的内部名。
属性
属性用来描述资源之间的联系,比如父子、包含等,RDF中的属性同样也使用URI来标识,这使得万维网环境下全局性的标识资源以及资源间的联系成为可能。
陈述
陈述描述了某个资源特定属性及其属性值,表达为(主语、谓语、宾语)的三元组结构,RDF图是一个由RDF三元组构成的集合,可以用一个URI来标识这个RDF图,RDF三元组可以看成是“节点——边——节点”的结构,它和万维网的图结构(文档——超链接——文档)相吻合,本质上,RDF图是节点和边均带有标签的有向图结构,
RDF图
RDF图是一个由RDF三元组构成的集合,可以用一个URI来标识这个RDF图,称为具名图。词汇表通常是指在某个命名空间中的一组URI。RDF词汇表是一组以“http://www.w3.org/1999/02/22-rdf-syntax-nx#”为XML命名空间的URI
RDF的表示方法
表示方法指的是怎么存储和传输RDF数据,目前,RDF序列化的方式主要有RDF/XML,N-Triples,Turtle,RDFa,JSON-LD等几种。
N-Triples表示:
<http://www.kg.com/person/2> <http://www.kg.com/ontology/chineseName> "川普"^^string.
<http://www.kg.com/person/2> <http://www.kg.com/ontology/position> "美利坚第45任总统"^^string.
<http://www.kg.com/person/2> <http://www.kg.com/ontology/wife> "梅拉尼娅-特朗普"^^string.
<http://www.kg.com/person/2> <http://www.kg.com/ontology/nation> "USA"^^string.
<http://www.kg.com/person/2> <http://www.kg.com/ontology/age> "72"^^int.
<http://www.kg.com/person/2> <http://www.kg.com/ontology/belongparty> <http://www.kg.com/Party/2018>.
<http://www.kg.com/party/2018> <http://www.kg.com/ontology/name> "republic"^^string.
<http://www.kg.com/party/2018> <http://www.kg.com/ontology/fonder> "汉尼巴尔·哈姆林"^^string.
<http://www.kg.com/party/2018> <http://www.kg.com/ontology/born> "1854"^^data.
同一个实体拥有多个属性(数据属性)或关系(对象属性),我们可以只用一个subject来表示,使其更紧凑。我们可以将上面的Triples改为:
@prefix person: <http://www.kg.com/person/> .
@prefix party: <http://www.kg.com/party/> .
@prefix : <http://www.kg.com/ontology/> .
person:1 :chineseName "川普"^^string;
:position "美利坚第45任总统"^^string;
:wife "梅拉尼娅-特朗普"^^string;
:nation "USA"^^string;
:age "72"^^int;
party:2018 :name "汉尼巴尔·哈姆林"^^string;
:born "1854"^^data.
以上是两个RDF的变种表示形式,这个大家肯定很容易就看懂了,但RDF的表达能力是有限的,比如想要表达面向对象里的类的概念就不行了,类和实例是面向对象编程中常用的两个概念,类相当于抽象概念(比如哺乳动物),实例是对类的具象化(比如猫、狗等),这是现实社会经常遇到的概念,RDF并不支持,于是引入了RDFS和OWL这两种技术用来解决RDF表达能力有限的问题。
RDFS-对RDF的改进
RDFS再RDF的基础上增加了一些词汇(vocabulary)来拓展RDF的能力,后面的OWL也是一样的在RDF基础上增加词汇,这些增加的词汇用来定义类、实例、子集、包含关系等具体功能,一般用小写开头的单词或词组来表示属性,大写开头的表示类。数据属性(data property,实体和literal字面量的关系)通常由名词组成,而对象数据(object property,实体和实体之间的关系)通常由动词(has,is之类的)加名词组成。
在RDFS中,类(class)是一组个体资源的抽象,每个个体资源被称作一个类的实例。rdfs:class是所有类的类,rdfs:resource是所有资源的类。rdfs:subclassof和rdfs:subpropertyof分别刻画了类之间和属性之间的继承关系,rdfs:domain和rdfs:range则分别用于描述属性的定义域和值域。
RDFS的核心词汇
- 核心类
1) rdfs:Resource
通过RDF描述的事物被称为资源,每个资源都是类rdfs:Resource的一个实例。
2)rdfs:Property
是RDF资源的子集,用来表示资源属性。
3)rdfs:Class
与面向对象中类的概念类似。当定义新类时,表示该类的资源必须有一个rdf:type属性,属性值为rdfs:Class,例如:
<rdf:Description rdf:ID='horse'>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
</rdf:Description>
由于一个RDFS类就是一个RDF资源,因此我们可以把RDFS类写成资源的形式,更加简单清晰,上例改写如下:
<rdfs:Class rdf:ID='horse'>
</rdfs:Class>
2 容器类
1)rdf:Seq,表示一个有序列表的容器,即宾语顺序是有意义的;
2)rdf:Bag,表示一个无序列表的容器,即宾语顺序是无关的;
3)rdf:Alt,表示选项集合的容器,即只能选择多个选项中的一个作为宾语;
RDF/XML序列化为容器所有元素使用rdf:li属性,在RDF图中元素被表示成rdf:_1,rdf:_2,…,rdf:_n的形式。
4)rdf:Container,表示为所有RDF容器1),2),3)的超类,允许标记一个资源为列表而不明确说明类型。
3 为定义联系的核心属性
1)rdf:type,表明描述的资源是某个类的成员,因此它拥有类的成员所具有的所有特征。一个资源可以是多个类的实例。
2)rdfs:subClassOf,指定了类间关系,只有rdf:Class的实例才能拥有rdf:subClassOf属性。
3)rdfs:subPropertyOf,是rdf:Property的实例,它表明一个属性是另外一个属性的具体化。
4 为约束属性的核心属性
1)rdfs:domain,是rdf:Property的一个实例,指明属性的定义域。
2)rdfs:range,是rdf:Property的一个实例,指明属性的值域。
5 为具体化的有用属性
rdf:subject、rdf:predicate、rdf:object分别具体化一个RDF三元组的主语、谓语、宾语。rdf:Statement是用于标记一个具体化的三元组。
6 功能属性
1)rdfs:seeAlso,指出了一个资源可能为主语资源提供额外的信息,可能是某个网站的URL或者指向某个纸质媒体的URI。
2)rdfs:isDefinedBy是rdfs:seeAlso的子属性,指出了定义主语资源的资源。
3)rdfs:label,提供一个人类可读的资源名称,它为某个资源附加了一个比URI更便于理解的名字。
4)rdf:comment,提供一个人类可读的有关资源的描述。
下面给出一个RDFS的示例,见表3-1,包括了Person、Animal、MaritalStatus类,ssn、age、maritalStatus属性,以及John、married、divorced等实例。习惯上,使用一个大写首字母标识一个类名,小写首字母标识属性名。
1-3行定义了命名空间;
4-7行定义了Person类,其中,a相当于rdf:type;
8-9行定义了MaritalStatus类;
10-14行描述了属性ssn,表明属性是一个社会保险号;
15-22行分别描述了属性age和maritalStatus;
23-26行描述了类Person的一个实例john;
27-30行描述了实例married、divorced。
RDFS需要一些程序基础来理解,多看几遍会对RDFS理解的更好
OWL-终极本体语言
OWL网上能找到的中文资料很少,看了一篇翻译W3C的文章,贴在了文末。
OWL还是对于RDF词汇的扩充,不仅有类和实例的词汇表示,还增加了更多关系的表示。
W3C发布owl还是因为RDFS的表达能力较弱,OWL有丰富的知识表示和推理能力,W3C的指定本体语言,OWL以描述逻辑为理论基础,之后再看这方面的内容,虽然是官方推荐,但工业中并不一定都会用OWL(应该念ao,一声,奥创的奥),主要是成本的考量。
简单介绍一下OWL相对于RDFS不同的地方,OWL引入了布尔算子(并、或、补)、递归地构建复杂的类,还提供了表示存在值约束、任意值约束和数量值约束等能力。同事,owl能提供描述属性具有传递性、对称性、函数性等性质。还有两个类等价或者不相交,两个属性等价或者互逆,两个实例相同或者不同,还有枚举类等等。
1.OWL的种类
OWL提供了三种表达能力递增的子语言,以分别用于特定的实现者和用户团体。
(1)OWL Full
(2)OWL DL
(3)OWL Lite
具体的介绍大家看文末链接。
2.命名空间
在我们使用一组术语之前,我们需要一个精确地指出哪些具体的词汇表将被用到。一个标准的本体开头部分里包括一组XML命名空间(namespace)声明(被包含在rdf:RDF标签里)。这些命名空间声明提供了一种无歧义地解释标识符的方式,并使得剩余的本体表示具有更强的可读性。一个典型的OWL本体以一个命名空间声明(namespace declaration)开始(就像下面的例子那样)。当然,被定义本体的URIs未必都是w3.org的。
3.基本元素
一个OWL本体中的大部分元素是与类(class)、属性(property)、类的实例(instance)以及这些实例间的关系有关的。
3.1Class, rdfs:subClassOf
一个领域中的最基本概念应分别对应于各个分类层次树的根。OWL中的所有个体都是类owl:Thing的成员。因此,各个用户自定义的类都隐含地是owl:Thing的一个子类。要定义特定领域的根类,只需将它们声明为一个具名类(named class)即可。OWL也可以定义空类,owl:Nothing。
rdfs:subClassOf是用于类的基本分类构造符。它将一个较具体的类与一个较一般的类关联。如果X是Y的一个子类(subclass),那么X的每个实例同时也都是Y的实例。rdfs:subClassOf关系是可传递的,即如果X是Y的一个子类,而Y又是Z的一个子类,那么X就是Z的一个子类。
3.2个体(实例)
通常认为类的成员是我们所关心的范畴中的一个个体(而不是另一个类或属性)。要引入一个个体(individual),只需将它们声明为某个类的成员。
<owl:Thing rdf:ID="CentralCoastRegion" />
<owl:Thing rdf:about="#CentralCoastRegion">
<rdf:type rdf:resource="#Region"/>
</owl:Thing>
rdf:type是一个RDF属性(RDF property),用于关联一个个体和它所属的类。
3.3属性
ObjectProperty, DatatypeProperty, rdfs:subPropertyOf, rdfs:domain, rdfs:range
一个属性是一个二元关系。有两种类型的属性:
数据类型属性(datatype properties),类实例与RDF文字或XML Schema数据类型间的关系。
对象属性(object properties),两个类的实例间的关系。
在我们定义一个属性的时候,有一些对该二元关系施加限定的方法。我们可以指定定义域(domain)和值域(range)。
<owl:ObjectProperty rdf:ID="madeFromGrape">
<rdfs:domain rdf:resource="#Wine"/>
<rdfs:range rdf:resource="#WineGrape"/>
</owl:ObjectProperty>
<owl:ObjectProperty rdf:ID="course">
<rdfs:domain rdf:resource="#Meal" />
<rdfs:range rdf:resource="#MealCourse" />
</owl:ObjectProperty>
locatedIn属性将事物和事物所在的地区相关联。
3.4属性与数据类型
根据是将个体关联到个体、还是将个体关联到数据类型,我们可以区分两类属性:前者称为对象属性(object properties);后者称为数据类型属性(datatype properties)
3.5属性特性
3.5.1. TransitiveProperty
如果一个属性P被声明为传递属性,那么对于任意的x,y和z:
P(x,y) 与 P(y,z) 蕴含 P(x,z),属性locatedIn是传递属性。
3.5.2SymmetricProperty
如果一个属性P被声明为对称属性,那么对于任意的x和y:P(x,y)当且仅当P(y,x)
3.5.3 FunctionalProperty
如果一个属性P被标记为函数型属性,那么对于所有的x, y, 和z: P(x,y) 与P(x,z) 蕴含 y = z
3.5.4 inverseOf
如果一个属性P1被标记为属性P2的逆(owl:inverseOf), 那么对于所有的x 和 y: P1(x,y) 当且仅当P2(y,x)
3.5.5 InverseFunctionalProperty
如果一个属性P被标记为反函数型的(InverseFunctional),那么对于所有的x, y 和 z: P(y,x) 与 P(z,x) 蕴含 y = z ,反函数型属性的值域中的元素可以看成是在数据库意义上定义一个唯一的键值。owl:InverseFunctional意味着属性的值域中的元素为定义域中的每个元素提供了一个唯一的标识。
4.本体映射
为了让本体发挥最大的作用,就需要让本体得到充分的共享。为了使得在开发本体时尽可能的节省人力,就需要使得开发出的本体能够被重用。更理想的情况是他们能够被组合使用。例如,你可能同时使用来自某一来源的日期本体(date ontology)和来自另一来源的物理位置本体(physical location ontology),并将位置(location)的概念加以扩展以包括这个位置所处在的时间段。
在开发一个本体的过程中,很多的精力都被投入到将类与属性联系起来以获取最大的意义的工作上去了,意识到这一点也是很重要的。我们希望对类成员作出的断言较为简单同时又要求有广泛的和有用的含意在里面。这也是在本体开发过程中最为困难的工作。如果你能够找到已经经过广泛使用和精炼的本体,那么采用它才有意义。
多个本体的合并工作是非常具有挑战性的。为了维护其一致性,几乎必然需要工具的支持。
4.1 类和属性之间的等价关系
equivalentClass, equivalentProperty,当我们要把一些本体组合在一起作为另一个新的本体的一部分时,能说明在一个本体中的某个类或者属性与另一个本体中的某个类或者属性是等价的,这往往很有用。在实际应用中我们这样做的时候要千万小心。因为如果要组合的那些本体是互相矛盾的(所有A的都是B的 与 A的并不全是B的),那么在组合得到的结果中就不会有满足条件的扩展(没有满足条件的个体或关系)了。
4.2 个体间的同一性
sameAs 描述个体之间相同的机制与描述类之间的相同的机制类似,仅仅只要将两个个体声明成一致的就可以了。
4.3 不同的个体
differentFrom, AllDifferent 这一机制提供了与sameAs相反的效果。
- 复杂类
OWL另外还提供了一些用于构建类的构造子。这些构造子被用于创建所谓的类表达式。OWL支持基本的集合操作,即并,交和补运算。它们分别被命名为owl:unionOf,owl:intersectionOf,和owl:complementOf.此外,类还可以是枚举的。类的外延可以使用oneOf构造子来显示的声明。同时,我们也可以声明类的外延必须是互不相交的。
注意类表达式是可以嵌套的,它并不要求要为每一个中间类都提供一个名字。这样就允许我们通过使用集合操作来从匿名类或具有值约束的类来创建复合类。
开放世界的假设
再强大的本体系统也是有信息局限的,我们建立一个关于汽车知识的本体库,如果我们对这个本体库问出一个汽车知识,比如“特斯拉model Y是否已经上市”,如果本体库并不包含该问题(信息比较新,并没有收录),那么他该怎么回答,是回答“没有”还是“我不知道”,如果是开放世界假设,那就要回答“我不知道”,如果是封闭世界假设,那回答就是“没有”(因为本体库中并没有该车上市的信息,所以推断没有上市)。
SPARQL
关系型数据库一般用SQL进行查询,RDF的数据都是以图形式存储的,它的查询语言使用的是SPARQL。
一条SPARQL查询,其核心是对于一组变量及其之间关系的描述,构成了一种带有变量的图模式,与SQL类似,SPARQL查询可以返回一条或多条结果,每条结果包含的是对上述每个变量的一个绑定-指明了该变量与一个RDF术语之间的对应关系。RDF术语可以是URI、空白节点或者字面量。于是,根据每条结果,通过将查询图模式中的变量根据绑定替换为对应的RDF术语,应当构成待查询的RDF图的一个子图,这个子图称作与上述图模式相匹配。RDF查询语言主要定义了表达查询图模式的一套语法和语义。
参考资料
语义网技术体系 [瞿裕忠,胡伟,程龚 编著] 2015年版
4.http://www.chinaw3c.org/REC-sparql11-overview-20130321-cn.html