Neo4j - Neo4j概述

Posted ゞ浪人与酒丶0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Neo4j - Neo4j概述相关的知识,希望对你有一定的参考价值。

Neo4j - Neo4j概述

Neo4j是由 Java 实现的开源 NoSQL 图数据库。Neo4j实现了专业数据库级别的图数据模型的存储。与普通的图处理或内存数据库不同,Neo4j 提供了完整的数据库特性,包括 ACID 事务的支持、集群支持、备份与故障转移等,这使其适合于企业级生产环境下各种应用。

Neo4j 还提供了一些特殊的功能

  • 一个本地化的图数据库:Neo4j 自底向上构建成一个图数据库。它的体系结构旨在优化快速管理、存储和遍历节点和关系。在 Neo4j 中,关系是数据库中最重要的元素,它代表节点之间的相互联系。众所周知,在关系数据库领域中,"关系"适用于多个不同表之间的连接操作,这种操作的性能下降与关系的数量呈指数级别的,但在 Neo4j 中则是用于从一个几点指向另一个节点,其性能却是线性级别的
  • 界面友好:提供了查询与展示的 Web 操作界面。对于图数据模型使用 D3.js 做数据可视化,形象地展示了数据模型的节点和关系
  • 声明式图查询语言:Cypher 是一种声明式图数据库查询语言,它表现力丰富,查询效率高,其地位和作用域关系型数据库中的 SQL 类似,Cypher 还有良好的扩展性,用户可以定制自己的查询方式(如自定义过程)
  • ACID事务:Neo4j 通过 ACID 事务提供真正的数据安全, Neo4j 使用事务来保证输在硬件故障或系统奔溃的情况下不会丢失。
  • 高性能:Neo4j 使用多副本主从复制的方式构建高可靠集群,支持大数据集合并且可以不断扩展其容量,可存储数百万亿个实体,提供了可容错、可扩展的集群,此外Neo4j还提供热备份和性能监控功能
  • 代码开源:Neo4j 将源码公布到GitHub

体系结构

揭开 Neo4j 所采用什么样的体系结构

Neo4j 最初的设计动机是为了更好地描述实体之间的联系。现实生活中,每个实体都与周围的其他实体有千丝万缕的关系,这些关系里存在着大量的潜在信息。但是传统的关系型数据库更加注重刻画实体内部属性,实体与实体之间关系通过外键来实现,因此需要大量的 join 操作,而 join 操作通常又非常耗时。随着现实世界中关系的急剧增加,导致关系型数据库已经逐渐地难以承载查询海量数据深层次关系需要大量数据库操作带来复杂性,Neo4j 在这种情况应运而生

免索引邻接

Neo4j 有一个重要的特点,就是用来保证关系查询的速度,既免索引邻接,数据库中每个节点都会维护与它相邻节点的引用。因此每个节点都相当于与它相邻节点的微索引,这比使用全局索引的代价要小很多。这就意味着查询时间和图的整体规模无关,只与它附近节点的数量成正比。在关系型数据库中使用全局索引连接各个节点,这些索引每个遍历都会增加一个中间层,因此会导致非常大的计算成本。而免索引邻接为图数据库提供了快速高效的图遍历能力

对比图

  • RDBMS关系查询示意图

  • Neo4j关系查询示意图

RDBMS 关系图要查找 Alice 所购买的东西,首先要执行关系表索引查询,时间成本 O(log(n)),n 为索引表的长度。这对于偶尔的浅层次查询是可以接受的,但是当查询的层次变深或者是执行反向查询时代码将变得不可接受。

Neo4j关系图使用了免索引近邻机制,每个节点都有直接或简介指向其相邻节点的指针。要查找 Alice 买过的东西,只需要在Alice 的关系链表中遍历,每次遍历成本为 O(1)

免索引邻接针对 RDBMS 中关系查询两个缺点做了改进

  • 免索引邻接使用遍历物理关系的方法查找,比起全局索引来说代价要小得多。查询一个索引一般的时间复杂度为 O(log(n)),而遍历物理关系的时间复杂度为 O(1),至少对于Neo4j的存储结构来说是如此
  • 当索引建立之后在试图反向遍历时,建立的索引就起不到作用了。我们两个选择:对每个反向遍历的场景创建反向查找索引,或者使用原索引进行暴力搜索,而暴力搜索的时间复杂度为O(n)。这种代价相对于很多需要实时操作的场景来说不可接受的

利用免索引邻接机制,在图数据库上进行关系查找效率非常高,这种高效是建立在图数据库注重关系的架构设计之上的。

基本元素与概念

节点

节点(Node)是图数据库中的一个基本元素,用以表示一个实体记录,就像关系数据库中的一条记录一样。在 Neo4j 中节点可以包含多个属性(Property)和多个标签(Label)

这是一个最简单的节点,它只有一个属性,属性名是 name , 属性值是 Tom

关系

关系(Relationship)同样是图数据库中的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也成为图论的边(Edge), 其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,单关系只能有一个类型(Type)

一个节点可以被多个关系指向或作为关系的起始关系

多个关系指向同一个节点

关系必须有开始节点(Start node) 和结束节点(End node),两头都不能为空

由于关系是有方向的,所以可在由几点、关系组成的图中进行遍历

属性

上面提到节点和关系都可以有多个属性。属性是有键值对组成的,就像 Java 的哈希表咿呀,属性名类似变量名,属性值类似变量值。属性值可以是基本的数据类型,或者由基本数据类型组成的数组

路径

当是有节点和关系创建一个图后,在此图中任意两个几点间都是可能存在路径的

任意两节点都存在由节点和关系组成的路径,路径也有长度的概念,也就是路径中关系的条数,当然也可以说单独一个节点就可以组成长度为0的路径

遍历

遍历一张图就是按照一定规则,根据它们之间的关系,依次访问是有相关联的节点的操作。

对于遍历操作不必自己实现,因为 Neo4j 提供了一套高效的遍历 API ,可以指定遍历规则,然后让 Neo4j 自动按照遍历规则遍历并返回遍历的结果。遍历规则可以是广度优先,也可以是深度优先

Hive入门概述

参考技术A 1.1 什么是Hive

Hive:由Facebook开源用于解决海量结构化日志的数据统计。

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。本质是:将HQL转化成MapReduce程序

Hive处理的数据存储在HDFS

Hive分析数据底层的实现是MapReduce

执行程序运行在Yarn上

1.2 Hive的优缺点

1.2.1 优点

操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。

避免了去写MapReduce,减少开发人员的学习成本。

Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。

Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。

Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

1.2.2 缺点

1.Hive的HQL表达能力有限

(1)迭代式算法无法表达

(2)数据挖掘方面不擅长

2.Hive的效率比较低

(1)Hive自动生成的MapReduce作业,通常情况下不够智能化

(2)Hive调优比较困难,粒度较粗

1.3 Hive架构原理

1.用户接口:Client

CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)

2.元数据:Metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的derby数据库中,推荐使用MySQL替代derby存储Metastore

3.Hadoop

使用HDFS进行存储,使用MapReduce进行计算。

4.驱动器:Driver

(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。

(3)优化器(Query Optimizer):对逻辑执行计划进行优化。

(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

1.4 Hive和数据库比较

由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。本文将从多个方面来阐述 Hive 和数据库的差异。数据库可以用在 Online 的应用中,但是Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性。

1.4.1 查询语言

由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。

1.4.2 数据存储位置

Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。

1.4.3 数据更新

由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET修改数据。

1.4.4 索引

Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。

1.4.5 执行

Hive中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的。而数据库通常有自己的执行引擎。

1.4.6 执行延迟

Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce框架。由于MapReduce 本身具有较高的延迟,因此在利用MapReduce 执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

1.4.7 可扩展性

由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的(世界上最大的Hadoop 集群在 Yahoo!,2009年的规模在4000 台节点左右)。而数据库由于 ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有100台左右。

1.4.8 数据规模

由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

以上是关于Neo4j - Neo4j概述的主要内容,如果未能解决你的问题,请参考以下文章

知识图谱现学现用(Django 2.2 + Neo4j 3.5)

图形数据库neo4j

图数据库Neo4j在GIS系统的应用

neo4j数据库迁移---------Neo4j数据库导入导出的方法

Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程

Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程