neo4j介绍

438 阅读5分钟

这是我参与更文挑战的第12天,活动详情查看: 更文挑战

基本概念

neo4j是一个高性能的nosql图形数据库,将结构化数据存储在网络(图)上而不是表中。是一个基于磁盘的,具备完全的事务特性的java持久化引擎。

  • Neo4j是一个图形数据库,这也就意味着它的数据并非保存在表或集合中,而是保存为节点以及节点之间的关系里。
  • 节点为一个数据实体,可以为节点设置零或多个标签
  • 关系定义节点之间如何关联,每个关系都对应一种类型
  • 关系总是从一个节点指向另一个节点
  • 可在节点和关系中存储属性信息

neo4j 特性 节点易于添加关系 节点易于添加属性 关系也可以有属性 换成关系型数据库就需要设计很多关系表 节点属于某个类,相当于关系型中记录数据某个表

Neo4j是:

  1. 一个开源
  2. 无Schema
  3. Cypher进行类似Sql操作
  4. 基于Java开发,运行于JVM之上

显著特点:

  • 完整的ACID支持
  • 高可用性
  • 轻易扩展到上亿级别的节点和关系
  • 通过遍历工具高速检索数据

图数据库和关系数据库对比

  1. 关系数据库是通过外键约束来实现两表或多个表的相互引用关系,这种操作是“计算密集型的”。如果使用多对多关系,必须添加中间表用来保存两个参与表的外键对应关系,增加了连接成本。
  2. 在图数据库中,关系是最重要的元素。每个节点都直接包含一个关系列表,关系列表存放此节点与其他节点的关系记录。这些关系记录按类型和方向组织起来,并且可以保存附加属性。
  3. 各节点通过关系指向来表达节点间复杂关系,更加简洁明确描述关系。

图数据库和其他nosql对比

  1. 大部分nosql数据库的数据存储形式都是基于集合。nosql数据存储在不连贯的集合中使得数据之间相互连接,建立关系困难。通常是将某个数据集合直接嵌入到另外一个集合实现从属关系。
  2. 键值存储数据库,适合不涉及过多数据关系的应用,因为能有效减少读写磁盘的次数,所以其性能非常高。将这些键值对相互关联形成一个图结构,来表达数据之间复杂关系。

图形数据库的特性 高性能:每个查询的执行时间只与为满足该查询而遍历的图形部分的大小成比例,而不是与整个图形的大小成比例 灵活性:不必提前详尽地建模,应对不断变化的业务需求 敏捷性:对比关系数据库,图形数据库开发更符合今天的敏捷和测试驱动的软件开发实践,允许图形数据库支持的应用程序将随着业务环境的变化而发展 为什么选择图形数据库:关系型,nosql数据库都没有模型直接的关系 关系型数据库建模的缺点:它滞后于业务的发展 建模过程:识别出节点和关系,不要把实体编码为关系 构建基于图形数据库的应用程序: 建模: 按业务需求描述模型,用节点表示物体,关系表示结构,把握好颗粒度,事实,复杂值都是节点 架构: 嵌入式,服务器部署都可以,基于jvm 支持集群 负债均衡(基于集群) 测试: 测试驱动的方式开发数据模型 性能测试 容量规划:对硬件的采购要求 数据导入:支持csv格式 图形数据库现状 普通用例:社交,推荐系统,地理信息系统,主数据管理,网络和it管理,鉴权 图论预测分析:基于图形数据的预测

neo4j体系结构

  • 免索引邻接

    用来保证关系查询的速度。每个节点都会维护和他相邻节点的引用,相当于与它相邻节点的微索引,比使用全局索引的代价小得多。意味着查询时间与图的规模无关,只与附近节点数量有关。关系数据库使用全局索引连接各个节点,这些索引对每个遍历增加一个中间层,导致非常大的计算成本。

  • 存储结构

    宏观角度:neo4j只有两种数据类型

    节点:每个节点可以有0个或多个属性,键值对存储,同时每个节点还有相应的标签用来区分不同类型的节点。

    关系:一个关系有起始节点和终止节点,关系也能有自己的属性和标签。

    节点和关系分别采用国定长度存储,节点(9字节),关系(33字节),属性的存储记录也是固定长度,每个属性记录包含4个属性块和属性链中下一个属性的id,属性链是单向链表。属性索引文件主要存放属性的名称。分别都有对应db文件。

    Neo4j中有两种动态存储:动态字符串存储和动态数组存储。动态存储记录是可以扩展的,如果一个属性长到一个动态存储记录无法存储时,可申请多个存储记录逻辑上进行连接

    neo4j的遍历

    每个节点记录都包含一个指向该节点第一个属性的指针和联系链中第一个联系的指针。

    通过固定大小的存储记录和指针ID,只要跟随指针就可以简单实现遍历并且高速执行,要遍历一个节点到另一个节点的特定关系,只需要便来几个指针,执行一些低成本的id运算。

优缺点:

数据直观(避免了关系数据库的关联查询),查询速度快(与表大小无关只与节点附近节点数有关) 插入太慢