最近我在尝试存储知识图谱的过程中,对Neo4j图数据库有了一个新的认知,这里我摘取了一段Neo4j的简介:
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
我开始着手把三元组数据存储进neo4j的数据库中,用的是python的py2neo库,我的思路是:读取文件,将每行的实体抽取出来,在图中查找是否有该(两个)实体节点,如果不存在就插入节点用的刚刚开始是cypher语句的create后来是merge,目的是在数据写入之前去重。然后插入该行三元组表示的边(用的create unique)。是在安装在自己电脑上的Neo4j 运行操作。
后来为了方便其他同事可以使用数据需要找到公司运维帮忙在服务器上开通运行neo4j,还是用的之前的方法和思路写数据。但是需要安装neo4j-driver这个库来运行。
但是这样做的效率很低,因为现有数据量是457万多的三元组集合至少连续半个多月才能存完。我分析了一下,原因在于:每次插入实体节点都需要先查询图中是否存在该实体节点,随着图的增大,查询所需的时延也越来越长。前面大部分时间做铺垫了。留给我的时间就只有从10月28号开始操作了。
在查了官方文档以后,我发现一个高效率的导入数据的方法–neo4j的import工具。后面在苏杭西子的帮助下完成如下的工作(下面有几个neo4j 写入数据方法对比图)