专栏首页谓之小一电影知识图谱问答(二)|生成298万条RDF三元组数据

电影知识图谱问答(二)|生成298万条RDF三元组数据

本篇文章接《电影知识图谱问答(一)|爬取豆瓣电影与书籍详细信息》,学习如何利用爬取的数据,构建知识图谱所需的三元组。主要内容包括如何从Json类型的数据,转换成RDF数据,并最终存储到Jena之中,然后利用SPARQL进行查询。

实践之前,请自主学习相关背景知识。

  • 语义网络, 语义网, 链接数据, 知识图谱是什么。
  • RDF, RDFS, OWL, Protege, 本体构建。
  • MySQL数据库, pymysql。
  • D2rq, Jena, fuseki, SPARQL。

1.数据清洗

  • 电影信息包括电影id、图片链接、名称、导演名称、编剧名称、主演名称、类型、制片国家、语言、上映日期、片长、季数、其他名称、剧情简介、评分、评分人数,共67245条数据信息。虽说是电影信息,但其中也包括电视剧、综艺、动漫、纪录片、短片。
  • 电影演员信息包括演员id、姓名、图片链接、性别、星座、出生日期、出生地、职业、更多中文名、更多外文名、家庭成员、简介,共89592条数据信息。这里所指的演员包括电影演员、编剧、导演。
  • 书籍信息包括书籍id、图片链接、姓名、子标题、原作名称、作者、译者、出版社、出版年份、页数、价格、内容简介、目录简介、评分、评分人数,共64321条数据信息。
  • 书籍作者信息包括作者id,姓名、图片链接、性别、出生日期、国家、更多中文名、更多外文名、简介,共6231条数据信息。这里作者包括书籍作者和译者。

上述为我们爬取的数据类别,但数据有很多噪音,比如中文电影名称会外接英文电影名称、某些类型数据严重缺失、数据格式不统一等等,这就需要我们根据具体数据进行具体分析。此处需要多搬搬砖,没什么技术,不多讲。

2. Json2MySQL

首先我们将json类型的数据存储到MySQL之中,这里共构建了13个表,包含

  • movie_genre: 包含movie_genre_id, movie_genre_name属性,表示movie类别信息。
  • movie_info: 包含movie_info_id, movie_info_name, movie_info_image_url, movie_info_country, movie_info_language, movie_info_pubdate, movie_info_duration, movie_info_other_name, movie_info_summary, movie_info_rating, movie_info_review_count属性,表示movie信息。
  • movie_person: 包含movie_person_id, movie_person_name, movie_person_image_url, movie_person_gender, movie_person_constellation, movie_person_birthday, movie_person_birthplace, movie_person_profession, movie_person_other_name, movie_person_introduction属性,表示movie_person信息。
  • movie_to_gender: 包含movie_info_id, movie_genre_id属性,设置两个外键,分别关联到movie_info表和movie_genre表,表示movie到genre的关联。
  • actor_to_movie: 包含movie_info_id, movie_actor_id属性,设置两个外键,分别关联到movie_info表和movie_person表,表示movie到actor的关联。
  • writer_to_movie: 包含movie_info_id, movie_writer_id,设置两个外键,分别关联到movie_info表和movie_person表,表示movie到writer的关联。
  • director_to_movie: 包含movie_info_id, movie_director_id,设置两个外键,分别关联到movie_info表和movie_person表,表示movie到director的关联。
  • 同理,根据图书信息构建book_genre, book_info, book_person_info, book_to_genre, author_to_book, translator_to_book表。

表构建好之后,利用pymysql将Json类型数据导入到MySQL之中。

3. RDB2RDF

我们已经将Json类型的数据导入到关系型数据库RDB之中,现在问题是怎么将RDB Data转换成RDF。转换之前,我们先根据数据构建本体。

3.1 本体构建

什么是本体?本体有点哲学的含义,在计算机领域,可以理解为一种模型,用于描述由一套对象类型(概念或者说类)属性以及关系类型所构成的世界。此处我们使用Protege进行本体建模。

首先下载protege,下载链接为https://protege.stanford.edu/。安装完成之后,新建class,如果没有的话,在window->Tabs->Classes寻找。根据MySQL之中构建的表,此处构建相应的类,如下所示。红色箭头表示的是构建子类,右边图标指的是构建兄弟类,最右边指的是删除当前类。

类构建完成之后,进行构建对象属性,共包含

  • has_movie_genre: domains为movie_info, ranges为movie_genre,表示某电影有某类别。
  • has_book_genre: domains为book_info, ranges为book_genre,表示某书籍有某类别。
  • has_actor: domains为movie_info, ranges为movie_actor,表示某电影有某演员。和has_acted_in为互逆关系。
  • has_acted_in: domains为movie_actor, ranges为movie_info,表示某演员出演了某电影。和has_actor为互逆关系。
  • 同理has_writer, has_writed_in, has_director, has_directed_in, has_author, has_authored_in, has_translator, has_translator_in构建方法相同。

对象属性构建完成之后,进行构建数据属性。数据属性构建比较简单,指明数据类别和值类别即可。

构建完成之后,可以通过OntoGrap看到关系图。可以去window->Tabs->OntoGrap寻找OntoGrap。

最后通过File->Save as保存成Turtle Syntax形式,命名为douban_kgqa_ontology.owl

3.2 D2RQ

RDB转换成RDF有两种方式,一是direct mapping,即直接映射。规则为

  • 数据库的表作为本体中的类(Class)。
  • 表的列作为属性(Property)。
  • 表的行作为实例/资源。
  • 表的单元格值为字面量。
  • 如果单元格所在的列是外键,那么其值为IRI,或者说实体/资源。

但实际中,我们很少使用这种方法,因为不能把RDB中数据映射到我们定义的本体上面。因此我们采用另外一种方法,R2RDF(RDB to RDF Mapping Language),链接为https://www.w3.org/TR/r2rml/。下面我们使用D2RQ工具将RDB数据转换到RDF形式。

D2RQ提供了自己的mapping language,其形式和R2RML类似,具体语法链接为https://www.w3.org/TR/2004/REC-owl-features-20040210/。D2RQ有一个比较方便的地方,可以根据已定义的数据库自动生成预定义的mapping文件,用户可以在mapping文件上修改,把数据映射到自己的本体上。

首先下载D2RQ文件,链接为http://d2rq.org/,进入到目录之中,利用下列命令生成douban_kgqa_mapping.ttl文件。

mac, linux系统命令为

./generate-mapping -u root -p 123456 -o douban_kgqa_mapping.ttl jdbc:mysql:///douban_kgqa

windows系统命令为

generate-mapping.bat -u root -o douban_kgqa_mapping.ttl jdbc:mysql:///douban_kgqa

参数解读:root是mysql用户名,123456是root密码,douban_kgqa_mapping.ttl是输出文件名称,douban_kgqa是MySQL数据库名称。注:如果Mac用户如果提示permission denied, 可以用chmod改变访问权限,chmod 777 generate-mapping。

现在根据我们的MySQL数据库已经生成了默认的douban_kgqa_mapping.ttl文件,然后根据douban_kgqa_ontology.owl中定义的本体修改douban_kgqa_mapping.ttl文件。修改规则如下

  • idlabel属性删除,因为我们不需要这两个属性。
  • 修改类型值,将vocab:xxxx修改为我们owl文件中定义的类。例如将d2rq:class vocab: movie_genre;修改为d2rq:class :movie_genre;

3.3 D2RQ RDF

利用下列命令将数据转换成我们需要的RDF数据。

mac, linux命令为

./dump-rdf -o douban_kgqa.nt ./douban_kgqa_mapping.ttl

windows命令为

.\dump-rdf -o douban_kgqa.nt .\douban_kgqa_mapping.ttl

参数解读:douban_kgqa_mapping.ttl是我们修改后的mapping文件,其支持导出的RDF格式有TURTLE, RDF/XML, RDF/XML-ABBREV, N3, N-TRIPLE,N-TRIPLE是默认的输出格式。

利用下列命令,我们能够在http://localhost:2020/ 上进行SPARQL数据查询,有兴趣的读者可以尝试一下。

./d2r-server ./douban_kgqa_mapping.ttl

最后查看一下我们生成的RDF数据,可以看到共298万行,前10行的数据格式。其实我们爬虫只运行了两天,数据还是太少,以后有空闲时间再更新更多数据。

本文分享自微信公众号 - 谓之小一(weizhixiaoyi),作者:谓之小一

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 每周分享第2期

    这里记录我过去一周看到的新闻、故事、技术、资料等等,分享给各位。同时也欢迎各位投稿,投稿地址zhenhai.gl@gmail.com。

    小一
  • 机器学习之Apriori算法

    Apriori算法是常用于挖掘出数据关联规则的算法,能够发现事物数据库中频繁出现的数据集,这些联系构成的规则可帮助用户找出某些行为特征,以便进行企业决策。例如,...

    小一
  • 电影知识图谱问答(三)|Apache Jena知识存储及SPARQL知识检索

    上篇文章《电影知识图谱问答(二)|生成298万条RDF三元组数据》中讲到如何将爬取得到的豆瓣电影和书籍数据转换成知识图谱所需的RDF类型数据,本篇文章将介绍如何...

    小一
  • Python 实战(3):更多的页面

    现在我们网站已经有了一个简单的页面、一段简单的请求处理代码和一个简单的数据库。上次最后我剧透了下,之后将会通过豆瓣电影的 API 获取更多的电影数据。不过在此之...

    Crossin先生
  • 啤酒和尿布放在一起卖得更好?来看看这个故事背后的Apriori算法

    Apriori算法号称是十大数据挖掘算法之一,在大数据时代威风无两,哪怕是没有听说过这个算法的人,对于那个著名的啤酒与尿布的故事也耳熟能详。但遗憾的是,随着时代...

    TechFlow-承志
  • 如何让你绘制的柱状图格外与众不同?

    前些天有小伙伴在公众号里回复问如何绘制出五颜六色的柱状图,今天小编就来与大家说道说道。

    艾木樨
  • 拖后腿学徒居然也完成作业,理解RNA-seq数据分析结果

    对给定的基因组参考区域,计算比对上的read数,又称为raw count(RC),也就我通常说的相对原始的数据,是没进行任何标准化操作的数据。

    生信技能树
  • 《Pandas Cookbook》第05章 布尔索引1. 计算布尔值统计信息2. 构建多个布尔条件3. 用布尔索引过滤4. 用标签索引代替布尔索引5. 用唯一和有序索引选取6. 观察股价7. 翻译SQ

    第01章 Pandas基础 第02章 DataFrame运算 第03章 数据分析入门 第04章 选取数据子集 第05章 布尔索引 第06章 索引对齐 ...

    SeanCheney
  • MR+博物馆,带你游览北极阿拉斯加州的苔原

    VRPinea
  • CRM product搜索结果重复数据的一个解决方案

    When using approach 2 to implement POC, in X3C/504, all the product id are the s...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券