知识图谱学习笔记03 Neo4j图数据库导入数据

1. Neo4j简介

Neo4j使用图相关的概念来描述数据模型,把数据保存为图中的节点以及节点之间的关系,数据主要由三部分构成:

  • 节点:节点表示对象实例,每个节点有唯一的ID区别其他节点,节点带有属性
  • 关系:就是图里面的边,连接两个节点,另外这里的关系是有向的并带有属性
  • 属性:key-value对,存在于节点和关系中

1.1 索引

  • 通过建立索引,Neo4j可加速查询速度,根据索引找到遍历用的起始节点。
  • 在默认情况下,相关的索引由Apache Lucene提供,但也能使用其他索引实现来提供。
  • 操作:用户可以创建任意数量的命名索引,每个索引控制节点或者关系,而每个索引都通过key/value/object三个参数来工作,其中object要么是一个节点,要么是一个关系,取决于索引类型。另外,Neo4j中有关节点(关系)的索引,系统通过索引实现从属性到节点(关系)的映射。
  • 作用:
  • 查找操作:通过设定访问条件比如,遍历的方向,使用深度优先或广度优先算法等条件对图进行遍历,从一个节点沿着关系到其他节点。
  • 删除操作:Neo4j可以快速地插入删除节点和关系,并更新节点和关系中的属性

1.2 Neo4j的优势

与其他数据库相比,Neo4j的优势主要表现在查询的高性能、设计的灵活性和开发的敏捷性等。

  • 查询的高性能
    Neo4j是一个原生的图数据库引擎,它存储了原生的图数据,因此,可以使用图结构的自然伸展特性来设计免索引邻近节点遍历的查询算法,即图的遍历算法设计。图的遍历是图数据结构所具有的独特算法,即从一个节点开始,根据其连接的关系,可以快速和方便地找出它的邻近节点。这种查找是数据的方法并不受数据量的大小所影响,因为邻近查询从查找的始终是有限的局部数据,而不会对整个数据库进行搜索。所以,Neo4j具有非常高效的查询性能,相比于RDBMS,它的查询速度可以提高数倍乃至数十倍,而且查询速度不会因数据量的增长而下降,即数据库可以经久耐用,并且始终保持最初的活力。不像RDBMS那样,因为不可避免地使用了一些范式设计,所以在查询时如果需要表示一些复杂的关系,势必会构造很多连接,从而形成很多复杂的运算。并且在查询中更加可怕的是还会涉及大量数据,这些数据大多与结果毫无关系,有的可能仅仅是通过ID查找它的名称而已,所以随着数据量的增长,即使查询一小部分数据,查询也会变得越来越慢,性能日趋下降,以至于让人无法忍受。
  • 设计的灵活性
    在日新月异的互联网应用中,业务需求会随着时间和条件的改变而发生变化,这对于以往使用结构化数据的系统来说,往往很难适应这种变化的需要。图数据结构的自然伸展特性及其非结构化的数据格式,让 Neo4j的数据库设计可以具有很大的伸缩性和灵活性。因为随着需求的变化而增加的节点、关系及其属性并不会影响到原来数据的正常使用,所以使用Neo4j来设计数据库,可以更接近业务需求的变化,可以更快地赶上需求发展变化的脚步。 大多数使用关系型数据库的系统,为了应对快速变化的业务需求,往往需要采取推倒重来的方法重构整个应用系统。而这样做的成本是巨大的。使用Neo4j可以最大限度地避免这种情况发生。虽然有时候,也许是因为最初的设计考虑得太不周全,或者为了获得更好的表现力,数据库变更和迁移在所难免,但是使用Neo4j来做这项工作也是非常容易的,至少它没有模式结构定义方面的苦恼。
  • 开发的敏捷性
    图数据库设计中的数据模型,从需求的讨论开始,到程序开发和实现,以及最终保存在数据库中的样子,直观明了,似乎没有什么变化,甚至可以说本来就是一模一样的。这说明,业务需求与系统设计之间可以拉近距离,需求和实现结果之间越来越接近。这不但降低了业务人员与设计人员之间的沟通成本,也使得开发更加容易迭代,并且非常适合使用敏捷开发方法。
    Neo4j本身可伸缩的设计灵活性,以及直观明了的数据模型设计,以及其自身简单易用的特点等,所有这些优势都充分说明,使用Neo4j很适合以一种测试驱动的方法应用于系统设计和开发自始至终的过程之中,通过迭代来加深对需求的理解,并通过迭代来完善数据模型设计。
  • 与其他数据库的比较
    在图数据库领域,除Neo4j外,还有其他如OrientDB、Giraph、AllegroGraph等各种图数据库。与所有这些图数据库相比,Neo4j的优势表现在以下两个方面。
    (1)Neo4j是一个原生图计算引擎,它存储和使用的数据自始至终都是使用原生的图结构数据进行处理的,不像有些图数据库,只是在计算处理时使用了图数据库,而在存储时还将数据保存在关系型数据库中。
    (2)Neo4j是一个开源的数据库,其开源的社区版吸引了众多第三方的使用,如源项目Spring Data Neo4j就是一个做得很不错的例子,同时也得到了更多开发者的拥趸和支持,聚集了丰富的可供交流和学习的资源与案例。这些支持、推广和大量的使用,反过来会很好地推动Neo4j的发展。
  • 综合表现
    Neo4j 查询的高性能表现、易于使用的特性及其设计的灵活性和开发的敏捷性,以及坚如磐石般的事务管理特性,都充分说明了使用Neo4j是一个不错的选择。有关它的所有优点,总结起来,主要表现在以下几个方面。
    闪电般的读/写速度,无与伦比的高性能表现;
    非结构化数据存储方式,在数据库设计上具有很大的灵活性;
    能很好地适应需求变化,并适合使用敏捷开发方法;
    很容易使用,可以用嵌入式、服务器模式、分布式模式等方式来使用数据库;
    使用简单框图就可以设计数据模型,方便建模;
    图数据的结构特点可以提供更多更优秀的算法设计;
    完全支持ACID完整的事务管理特性;
    提供分布式高可用模式,可以支持大规模的数据增长;
    数据库安全可靠,可以实时备份数据,很方便恢复数据;
    图的数据结构直观而形象地表现了现实世界的应用场景。

2 数据导入实例

2.1 Neo4j 账号密码设置

采用Github上开源的医疗数据,根据下述代码将数据导入Neo4j图数据库。
注意:url地址需要更改为浏览器上的访问地址,用户和密码默认初始都为Neo4j,如果运行代码时弹错,可能需要修改密码,这里参考 重置密码

class MedicalGraph:
        def __init__(self):
            ...
            self.graph = Graph("http://localhost:7474", username="neo4j", password="自己的")
            ...

2.2 导入数据

运行参考链接中的buid_graph.py文件。注意:由于数据量较大,该程序可能需要几个小时。

python build_graph.py

2.3 知识谱图展示

结果如下:

python neo4j Relationship 关系属性 neo4j关系属性的索引_数据


下一篇将对具体的知识图谱创建代码进行详解。