知识图谱总结(二)实践篇

(一):数据准备和本体建模
参考知乎教程:知识图谱–给AI装个大脑
1.配置环境(本机为Windows10)
(1)MYSQL数据库
(2)Nacivat数据库可视化工具
(3)从GITHUB上下载相关数据 https://github.com/SimmerChan/KG-demo-for-movie
其中包含电影数据的sql文件等文件
(4)protege软件
2.内容
数据是与电影相关的,基本统计数据如下:演员数量:505人,电影数量:4518部,电影类型:19类,人物与电影的关系:14451,电影与类型的关系:7898,演员的基本信息包括:姓名、英文名、出生日期、死亡日期、出生地、个人简介。
3.建模方法
(1)自顶向下:适用于领域知识图谱,概念范围固定可控且要求精度较高。
(2)自底向上:开放域知识图谱,内容太过复杂。
4.protege软件简单使用
使用软件建立出简单的图形模型,https://zhuanlan.zhihu.com/p/32389370中有步骤介绍。
通过对这一节的学习,加深了对知识图谱的理解,主要是各个对象之间的关系连接。我理解了Schema层的概念,以下我将举出一个例子说明:
EG.

(二)关系数据库到RDF
在这里插入图片描述
1.环境配置(承接上一步)

2.两个标准
W3C的RDB2RDF工作小组制定了两个标准,用于将关系型数据库的数据转换为RDF格式的数据。本文主要讲述用dwrq将SQL文件转化为RDF文件。
直接映射(实际很少用,因为不能映射到本体上)
(1)数据库的表作为本体中的类(Class)。
(2)表的列作为属性(Property)。
(3)表的行作为实例/资源。
(4)表的单元格值为字面量
(5)如果单元格所在的列是外键,那么其值为IRI,或者说实体/资源。
EG.以下表为movie类:
列movie_id,movie_title,movie_introduction,movie_rating,movie_release_date为属性。
每一行都是一个实例(对象)。我不太理解什么是外键
知识图谱总结(二)实践篇_第1张图片
R2RML也支持SQL语句来对查询结果进行映射。比如,我们有一列表示某人的性别,我们可以用SQL语句选取男性的行,把这些行映射成我们定义的男性类。女性同理。这种特性大大增强了其灵活性。
3.D2RQ
以虚拟RDF图的方式访问关系数据库机理就是通过mapping文件,把对RDF的查询等操作翻译成SQL语句,最终在RDB上实现对应操作。在做知识图谱项目的时候,我们可以灵活地选择数据访问方式。当对外提供服务,查询操作比较频繁的情况下,最好是将RDB的数据直接转为RDF,会节省很多SPARQL到SQL的转换时间。
(1)安装配置D2RQ
下载地址:http://d2rq.org/
知识图谱总结(二)实践篇_第2张图片
左侧Download中下载d2rq-0.9.2.zip文件,解压缩,
A.进入文件夹目录,并无启动程序,运行以下命令
generate-mapping -u root -o kg_demo_movie_mapping.ttl jdbc:mysql:///kg_demo_movie
(其中root是mysql的用户名,没有密码则不输入,-o指定输出文件路径及名称,jdbc:mysql:///kg_demo_movie 指定我们要映射的数据库,kg_demo_movie是数据库名称)
会生成一个mapping文件kg_demo_movie_mapping.ttl。其内容是(列举部分):
@prefix map: <#> .
@prefix db: <> .
@prefix vocab: .
@prefix rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# .
@prefix rdfs: http://www.w3.org/2000/01/rdf-schema# .
@prefix xsd: .
@prefix d2rq: http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1# .
@prefix jdbc: http://d2rq.org/terms/jdbc/ .

map:database a d2rq:Database;
d2rq:jdbcDriver “com.mysql.jdbc.Driver”;
d2rq:jdbcDSN “jdbc:mysql:///kg_demo_movie”;
d2rq:username “root”;
jdbc:autoReconnect “true”;
jdbc:zeroDateTimeBehavior “convertToNull”;
.

Table person

map:person a d2rq:ClassMap;
d2rq:dataStorage map:database;
d2rq:uriPattern “person/@@person.person_id@@”;
d2rq:class vocab:person;
d2rq:classDefinitionLabel “person”;
.
map:person__label a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:person;
d2rq:property rdfs:label;
d2rq:pattern “person #@@person.person_id@@”;
.
map:person_person_birth_day a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:person;
d2rq:property vocab:person_person_birth_day;
d2rq:propertyDefinitionLabel “person person_birth_day”;
d2rq:column “person.person_birth_day”;
为了表达简练,我们给本体的IRI设置一个前缀。这样
http://www.kgdemo.com#Person
就可以表达为
:Person
即为:
@prefix map: <#> .
@prefix db: <> .
@prefix vocab: .
@prefix rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# .
@prefix rdfs: http://www.w3.org/2000/01/rdf-schema# .
@prefix xsd: .
@prefix d2rq: http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1# .
@prefix jdbc: http://d2rq.org/terms/jdbc/ .
@prefix : http://www.kgdemo.com# .

map:database a d2rq:Database;
d2rq:jdbcDriver “com.mysql.jdbc.Driver”;
d2rq:jdbcDSN “jdbc:mysql:///kg_demo_movie”;
d2rq:username “root”;
jdbc:autoReconnect “true”;
jdbc:zeroDateTimeBehavior “convertToNull”;
.

Table person

map:person a d2rq:ClassMap;
d2rq:dataStorage map:database;
d2rq:uriPattern “person/@@person.person_id@@”;
d2rq:class :Person;
d2rq:classDefinitionLabel “person”;
.
map:person_person_birth_day a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:person;
d2rq:property :personBirthDay;
d2rq:propertyDefinitionLabel “person person_birth_day”;
d2rq:column “person.person_birth_day”;
.
D2RQ支持的数据库有Oracle、MySQL、PostgreSQL、SQL Server、HSQLDB、Interbase/Firebird。也支持其他某些数据库,但可能会有限制。
还是在d2rq文件夹目录中的命令框使用下面的命令将我们的数据转为RDF(即.nt文件):
.\dump-rdf.bat -o kg_demo_movie.nt .\kg_demo_movie_mapping.ttl
kg_demo_movie_mapping.ttl是我们修改后的mapping文件。其支持导出的RDF格式有“TURTLE”, “RDF/XML”, “RDF/XML-ABBREV”, “N3”, 和“N-TRIPLE”。“N-TRIPLE”是默认的输出格式。
kg_demo_movie.nt 中关于演员的片段:
http://www.kgdemo.com#hasActedIn .
kg_demo_movie.nt 中关于电影的片段:
http://www.kgdemo.com#movieRating “7.0E0”^^ .
http://www.kgdemo.com#movieIntroduction “” .
http://www.kgdemo.com#movieTitle “Mang quan gui shou” .
http://www.kgdemo.com#movieReleaseDate “1979-07-13” .
http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://www.kgdemo.com#Movie .

***RDF查询语言:SPARQL
最后一个核心技术标准——SPARQL(RDF,OWL和SPARQL称为语义网的三大核心技术)。
1.SPARQL(SPARQL Protocol and RDF Query Language)简介
从SPARQL的全称我们可以知道,其由两个部分组成:协议和查询语言。
(1)查询语言很好理解,就像SQL用于查询关系数据库中的数据,XQuery用于查询XML数据,SPARQL用于查询RDF数据。
(2) 协议是指我们可以通过HTTP协议在客户端和SPARQL服务器(SPARQL endpoint)之间传输查询和结果,这也是和其他查询语言最大的区别。
一个SPARQL查询本质上是一个带有变量的RDF图,以我们之前提到的罗纳尔多RDF数据为例:
http://www.kg.com/person/1 http://www.kg.com/ontology/chineseName “罗纳尔多·路易斯·纳萨里奥·德·利马”^^string.
我们把属性值用变量代替(SPARQL中,用问号加变量名的方式来表示一个变量。),即:
http://www.kg.com/person/1 http://www.kg.com/ontology/chineseName ?x.
SPARQL查询是基于图匹配的思想。
我们把上述的查询与RDF图进行匹配,找到符合该匹配模式的所有子图,最后得到变量的值。
就上面这个例子而言,在RDF图中找到匹配的子图后,将"罗纳尔多·路易斯·纳萨里奥·德·利马"和“?x”绑定,我们就得到最后的结果。简而言之,SPARQL查询分为三个步骤:
A构建查询图模式,表现形式就是带有变量的RDF。
B匹配,匹配到符合指定图模式的子图。
C绑定,将结果绑定到查询图模式对应的变量上。

2.例子
EG.1
所有的RDF三元组:
PREFIX : http://www.kgdemo.com#
PREFIX rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#
PREFIX owl: http://www.w3.org/2002/07/owl#
PREFIX xsd:
PREFIX vocab: http://localhost:2020/resource/vocab/
PREFIX rdfs: http://www.w3.org/2000/01/rdf-schema#
PREFIX map: http://localhost:2020/resource/#
PREFIX db: http://localhost:2020/resource/

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

EG.2
周星驰出演了哪些电影
SELECT ?n WHERE {
?s rdf:type :Person.
?s :personName ‘周星驰’.
?s :hasActedIn ?o.
?o :movieTitle ?n
}
就我们这个例子而言,可以不要“?s rdf:type :Person”,这里只是让查询图更具体(在拥有复杂关系的RDF图中,可能会存在不同的类拥有相同的属性名。比如,猫和狗名字的属性名都是"name",我们想查询一只叫汤姆的猫;如果不指定类型,返回结果可能也包含一只叫汤姆的狗)。图模式中,每个RDF用英文句号进行分割。

EG.3
英雄这部电影有哪些演员参演
SELECT ?n WHERE {
?s rdf:type :Movie.
?s :movieTitle ‘英雄’.
?a :hasActedIn ?s.
?a :personName ?n
}

EG.4
巩俐参演的评分大于7的电影有哪些
SELECT ?n WHERE {
?s rdf:type :Person.
?s :personName ‘巩俐’.
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
FILTER (?r >= 7)
}
这里我们用到了FILTER关键词,可以对变量取值进行约束。

你可能感兴趣的:(人工智能,知识图谱)