6.2.4.1 Neo4j图数据库特征
Neo4j是一个开源的图数据库[127],经过专门优化,可以映射、分析、存储和遍历连接数据的网络,以显示不可见的上下文和隐藏的关系。通过直观地映射数据点和它们之间的连接,Neo4j为智能的实时应用程序提供支持,并且具备数据库事务正确执行的四个基本要素:ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。不管是与关系型数据库相比,还是与其他NoSQL数据库相比,Neo4j都有诸多优势,表现为高性能查询、灵活性设计和敏捷性开发等。
(1)高性能查询:Neo4j作为原生的图数据库引擎,它利用了图结构的自然扩展特性设计了免索引的邻接节点遍历算法,即从一个节点开始,根据连接关系,快速找出它的邻接节点,具有比传统RDBMS高几十倍的查询性能,而且查询速度不会因数据量的增长而下降。
(2)灵活性设计:通常业务需求会随着时间和条件的改变而发生变化,关系数据库很难适应这种变化。图数据结构可以自然延伸,并且Neo4j无结构模式Schema定义,具有很好的伸缩性和灵活性。随着需求的变化而增加的节点、关系以及属性对现有的图数据结构影响较小。
(3)敏捷性开发:图数据库数据模型设计直观明了,业务需求和实现结果之间关系清晰,适合以测试驱动的方法应用于系统设计和开发过程之中,并通过迭代来完善数据模型设计。
此外Neo4j作为一个独立的服务器程序,客户端可以用Java或Python语言通过REST API来进行访问并操作数据库。Neo4j的强大之处还在于提供了一种类似于SQL的Cypher语言来进行数据的增删改查。
6.2.4.2 Python通过py2neo模块操作Neo4j构建知识图谱
本文在“知识抽取”这一小节阐述了用网络爬虫从“中检溯源”抓取数据并保存成JSON文件的过程。在此基础上,我们进一步使用Python语言并基于Neo4j图数据库,构建了食品安全追溯网络知识图谱。
要通过python来操作Neo4j,首先需要安装py2neo,可以直接使用pip安装。
在完成安装之后,从py2neo模块引入Graph、Node、Relationship程序包,设置好对Neo4j图数据库的连接参数,建立图对象g。
表6.5 Python中对Neo4j数据库的连接设置
Neo4j的服务器装好了之后,默认的端口号就是7474,host是服务器的IP地址。(www.xing528.com)
6.2.4.3 节点的建立
节点的建立要用到py2neo.Node,建立节点的时候要定义它的节点类型(label)以及一个基本属性(property,包括property_key和property_value)。
以下代码建立了产品、原产国、生产商、发证机构、物流单元、检测实验室6类图谱节点。
表6.6 建立知识图谱节点的Python代码片段(详见附录3)
6.2.4.4 节点间关系的建立
节点间的关系(Relationship)是有向的,在建立关系的时候,必须定义一个起始节点和一个结束节点。如果起始节点和结束节点是同一个点,其关系就是这个点指向它自己。
下面是Python中用py2neo模块建立原产国、生产商、发证机构、检测实验室、物流信息和物流顺序6类图谱关系的代码。由代码可见,关系也是可以包含属性的,比如“物流信息”就有“产品代码、日期、物流单元”等属性。需要注意的是,此处除了建立起了每种产品的物流单元的“物流信息”关系以外,还建立了“物流顺序”关系,以表示物流的前后关系。
表6.7 构建知识图谱节点关系的Python代码片断(详见附录3)
构建食品安全网络知识图谱完整的源代码在附录4中列示。
建立的知识图谱如下所示。该图的第1行用不同的颜色显示了6类实体节点名称,第2行显示的是知识图谱的关系类型,此处也是6种关系,主界面显示的是各类实体之间的网络关系,图的底部是当前选择的对象(实体或关系)的属性值(此处列出了实体“派诺儿童调制乳粉”的各个属性和相应的取值)。
图6.7 食品安全网络知识图谱
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。