知识图谱的基础知识

来源:https://www.zhihu.com/people/simmerchan/posts

文章目录

        • 1 应用
        • 2 前身
          • 3.1 语义网络(Semantic Network)
          • 3.2 语义网(Semantic Web)和链接数据(Linked Data)
        • 3 概念
        • 4 语义网技术栈
          • 4.1 RDF
            • 4.1.1 概念
            • 4.1.2 RDF序列化 (表示)
          • 4.2 RDFS
          • 4.3 OWL
            • 4.3.1 数据建模
            • 4.3.2 推理
        • 5 关系数据库(MySQL)转为RDF
          • 5.1 两个标准
            • 5.1.1 direct mapping(直接映射)
            • 5.1.2 R2RML
          • 5.2 D2RQ工具
        • 6 SPARQL查询语言
          • 6.1 组成
          • 6.2 步骤
          • 6.3 例子
        • 7 Apache Jena

1 应用

谷歌搜索引擎

2 前身

3.1 语义网络(Semantic Network)

区别: 语义网(Semantic Web)

语义网络由相互连接的节点和边组成,节点表示概念或者对象表示他们之间的关系(is-a关系,比如:猫是一种哺乳动物;part-of关系,比如:脊椎是哺乳动物的一部分),如下图。

知识图谱的基础知识_第1张图片

在表现形式上,语义网络和知识图谱相似,但语义网络更侧重于描述概念与概念之间的关系,(有点像生物的层次分类体系——界门纲目科属种),而知识图谱则更偏重于描述实体之间的关联。

语义网络的优点

  1. 容易理解和展示。

  2. 相关概念容易聚类。

语义网络的缺点

  1. 节点和边的值没有标准,完全是由用户自己定义。

  2. 多源数据融合比较困难,因为没有标准。

  3. 无法区分概念节点和对象节点。

  4. 无法对节点和边的标签(label,我理解是schema层,后面会介绍)进行定义。

RDF的提出解决了语义网络的缺点1和缺点2,在节点和边的取值上做了约束,制定了统一标准,为多源数据的融合提供了便利。

另外,RDF对is-a关系进行了定义,即,rdf:type(是rdf标准中的一个词汇,之后的文章会介绍)。

因此,不管在哪个语义网络中,表达is-a关系,我们都用rdf:type,在语法上形成了统一。

比如上图中猫、熊与哺乳动物的关系就可以形式化的表达为:

猫 rdf:type 哺乳动物
熊 rdf:type 哺乳动物

但还有个问题,如何区分概念和对象?即定义Class和Object(也称作Instance, Entity)。

如果不能区分,会对我们产生什么影响?举个例子,假如我们有两个语义网络A和B。在A中,熊是哺乳动物的一个实例。在B中,熊是哺乳动物的一个子类。前者是is-a关系,后者是subClassOf关系。这种情况常有发生,我们建模的角度不同,那么同一个事物的表示也可能不同。如果我们不能用一种方法来区别两者,不仅会给我们带来理解上的困难,在进行融合的时候也会造成数据冲突。我们不能说A既是B的一个实例,又是B的一个子类。W3C制定的另外两个标准RDFS/OWL解决了这个问题。

RDFS和OWL是RDF更上一层的技术,主要是为了解决语义网络的缺点3和缺点4,其提供了schema层的描述。

通过RDFS或者OWL中的预定义词汇,我们可以形式化地声明一个类:

哺乳动物 rdf:type rdfs:Class

或者

哺乳动物 rdf:type owl:Class

通过RDFS也可以声明一个子类:

熊 rdf:type rdfs:Class
熊 rdfs:subClassOf 哺乳动物

或者声明一个实例

熊 rdf:type 哺乳动物

我们也可以把rdf:type用a代替,即:

熊 a 哺乳动物

RDF,RDFS/OWL属于语义网技术栈,它们的提出,使得语义网克服了语义网络的缺点。

语法:

rdf:type(is -a关系)

rdfs:Class / owl:Class(类)

rdfs:subClassOf (属于子类)

除了语义网络,人工智能的分支——专家系统,万维网之父Tim Berners Lee于1998年提出的语义网(Semantic Web)和在2006年提出的关联数据(Linked Data)都和知识图谱有着千丝万缕的关系,可以说它们是知识图谱前身。

3.2 语义网(Semantic Web)和链接数据(Linked Data)

相对于语义网络,语义网和链接数据倾向于描述万维网中资源、数据之间的关系。其实,本质上,语义网、链接数据还有Web 3.0都是同一个概念,只是在不同的时间节点和环境中,它们各自描述的角度不同。

链接数据应该是最接近知识图谱的一个概念,从某种角度说,知识图谱是对链接数据这个概念的进一步包装。

3 概念

知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Object)。

知识图谱的基础知识_第2张图片

在知识图谱中,我们用RDF形式化地表示这种三元关系。

RDF(Resource Description Framework),即资源描述框架,是W3C制定的,用于描述实体/资源的标准数据模型。RDF图中一共有三种类型,International Resource Identifiers(IRIs),blank nodes 和 literals。下面是SPO每个部分的类型约束:

  1. Subject可以是IRI或blank node。
  2. Predicate是IRI。
  3. Object三种类型都可以。

IRI我们可以看做是URI或者URL的泛化和推广,它在整个网络或者图中唯一定义了一个实体/资源,和我们的身份证号类似。

IRI:国际化资源标识符(Internationalized Resource Identifiers)

URI:统一资源标志符(Uniform Resource Identifier)

URL:统一资源定位符(Uniform Resource Locator)

参考:https://blog.csdn.net/weixin_45469491/article/details/108693029

literal是字面量,我们可以把它看做是带有数据类型的纯文本,比如我们在第一个部分中提到的罗纳尔多原名可以表示为"Ronaldo Luís Nazário de Lima"^^xsd:string。

blank node简单来说就是没有IRI和literal的资源,或者说匿名资源。

那么“罗纳尔多的中文名是罗纳尔多·路易斯·纳扎里奥·达·利马”这样一个三元组用RDF形式来表示就是:

知识图谱的基础知识_第3张图片

www.kg.com/person/1是一个IRI,用来唯一的表示“罗纳尔多”这个实体。kg:chineseName也是一个IRI,用来表示“中文名”这样一个属性。kg:是RDF文件中所定义的prefix(前缀),如下所示。

@prefix kg: >

即,kg:chineseName其实就是http://www.kg.com/ontology/chineseName的缩写。

知识图表示:

知识图谱的基础知识_第4张图片

将上面的知识图用更正式的形式画出来:

知识图谱的基础知识_第5张图片

我们其实可以认为知识图谱就包含两种节点类型,资源和字面量。借用数据结构中树的概念,字面量类似叶子节点,出度为0。

现在读者应该知道为什么我会说之前那幅图不准确,并会误导大家对知识图谱的理解了吧。"罗纳尔多·路易斯·纳萨里奥·德·利马"作为字面量,是不能有指向外部节点的边的,况且之前的图并不能直观地体现知识图谱中资源/实体(用IRI表示)这样一个极其重要的概念。

语义网技术栈(Semantic Web Stack),如下图:

知识图谱的基础知识_第6张图片

准确来说,知识图谱是由本体(Ontology)作为Schema层,和RDF数据模型兼容的结构化数据集。

Tom Gruber把本体定义为“概念和关系的形式化描述”,分别指实体的类层次和关系层次

我们以上篇文章罗纳尔多知识图为例,我们用IRI唯一标志的节点都是某个类的一个实例,每一条边都表示一个关系。罗纳尔多是一个人,里约热内卢是一个地点,我们用RDF来表示就是:

www.kg.com/person/1 rdf:type kg:Person.
www.kg.com/place/10086 rdf:type kg:Place.

关系我们也称为属性(Property),根据是实体和实体之间的关系还是实体和数据值之间的关系分为对象属性(Object Property)数据属性(Data Property)。在图中,罗纳尔多和里约热内卢的关系(本例中是对象属性)与罗纳尔多和全名的关系(本例中是数据属性)用RDF就可以表示为:

www.kg.com/person/1 kg:hasBirthPlace www.kg.com/place/10086 (对象属性/关系)
www.kg.com/person/1 kg:fullName "Ronaldo Luís Nazário de Lima"^^xsd:string (数据属性)

这里kg:Personkg:Placekg:hasBirthPlacekg:fullName是我们在Ontology中定义好的类和关系。

知识图谱的基础知识_第7张图片

4 语义网技术栈

知识图谱的基础知识_第8张图片

4.1 RDF
4.1.1 概念

RDF(Resource Description Framework),即资源描述框架,其本质是一个数据模型(Data Model)。它提供了一个统一的标准,用于描述实体/资源。

RDF形式上表示为SPO三元组,有时候也称为一条语句(statement),知识图谱中我们也称其为一条知识,如下图。

知识图谱的基础知识_第9张图片

RDF由节点和边组成,节点表示实体/资源、属性则表示了实体和实体之间的关系以及实体和属性的关系

4.1.2 RDF序列化 (表示)

RDF序列化的方式主要有:RDF/XML (. RDF) ,N-Triples (.nt) ,Turtle (.ttl) ,RDFa,JSON-LD (.json) 等几种。

  1. RDF/XML,顾名思义,就是用XML的格式来表示RDF数据。之所以提出这个方法,是因为XML的技术比较成熟,有许多现成的工具来存储和解析XML。然而,对于RDF来说,XML的格式太冗长,也不便于阅读,通常我们不会使用这种方式来处理RDF数据。

  2. N-Triples,即用多个三元组来表示RDF数据集,是最直观的表示方法。在文件中,每一行表示一个三元组,方便机器解析和处理。开放领域知识图谱DBpedia通常是用这种格式来发布数据的。

  3. Turtle, 应该是使用得最多的一种RDF序列化方式了。它比RDF/XML紧凑,且可读性比N-Triples好。

  4. RDFa, 即“The Resource Description Framework in Attributes”,是HTML5的一个扩展,在不改变任何显示效果的情况下,让网站构建者能够在页面中标记实体,像人物、地点、时间、评论等等。也就是说,将RDF数据嵌入到网页中,搜索引擎能够更好的解析非结构化页面,获取一些有用的结构化信息。读者可以去这个页面感受一下RDFa,其直观展示了普通用户看到的页面,浏览器看到的页面和搜索引擎解析出来的结构化信息。

  5. JSON-LD,即“JSON for Linking Data”,用键值对的方式来存储RDF数据。感兴趣的读者可以参考此网站。

下面,我们结合第一篇文章中罗纳尔多知识图的例子,给出其N-Triples和Turtle的具体表示。

知识图谱的基础知识_第10张图片

  • N-Triples表示:即用多个三元组来表示RDF数据集
Example1 N-Triples:

  "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.
  "足球运动员"^^string.
  "Ronaldo Luís Nazário de Lima"^^string.
  "1976-09-18"^^date.
  "180"^^int.
  "98"^^int.
  "巴西"^^string.
  .
  "里约热内卢"^^string.
  "-22.908333, -43.196389"^^string.

www.kg.com/person/1是一个IRI,用来唯一的表示“罗纳尔多”这个实体。kg:chineseName也是一个IRI,用来表示“中文名”这样一个属性。kg:是RDF文件中所定义的prefix(前缀),如下所示。

@prefix kg: >

即,kg:chineseName其实就是http://www.kg.com/ontology/chineseName的缩写。

  • Turtle表示:定义前缀(Prefix),对RDF的IRI进行缩写。
Example2 Turtle:

@prefix person:  .
@prefix place:  .
@prefix :  .

person:1 :chineseName "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.
person:1 :career "足球运动员"^^string.
person:1 :fullName "Ronaldo Luís Nazário de Lima"^^string.
person:1 :birthDate "1976-09-18"^^date.
person:1 :height "180"^^int. 
person:1 :weight "98"^^int.
person:1 :nationality "巴西"^^string. 
person:1 :hasBirthPlace place:10086.
place:10086 :address "里约热内卢"^^string.
place:10086 :coordinate "-22.908333, -43.196389"^^string.

同一个实体拥有多个属性(数据属性)或关系(对象属性),我们可以只用一个subject来表示,使其更紧凑。我们可以将上面的Turtle改为:

Example3 Turtle:

@prefix person:  .
@prefix place:  .
@prefix :  .

person:1 :chineseName "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string;
         :career "足球运动员"^^string;
         :fullName "Ronaldo Luís Nazário de Lima"^^string;
         :birthDate "1976-09-18"^^date;
         :height "180"^^int;
         :weight "98"^^int;
         :nationality "巴西"^^string; 
         :hasBirthPlace place:10086.
place:10086 :address "里约热内卢"^^string;
            :coordinate "-22.908333, -43.196389"^^string.

即,将一个实体用一个句子表示(这里的句子指的是一个英文句号“.”)而不是多个句子,属性间用分号隔开。

  • JSON-LD表示:
[
  {
    "@id": "http://dbpedia.org/resource/Bob_Marley",
    "@type": [
      "http://xmlns.com/foaf/0.1/Person"
    ],
    "http://www.w3.org/2000/01/rdf-schema#label": [
      {
        "@value": "Bob Marley",
        "@language": "en"
      },
      {
        "@value": "Bob Marley",
        "@language": "fr"
      }
    ],
    "http://www.w3.org/2000/01/rdf-schema#seeAlso": [
      {
        "@id": "http://dbpedia.org/resource/Rastafari"
      }
    ],
    "http://dbpedia.org/ontology/birthPlace": [
      {
        "@id": "http://dbpedia.org/resource/Jamaica"
      }
    ]
  },
  {
    "@id": "http://dbpedia.org/resource/Jamaica",
    "@type": [
      "http://schema.org/Country"
    ],
    "http://www.w3.org/2000/01/rdf-schema#label": [
      {
        "@value": "Jamaica",
        "@language": "en"
      },
      {
        "@value": "Giamaica",
        "@language": "it"
      }
    ],
    "http://www.w3.org/2003/01/geo/wgs84_pos#lat": [
      {
        "@value": "17.9833",
        "@type": "http://www.w3.org/2001/XMLSchema#float"
      }
    ],
    "http://www.w3.org/2003/01/geo/wgs84_pos#long": [
      {
        "@value": "-76.8",
        "@type": "http://www.w3.org/2001/XMLSchema#float"
      }
    ],
    "http://xmlns.com/foaf/0.1/homepage": [
      {
        "@id": "http://jis.gov.jm/"
      }
    ]
  },
  {
    "@id": "http://dbpedia.org/resource/Rastafari"
  },
  {
    "@id": "http://jis.gov.jm/"
  },
  {
    "@id": "http://schema.org/Country"
  },
  {
    "@id": "http://xmlns.com/foaf/0.1/Person"
  }
]
  • RDF表示:

和HTML的形式很类似,并且可以和ttl一样在开头定义前缀。




  
    Bob Marley
    Bob Marley
    
    
      
        Jamaica
        Giamaica
        17.9833
        -76.8
        
      
    

  


RDF的表达能力有限,无法区分类和对象,也无法定义和描述类的关系/属性。我的理解是,RDF是对具体事物的描述,缺乏抽象能力,无法对同一个类别的事物进行定义和描述。

就以罗纳尔多这个知识图为例,RDF能够表达罗纳尔多和里约热内卢这两个实体具有哪些属性,以及它们之间的关系。但如果我们想定义罗纳尔多是人,里约热内卢是地点,并且人具有哪些属性,地点具有哪些属性,人和地点之间存在哪些关系,这个时候RDF就表示无能为力了。

不论是在智能的概念上,还是在现实的应用当中,这种泛化抽象能力都是相当重要的;同时,这也是知识图谱本身十分强调的。

RDFS和OWL这两种技术或者说**模式语言/本体语言(schema/ontology language)**解决了RDF表达能力有限的困境。

4.2 RDFS

RDFS/OWL本质上是一些**预定义词汇(vocabulary)**构成的集合,用于对RDF进行类似的类定义及其属性的定义。

注意:通常我们用小写开头的单词或词组来表示属性大写开头的表示类数据属性(data property,实体和literal字面量的关系)通常由名词组成,而对象属性(object property,实体和实体之间的关系)通常由动词(has,is之类的)加名词组成。剩下的部分符合驼峰命名法。

RDFS,即“Resource Description Framework Schema”,是最基础的模式语言。还是以罗纳尔多知识图为例,我们在概念、抽象层面对RDF数据进行定义。下面的RDFS定义了人和地点这两个类,及每个类包含的属性。

@prefix rdfs:  .
@prefix rdf:  .
@prefix :  .

### 这里我们用词汇rdfs:Class定义了“人”和“地点”这两个类。
:Person rdf:type rdfs:Class.
:Place rdf:type rdfs:Class.

### rdfs当中不区分数据属性和对象属性,词汇rdf:Property定义了属性,即RDF的“边”。
:chineseName rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:string .

:career rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:string .
        
:fullName rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:string .
        
:birthDate rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:date .

:height rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:int .
        
:weight rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:int .
        
:nationality rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:string .
        
:hasBirthPlace rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range :Place .
        
:address rdf:type rdf:Property;
        rdfs:domain :Place;
        rdfs:range xsd:string .
        
:coordinate rdf:type rdf:Property;
        rdfs:domain :Place;
        rdfs:range xsd:string .

我们这里只介绍RDFS几个比较重要,常用的词汇( vocabulary ):

  1. rdfs:Class: 用于定义类。

  2. rdfs:domain: 用于表示该属性属于哪个类别。

  3. rdfs:range: 用于描述该属性的取值类型。

  4. rdfs:subClassOf: 用于描述该类的父类。比如,我们可以定义一个运动员类,声明该类是人的子类。

  5. rdfs:subProperty: 用于描述该属性的父属性。比如,我们可以定义一个名称属性,声明中文名称和全名是名称的子类。

其实rdf:Property和rdf:type也是RDFS的词汇,因为RDFS本质上就是RDF词汇的一个扩展。我们在这里不罗列进去,是不希望读者混淆。RDFS其他的词汇及其用法请参考W3C官方文档。

为了让读者更直观地理解RDF和RDFS/OWL在知识图谱中所代表的层面,我们用下面的图来表示例子中的数据层和模式层。

知识图谱的基础知识_第11张图片

  • rdfs:Literal:原始数据类型

  • Data层是我们用RDF对罗纳尔多知识图的具体描述,Vocabulary是我们自己定义的一些词汇(类别,属性),RDF(S)则是预定义词汇。

  • 从下到上是一个具体到抽象的过程。图中我们用红色圆角矩形表示类,绿色字体表示rdf:type,rdfs:domain,rdfs:range三种预定义词汇,虚线表示rdf:type这种所属关系。

  • 另外,为了减少图中连线的交叉,我们只保留了career这一个属性的rdf:type所属关系,省略了其他属性的此关系。

4.3 OWL

OWL( Web Ontology Language )可以看作是RDFS的一个扩展,其添加了额外的预定义词汇。

OWL有两个主要的功能:

  1. 提供快速、灵活的数据建模能力。

  2. 高效的自动推理。

4.3.1 数据建模

我们先谈如何利用OWL进行数据建模。用OWL对罗纳尔多知识图进行语义层的描述:

@prefix rdfs:  .
@prefix rdf:  .
@prefix :  .
@prefix owl:  .

### 这里我们用词汇owl:Class定义了“人”和“地点”这两个类。
:Person rdf:type owl:Class.
:Place rdf:type owl:Class.

### owl区分数据属性和对象属性(对象属性表示实体和实体之间的关系)。词汇owl:DatatypeProperty定义了数据属性,owl:ObjectProperty定义了对象属性。
:chineseName rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:string .

:career rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:string .
        
:fullName rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:string .
        
:birthDate rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:date .

:height rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:int .
        
:weight rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:int .
        
:nationality rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:string .
        
:hasBirthPlace rdf:type owl:ObjectProperty;
        rdfs:domain :Person;
        rdfs:range :Place .
        
:address rdf:type owl:DatatypeProperty;
        rdfs:domain :Place;
        rdfs:range xsd:string .
        
:coordinate rdf:type owl:DatatypeProperty;
        rdfs:domain :Place;
        rdfs:range xsd:string .
  • 用到的词汇有:owl:DatatypeProperty(数据属性)、owl:ObjectProperty(对象属性)、owl:Class(类)

schema层的描述语言换为OWL后,层次图表示为:

知识图谱的基础知识_第12张图片

  • 数据属性用青色表示,对象属性由蓝色表示。

罗纳尔多这个例子不能展现OWL丰富的表达能力,我们这里简单介绍一下常用的词汇:

描述属性特征的词汇:

  1. owl:TransitiveProperty: 表示该属性具有传递性质。例如,我们定义“位于”是具有传递性的属性,若A位于B,B位于C,那么A肯定位于C。

  2. owl:SymmetricProperty: 表示该属性具有对称性。例如,我们定义“认识”是具有对称性的属性,若A认识B,那么B肯定认识A。

  3. owl:FunctionalProperty: 表示该属性取值的唯一性。 例如,我们定义“母亲”是具有唯一性的属性,若A的母亲是B,在其他地方我们得知A的母亲是C,那么B和C指的是同一个人。

  4. owl:inverseOf: 定义某个属性的相反关系。例如,定义“父母”的相反关系是“子女”,若A是B的父母,那么B肯定是A的子女。

本体映射词汇(Ontology Mapping):

  1. owl:equivalentClass: 表示某个类和另一个类是相同的。

  2. owl:equivalentProperty: 表示某个属性和另一个属性是相同的。

  3. owl:sameAs: 表示两个实体是同一个实体。

本体映射主要用在融合多个独立的Ontology(Schema)。举个例子,张三自己构建了一个本体结构,其中定义了Person这样一个类来表示人;李四则在自己构建的本体中定义Human这个类来表示人。当我们融合这两个本体的时候,就可以用到OWL的本体映射词汇。回想我们在第二篇文章中提到的Linked Open Data,如果没有OWL,我们将无法融合这些知识图谱。

 rdf:type owl:Class .
 rdf:type owl:Class .
 owl:equivalentClass  .

更多的OWL词汇和特性请参考[W3C官网文档](OWL Web Ontology Language Overview)。

4.3.2 推理

接下来我们谈一下OWL在推理方面的能力。知识图谱的推理主要分为两类:基于本体的推理和基于规则的推理。

我们这里谈的是基于本体的推理。读者应该发现,上面所介绍的 属性特征词汇 其实就创造了对RDF数据进行推理的前提。此时,我们加入支持OWL推理的推理机(reasoner),就能够执行基于本体的推理了。

RDFS同样支持推理,由于缺乏丰富的表达能力,推理能力也不强。举个例子,我们用RDFS定义人和动物两个类,另外,定义人是动物的一个子类。此时推理机能够推断出一个实体若是人,那么它也是动物。OWL当然支持这种基本的推理,除此之外,凭借其强大的表达能力,我们能进行更有实际意义的推理。想象一个场景,我们有一个庞大数据库存储人物的亲属关系。里面很多关系都是单向的,比如,其只保存了A的父亲(母亲)是B,但B的子女字段里面没有A,如下表。

知识图谱的基础知识_第13张图片

如果在只有单个关系,数据量不多的情况下,我们尚能人工的去补全这种关系。如果在关系种类上百,人物上亿的情况下,我们如何处理?当进行关系修改,添加,删除等操作的时候,该怎么处理?这种场景想想就会让人崩溃。如果我们用 inversOf 来表示hasParent和hasChild互为逆关系,上面的数据可以表示为:知识图谱的基础知识_第14张图片

  • 绿色的关系表示是我们RDF数据中真实存在的,红色的关系是推理得到的。通过这个例子,相信读者应该初步了解了OWL的推理功能和能力。

目前,OWL的最新版本是OWL 2,在兼容OWL的基础上添加了新的功能,有兴趣的读者可以查阅W3C文档。另外,OWL 2包含了三个标准,或者三种配置(Profile),它们是OWL 2完整标准(OWL 2/Full)的一个子集。读者目前不用考虑它们之间的差别,只有当我们要用到OWL自动推理功能的时候才需要考虑到底使用哪一种配置。且在大多数情况下,我们需要知道哪种配置才是最合适的。下面简单说说它们使用的场景:

  1. OWL 2/EL 使用场景:本体结构中有大量相互链接的类和属性,设计者想用自动推理机得到里面复杂的关系。

  2. OWL 2/QL 使用场景:有大量的实例数据。OWL 2 QL本体可以被改写为SQL查询,适用于使用OBDA(ontology based data access)的方式来访问关系数据库。也就是说我们不用显式地把关系数据库中的数据转为RDF,而是通过映射的方式,将数据库转为虚拟RDF图进行访问。

  3. OWL 2/RL 使用场景:需要结合基于规则的推理引擎(rule-based reasoning engine)的场合。

5 关系数据库(MySQL)转为RDF

5.1 两个标准
5.1.1 direct mapping(直接映射)

转换规则:

  1. 数据库的表作为本体中的类(Class)。比如我们在mysql中保存的数据,一共有5张表。那么通过映射后,我们的本体就有5个类了,而不是我们自己定义的三个类。

  2. 表的列作为属性(Property)。

  3. 表的行作为实例/资源。

  4. 表的单元格值为字面量。

  5. 如果单元格所在的列是外键,那么其值为IRI,或者说实体/资源。

详细的解释和示例,请参考W3C的官方文档(A Direct Mapping of Relational Data to RDF)。

5.1.2 R2RML

详细的语法规则参考W3C的文档(R2RML: RDB to RDF Mapping Language)。

我们以mysql中的数据为例,介绍怎么把person这个表映射到我们在protege中定义的Person类上,person_name映射到personName上。

@prefix rr: .
@prefix : .

<#TriplesMap1>
    rr:logicalTable [ rr:tableName "person" ];
    rr:subjectMap [
        rr:template "http://www.kgdemo.com/person/{person_id}";
        rr:class :Person;
    ];
    rr:predicateObjectMap [
        rr:predicate :personName;
        rr:objectMap [ rr:column "person_name" ];
    ].
  • rr:template:指定实体/资源的IRI生成模板,括号中的字符串是对应表中的某个列名。在本例中指每个人物的IRI由我们预定义的前缀加人物ID组成。
  • rr:Class:声明这些实体/资源的类是我们在Ontology中定义的Person。
  • rr:predicate:指定谓语,即属性。
  • rr:objectMap:指定该属性的值是来源于哪一列。

R2RML也支持SQL语句来对查询结果进行映射。比如,我们有一列表示某人的性别,我们可以用SQL语句选取男性的行,把这些行映射成我们定义的男性类。女性同理。这种特性大大增强了其灵活性。

5.2 D2RQ工具

关键点:修改 mapping文件 ,结合自己定义的本体 Ontology ,将数据转化为RDF

换个说法,D2RQ把SPARQL查询,按照mapping文件,翻译成SQL语句完成最终的查询,然后把结果返回给用户

把mysql的数据转为RDF 。详细的语法规则参考相关文档(The D2RQ Mapping Language)。

D2RQ支持的数据库有Oracle、MySQL、PostgreSQL、SQL Server、HSQLDB、Interbase/Firebird。参考数据库兼容性说明(Accessing Relational Databases as Virtual RDF Graphs)。

6 SPARQL查询语言

全称 SPARQL Protocol and RDF Query Language ,用于 访问和操作RDF数据。

6.1 组成

从SPARQL的全称我们可以知道,其由两个部分组成:协议和查询语言

  1. 查询语言很好理解,就像SQL用于查询关系数据库中的数据,XQuery用于查询XML数据,SPARQL用于查询RDF数据。

  2. 协议是指我们可以通过 HTTP协议客户端和SPARQL服务器(SPARQL endpoint) 之间传输查询和结果,这也是和其他查询语言最大的区别。

一个SPARQL查询本质上是一个带有变量的RDF图,以我们之前提到的罗纳尔多RDF数据为例:

  "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.

我们把属性值用变量代替(SPARQL中,用 问号加变量名 的方式来表示一个变量。),即:

  ?x.

SPARQL查询是基于图匹配的思想。我们把上述的查询与RDF图进行匹配,找到符合该匹配模式的所有子图,最后得到变量的值。就上面这个例子而言,在RDF图中找到匹配的子图后,将"罗纳尔多·路易斯·纳萨里奥·德·利马"和“?x”绑定,我们就得到最后的结果。

6.2 步骤

简而言之,SPARQL查询分为三个步骤

  1. 构建查询图模式,表现形式就是带有变量的RDF。

  2. 匹配,匹配到符合指定图模式的子图。

  3. 绑定,将结果绑定到查询图模式对应的变量上。

SPARQL更详细的语法和功能这里就不再多做介绍。读者可以参考W3C的文档或者SPARQL查询的例子,也有专门的书来讲解SPARQL 1.1(Learning SPARQL: Querying and Updating with SPARQL 1.1)

6.3 例子

以实践篇的RDF电影数据为例,我们介绍如何利用SPARQL查询:

  1. 所有的RDF三元组。

  2. 周星驰出演了哪些电影?

  3. 英雄这部电影有哪些演员参演?

  4. 巩俐参演的评分大于7的电影有哪些?

  • 查询所有数据:

参照我们在第一个部分介绍的查询过程,查询所有数据即我们没有任何已知值,SPO三元组每个都是未知变量。对应的SPARQL查询语言为:

PREFIX : 
PREFIX rdf: 
PREFIX owl: 
PREFIX xsd: 
PREFIX vocab: 
PREFIX rdfs: 
PREFIX map: 
PREFIX db: 

SELECT * WHERE {
  ?s ?p ?o
}

SPARQL的部分关键词:

  • SELECT, 指定我们要查询的变量。在这里我们查询所有的变量,用*代替。
  • WHERE,指定我们要查询的图模式。含义上和SQL的WHERE没有区别。
  • FROM,指定查询的RDF数据集。我们这里只有一个图,因此省去了FROM关键词。
  • PREFIX,用于IRI的缩写。

下面是该语句的部分查询结果:

       s                   p             o

db:genre/12 [http]	:genreName	"冒险"
db:genre/12 [http]	rdf:type	:Genre
db:genre/14 [http]	:genreName	"奇幻"
db:genre/14 [http]	rdf:type	:Genre
db:genre/16 [http]	:genreName	"动画"
db:genre/16 [http]	rdf:type	:Genre
db:genre/18 [http]	:genreName 	"剧情"
db:genre/18 [http]	rdf:type	:Genre
db:genre/27 [http]	:genreName	"恐怖"
db:genre/27 [http]	rdf:type    :Genre
  • “周星驰出演了哪些电影”:
PREFIX : 
PREFIX rdf: 
PREFIX owl: 
PREFIX xsd: 
PREFIX vocab: 
PREFIX rdfs: 
PREFIX map: 
PREFIX db: 

SELECT ?n WHERE {
  ?s rdf:type :Person.
  ?s :personName '周星驰'.
  ?s :hasActedIn ?o.
  ?o :movieTitle ?n
}

部分结果:

n

"功夫"
"琉璃樽"
"英雄本色"
"少林足球"
"西游记第壹佰零壹回之月光宝盒"
"长江七号"
"西游记大结局之仙履奇缘"
"建国大业"
"审死官"
"龙在天涯"
"大内密探零零发"

就我们这个例子而言,可以不要“?s rdf:type :Person”,这里只是让查询图更具体(在拥有复杂关系的RDF图中,可能会存在不同的类拥有相同的属性名。比如,猫和狗名字的属性名都是"name",我们想查询一只叫汤姆的猫;如果不指定类型,返回结果可能也包含一只叫汤姆的狗)。图模式中,每个RDF用英文句号进行分割。

  • “英雄这部电影有哪些演员参演”:
PREFIX : 
PREFIX rdf: 
PREFIX owl: 
PREFIX xsd: 
PREFIX vocab: 
PREFIX rdfs: 
PREFIX map: 
PREFIX db: 

SELECT ?n WHERE {
  ?s rdf:type :Movie.
  ?s :movieTitle '英雄'.
  ?a :hasActedIn ?s.
  ?a :personName ?n
}

结果:

n

"李连杰"
"梁朝伟"
"张曼玉"
"章子怡"
"甄子丹"
  • “巩俐参演的评分大于7的电影有哪些”:
PREFIX : 
PREFIX rdf: 
PREFIX owl: 
PREFIX xsd: 
PREFIX vocab: 
PREFIX rdfs: 
PREFIX map: 
PREFIX db: 

SELECT ?n WHERE {
  ?s rdf:type :Person.
  ?s :personName '巩俐'.
  ?s :hasActedIn ?o.
  ?o :movieTitle ?n.
  ?o :movieRating ?r.
FILTER (?r >= 7)
}

结果:

n

"2046"
"Memoirs of a Geisha"
"荆轲刺秦王"
"大红灯笼高高挂"
"霸王别姬"
"活着"
"唐伯虎点秋香"
"秋菊打官司"
"菊豆"
"Hong gao liang"
"画魂"
"风月"
"Piao Liang Ma Ma"
"The Hand"

这里我们用到了FILTER关键词,可以对变量取值进行约束。

7 Apache Jena

Apache Jena(后文简称Jena),是一个开源的Java语义网框架(open source Semantic Web Framework for Java),用于构建语义网和链接数据应用。

区别:

  • Apache Jena 开启SPARQL endpoint服务

  • D2RQ开启SPARQL endpoint服务

你可能感兴趣的:(知识图谱)