基于Neo4J的人物事件关系知识图谱构建研究

2022-05-30 10:48桑丽丽朱晗
电脑知识与技术 2022年22期
关键词:知识图谱

桑丽丽 朱晗

摘要:文章研究如何使用Neo4J图数据库技术对人物事件关系进行有效数字化存储和查询。首先,通过與传统关系型数据库对比,分析了Neo4J数据库在复杂关系存储和查询方面的优势,然后以“常州三杰”为例,分析了人物事件关系知识图谱中的五大实体类型及其相互关系类型。在此基础上分析了如何借助Py2neo和Pandas库对“常州三杰”知识图谱进行自动化的构建并存储到Neo4J数据库中,最后分析了如何对存储在Neo4J的知识图谱进行有效的数据查询。

关键词:知识图谱;人物事件关系;Neo4J

中图分类号:TP311.52      文献标识码:A

文章编号:1009-3044(2022)22-0018-03

1 引言

瞿秋白、张太雷、恽代英是出生于19世纪末的三位杰出革命青年,也是中国共产党早期的主要领导人,他们均是江苏常州籍贯,故称为“常州三杰”[1]。“常州三杰”牺牲时非常年轻,他们短暂一生中所体现的满腔爱国精神、革命奋斗精神和坚定不移的共产主义信念是当代青年的学习榜样[2]。

目前,有关“常州三杰”的革命事迹大多以图文和影视资料的形式展示,侧重于以主人翁为中心、以时间顺序为主线进行阐述。然而,“常州三杰”出生成长于相同的时代背景,彼此之间在时间和空间上存在一定程度的关联性,研究他们之间的人物事件关系可以更深入立体地感受常州三杰的革命事迹。

人物事件关系是具体人物围绕具体事件而产生的相互关系,这种人物和事物之间的相互关系可以通过知识图谱进行描述、存储并查询展示。Neo4J是当前流行的图数据库软件,它不仅仅能够支持图型数据的存储和查询,也支持使用Python等高级程序语言调用应用程序接口管理和查询图型数据,从而能够发现数据之间复杂和潜在的关系[3]。

2 基于Neo4J的图数据库简介

Neo4J图型数据库不同于传统的数据库,它没有表和字段的概念,取而代之的是实体、关系和属性。它使用明确的关系(Relationship) 来代替传统关系型数据库中表与表之间隐藏的关系,从而更容易表述现实世界中事物之间的关系[4]。在Neo4J中实体与实体之间通过明确的关系产生链接,而关系的属性和名称可以由设计者根据实际情况自由定义,没有传统关系型数据库的范式要求,因此,Neo4J数据库的模型设计也更加自由。尽管如此,在构建基于Neo4J的知识图谱之前依然有必要对图型数据库的模型进行分析,从而确保后期数据管理的规范性和一致性。

3 知识图谱中人物事件的关系分析

在领域知识获取方面,首先通过百度百科了解有关瞿秋白、张太雷、恽代议的人物履历和大事年表,然后再参考中信出版社出版的《瞿秋白年谱详编》、上海辞书出版社的《张太雷年谱新编》以及华中师范大学出版社的《恽代英年谱》,对常州三杰的革命成长历程深入对比分析。

通过对文献资料的梳理可以发现:有关历史人物事件的描述过程中主要存在五个实体,即:历史人物、历史事件、组织机构、历史文物、角色职位。其中,组织机构实体又可以细分为:学校、党派、组织、出版社等具体的形态,历史事件可以具体细分运动、事件与会议等形态。每种实体都具有不同的属性,比如历史人物具有姓名、出生日期、籍贯、人物详情等属性,而历史事件具有发生时间和发生地点等属性,组织机构也具有名称、成立时间、成立地点等属性。具体见表1。这些实体之间也存在着不同的关联关系,需要在知识图谱中描述并展示。

在“常州三杰”知识图谱的研究中,历史人物实体是指在历史事件、组织机构中与“常州三杰”关联的主要历史人物的集合。通过对文献资料的梳理,可以发现历史人物之间存在各种关联关系,这些关联关系具体可以划分为:支持、批评、反对、敌对、朋友、战友、校友、翻译、夫妻、父子、父女、母子、母女等关系。其中,有些历史人物的关系是长期固定不变的,比如:瞿秋白与张太雷之间的校友关系和朋友关系是不变化的,另外一些历史人物的关系是仅出现于某个历史时刻的[5]。因此,上述历史人物关系都需要设置关系产生的时间属性。

历史人物与历史事件之间的关系也需要在知识图谱模型中体现。这种关系是根据历史人物在历史事件中扮演的角色进行划分的。在上述实体分析中历史事件具有运动、事件、起义和会议等多种具体形态。1) 历史人物与历史运动、起义事件的关系可以划分为参加和领导两类关系。比如:与“常州三杰”相关的主要历史运动包括:五四运动、五卅运动和广州起义等,张太雷、瞿秋白与五四运动的关系是参加,张太雷与广州起义的关系是领导,瞿秋白与五卅运动之间关系也是领导。2) 历史人物与会议之间关系可以划分为参加与主持两类关系。比如瞿秋白主持了中国共产党第六次全国代表大会。

历史人物与组织机构之间的关联关系较为复杂。“常州三杰”在革命成长的过程中不断追求真理、寻求进步,积极投身到各种进步学术团体和研究会,组建了各种民主革命运动,他们在不同组织结构中担任的职务角色也会不断发生变化。因此,本文首先将涉及的学校、学会、出版机构和进步团体等在图数据模型中抽象表示为组织机构实体;对组织结构实体设置名称属性进行具体区分,还设置了成立时间、成立地点和机构介绍等属性,使得每个组织结构的实例具体明确,便于区分。另外,在历史人物和组织机构之间增加中间实体角色职位,因为历史人物主要是通过角色职位来与组织机构发生联系的。从而使历史人物与组织机构之间的复杂关系转变为历史人物与职位及组织机构与职位的两层关系。历史人物与职位之间的关系主要是任职和离职关系,而职位与组织机构之间主要是设立和撤销关系。

如果历史人物与组织机构之间是简单地创建或加入关系,那么只需要直接将两个实体进行关联,关系的名称就设置为创建或加入。比如:李大钊创建了北京大学马克思学说研究会;张太雷加入了北京大学马克思学说研究会。

如果历史人物与组织机构之间存在担任职位的关系,那么需要额外地加入职位实体。比如:有关瞿秋白在上海大学的担任过教务长的描述,在图数据模型中可以设置历史人物实体与职位实体之间是任职关系,而组织机构实体与职位实体之间就是设立关系。另一方面,历史人物在组织机构的任职是动态变化的。因此,有必要在历史人物与职位的任职、离职关系中以及组织机构与职位的设立、撤销关系中均增加时间属性,以便于描述在不同历史时期下,历史人物与组织机构的关联关系以及历史人物职位上的变化。

历史人物与历史文物之间的关系需要根据历史文物的具体形态进行划分,如果历史文物是具有内容或观点的文章或书籍,那么历史人物与此类文物之间的关系包括:创作、发表、支持、反对等。如果历史文物是一件物品,那么历史人物与此类文物之间的关系包括:创造、拥有和失去的关系,其他类型的文物与历史人物之间的关系可以简单概括为相关关系。历史人物与文物之间的关系也会因时间的推移发生改变,因此需要为历史人物与文物之间的具体关系,增加发生时间、发生地点等属性。

组织机构与历史事件之间的关系需要根据历史事件类型进行划分:如果历史事件是会议,那么组织机构与会议之间既可以是以组织机构为主导的召开关系,如中国社会主义青年团召开了共青团第三次全国代表大会;也可以是会议成立了某个组织机构。

历史事件与职位也会产生关联,而职位进一步通过与历史人物的任职关系以及职务与组织机构的设立和撤销关系,比如中共五届一中全会上选举了瞿秋白为中央政治局委员,那么这里历史事件形态是会议,它与职位之间是设置关系,历史人物与职位之间是任职关系,而组织机构与职位之间是设置关系。这样的历史事件将所有的实体关联到一起形成了关系网络图结构。

综合以上分析可以得到五大实体之间的主要关系如表2所示。可见,历史人物、历史事件、组织机构及历史文物之间是具有复杂关系的网络模型,使用传统二维表的关系型数据模型难以描述和维护,而使用基于Neo4J的图数据模型能够更直观地描述和维护。

4 基于Neo4J的“常州三杰”知识图谱构建

使用Neo4J创建的知识图谱由节点和节点之间关系构成。每个节点都具有标签(Label) 和屬性(Properties) [4]。通过上述数据模型的分析,在Neo4J数据库中添加五种类型的节点:历史人物、历史事件、组织机构、历史文物和职位。节点的Label值分别是Person、Event、Agency、Things和Role,并按照表1中的实体属性设置每个节点的属性。

Neo4J支持使用自带的Cypher查询命令语言手工添加节点,但是由于常州三杰文献资料中涉及的人物较多,完全手工添加数据不仅效率低,而且容易出错。本文借助Python程序设计的Pandas库和Py2neo库来实现对知识图谱中节点数据的自动化创建。

Pandas库是开源的结构化数据分析工具,它可以读取诸如Excel、txt、csv等多种格式的数据源,并具高性能的数据运算功能[5]。利用Pandas库的read_excel方法,传入文件名就可以很方便地读取Excel表中的数据,进入进行数据清洗和分析。

Py2neo库是Python程序访问Neo4J数据库的开源工具包,Python程序可以利用Py2neo连接到Neo4J数据库中并使用其提供的Graph对象来创建节点和关系。在Py2neo中使用Node对象构建节点,使用Relationship构建关系,使用Create方法或Merge方法来创建节点和关系。在Py2neo库中也可以使用run方法直接运行Cypher查询命令来返回查询结果,借助图数据库的索引功能,还可以提升数据的查询效率。

因此,可以借助Pandas和Py2neo库将知识图谱的创建程序化。先将文献中涉及的具体实体分类保存在Excel表格中,然后基于Python程序语言的Pandas库将Excel表格中的数据导入到DataFrame数据结构中,DataFrame数据结构是由行和列组成的二维表。再通过Py2neo库的Node对象构建节点。程序通过循环遍历DataFrame数据结构中的每一行数据,并将遍历到的数据填充到Node对象,最后通过Py2neo库的Graph对象连接到Neo4J,最后使用Create方法将Node节点添加到数据库中。

有关历史人物关系的创建:先对照将文献资料将主要的人物关系保存到Excel表格中, 然后通过Pandas库将Excel数据表读入到DataFrame结构中,通过Py2neo库的Relationship对象构建节点之间的关系。在构建节点关系之前需要先验证相关节点是否存在于数据库中,可以使用NodeMatcher对象的Match方法判断DataFrame中的起始和结束节点是否存在,只有当关系的起始和结束节点都已经存在的条件下才可以创建关系。节点间关系的创建使用Graph对象的merge方法。

上述有关历史人物节点之间的关系创建程序流程如图1所示。创建后的历史人物关系知识图谱展示效果如图2所示。其他节点,如:历史事件、组织机构、历史文物及职位在知识图谱中的创建及节点之间关系的构建,在实现算法上与历史人物及其关系的构建相似,都采用Pandas库从Excel表格中批量读取,然后使用Py2neo库批量添加到图数据库中构成知识图谱关系网络。

5 基于Neo4J的“常州三杰”知识图谱的查询

Neo4J不仅支持对知识图谱数据的构建,还能够对知识图谱中的数据节点和节点之间的关系进行高效率查询。不同于传统的关系型数据库低效率的表连接查询,在Neo4J内部使用Cypher命令既可以查询节点之间的直接关系,也可以查询节点之间的间接关系。并且可以设置查询关系的方向[4]。这种关系的查询可以跨越多个节点,从而能够有效发现节点之间的潜在关系。

通过命令:match (p1:person)-[r1:'创建']->(a1:agency)<-[r2: '加入']-(p2:person) return p1,p2,a1 可以查找到历史人物p2加入由历史人物p1创建的组织机构a1中的关联关系,从而发现历史人物p1与p2之间的潜在关系。在“常州三杰”知识图谱中,上述命令就可以查询到瞿秋白曾经加入邓中夏和于佑任等人创建的上海大学,以及瞿秋白和邓中夏都加入由李大钊创建的北京大学马克思主义学说研究会。

借助Py2neo库可以将基于Cypher命令的手工查询步骤程序化,从而使前端用户发送查询需求后,经过Python语言的分析和处理,返回查询结果的效果。Py2neo库中提供了两种查询方案:

第一种方案是使用matching包中的NodeMatcher类和RelationshipMatcher类,前者用于节点查询后者用于关系查询,这两个类都是用match方法来查找符合调节的节点或关系。

第二方案是直接使用Graph类的run方法,该方法接收Cypher查询命令,将查询命令传递给Neo4J数据库,并将查询结果进行封装后返回给程序。Python程序得通过data()方法将查询结果转换为元素为字典类型的列表,也可以通过to_data_frame()将查询结果转为Pandas库的DataFrame结构进行数据处理。例如程序:graph.run("match(a:person{name:'张太雷'})-[r]->(b:person) return a,r,b").data() 返回的结果是与张太雷相关的人物及其关系的列表集合。

6 结束语

综上所述,历史人物事件的相互关系错综复杂,使用传统的关系型数据库无法完整描述,也无法实现对数据的有效管理和查询。Neo4J图型数据库非常适合此类复杂关系的存储和查询。并且借助Python程序设计语言的Py2neo库以及Pandas库可以实现存储和查询的程序自动化。在对历史人物事件的领域建模过程中,本文主要依据常州三杰的有关文献,为知识图谱设置了五个实体:历史人物、历史事件、组织机构、历史文物和职位,并分析了五个实体之间的相互关系,为图数据模型中節点的类型及关系的类型奠定了基础,保证了节点和关系数据类型的一致性。

参考文献:

[1] 沈建钢.“常州三杰”精神研究[J].常州工学院学报(社科版),2011,29(3):1-6.

[2] 曹祖平.弘扬“常州三杰”精神的历史使命和意义[J].企业导报,2011(16):244-245.

[3] 张帜.Neo4j权威指南[M].北京:清华大学出版社,2017.

[4] 陈韶健.Neo4j全栈开发[M].北京:电子工业出版社,2017.

[5] 丁洪丽.基于Neo4j图数据库的人员关系挖掘[J].电讯技术,2020,60(7):771-777.

【通联编辑:谢媛媛】

猜你喜欢
知识图谱
国内酒店品牌管理研究进展的可视化分析
从《ET&S》与《电化教育研究》对比分析中管窥教育技术发展