图数据库(neo4j)学习心得

什么是图?

​ 图由两个元素组成:节点、关系
​ 每一个节点代表一个实体,每一个关系代表两个节点的关联方式
图形数据库是NoSQL数据库的一种类型,它应用图形理论存储实体之间的关系信息。关系型数据库用于存储“关系型”数据的效果并不好,其查询复杂、缓慢、超出预期,而图形数据库的独特设计恰恰弥补了这个缺陷。

图数据库常用领域

1、社交网络

Facebook, Twitter,Linkedin用它来管理社交关系,实现好友推荐

2、推荐和个性化

eBay,沃尔玛使用它实现商品实时推荐,给买家更好的购物体验

3、欺诈识别

例如银行欺诈,信用卡欺诈,电子商务欺诈,保险欺诈等

4、金融领域

摩根大通,花旗和瑞银等银行在用图数据库做风控处理

5、汽车制造领域

沃尔沃,戴姆勒和丰田等顶级汽车制造商依靠图数据库推动创新制造解决方案

6、电信领域

Verizon, Orange和AT&T 等电信公司依靠图数据库来管理网络

图数据库的种类

数据库评分排行网站DB-Engines的评分截图图下:
在这里插入图片描述

Neo4j相关特性

数据模型

Neo4j被称为property graph,除了顶点(Node)和边(Relationship,其包含一个类型),还有一种重要的部分——属性。无论是顶点还是边,都可以有任意多的属性。属性的存放类似于一个hashmap,key为一个字符串,而value必须是Java基本类型、或者是基本类型数组,比如说String、int或者int[]都是合法的。

索引

Neo4j支持索引,其内部实际上通过Lucene实现。
遍历和查询遍历是图数据库中的主要查询方式,所以遍历是图数据中相当关键的一个概念。可以用两种方式来进行遍历查询:第一种是直接编写Java代码,使用Neo4j提供的traversal框架;第二种方式是使用Neo4j提供的描述型查询语言,Cypher。

图算法

Neo4j实现的三种图算法:最短路径(最少数目的关系)、Dijkstra算法(解决有向图中任意两个顶点之间的最短路径问题)以及A*算法(是解决静态路网中求解最短路最有效的方法)。

嵌入式可扩展

Neo4j是一个嵌入式,基于磁盘的,支持完整事务的Java持久化引擎,它在图像中而不是表中存储数据。Neo4j提供了大规模可扩展性,在一台机器上可以处理数十亿节点、关系、属性的图像,可以扩展到多台机器并行运行。相对于关系数据库来说,图形数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询——在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。Neo4j重点解决了拥有大量连接的传统RDBMS在查询时出现的性能衰退问题。通过围绕图形进行数据建模,Neo4j会以相同的速度遍历节点与边,其遍历速度与构成图形的数据量没有任何关系。

Neo4j集群模式运行原理

一个Neo4J HA集群的协作运行,协调行为是通过zookeeper完成的。2.0以后基于Paxos协议开发了自己的集群协调机制。

当一个Neo4j HA实体开启时将去连接协调器服务(zookeeper)注册其本身并询问“谁是主机(master)?”。如果某个机器是主机,新的实体将以从机(slaver)开启并连接到主机(master)。如果机器开启时为第一个注册或者通过主机选择算法应该成为主机,将会作为主机开启。

​ 当从一个从机上执行一个写入的事务时,每个写入操作将与主机同步(主机与从机将被锁定)。当事务提交时首先存在于主机上。当主机事务提交成功,从机上的事务也会被提交。为确保一致性,在执行写入操作前从机与主机同步必须是最新的。这是建立主机与从机之间的通讯协议,所以如果需要,更新将会自动发生。

​ 可以通过在包含ha.slave_coordinator_update_mode=none配置参数的配置文件中将数据库实体设置成只做为从机。此实体虽然在系统故障恢复选择时将不可能再成为主机,然而此从机的行为与其他所有从机都一样,含有永久写入到主机的能力。

​ 当从主机上执行写入操作,它将与在普通的嵌入模式中执行一样。此时主机将不会推送更新消息到从机。相反,从机可以配置一个拉取消息的时间间隔。没有选举,更新操作仅仅只会发生在从机上,任何时候都将同步一个写入到主机。

​ 将所有写入操作通过从机执行的好处是数据将被复制到两台机器上。这是建议的,避免当新选主机时可能造成回滚失败。

​ 当某台neo4j数据库服务不可用时,协调器(coordinator)将探测到并从集群中删除掉。当主机当机时,新的主机将自动被选择出来。一般地,一个新的主机被选定并在几秒钟内启动,在这段时间将不会执行任何写入操作(写入将抛出异常)。当某台机器从故障中恢复了,将会被自动重新连接到集群中。当没有得到其他任何机器的备份的旧的主机改变时, 是唯一不确定的。如果新的主机被选择并在旧的主机恢复前执行改变,将会有两个不同版本的数据。旧主机将移除分支数据库并从新主机下载一个全版本的数据。

所有这些可以归纳如下

  1. 从机可以处理写入事务。
  2. 更新相对从机最终将会一致。
  3. Neo4j HA 是一个容错并能继续执行从x台机器到单独一台机器(基于zookeeper设置)。
  4. 在写入操作上从机将自动同步到主机。
  5. 当主机故障时新的主机将自动选出。
  6. 当任何导致运行中断的错误(网络、维护)解决时当台机器将会自动被重新连接到集群中。
  7. 事务的原子性、持久性和一致性并最终会广播到其他从机上。
  8. 主机故障了,所有正在运行写入事务将会被回滚,主机选举时任何写入操作都不能执行。
  9. 读取操作高度可用。

Neo4j优缺点

  • 优点:
    数据的插入,查询操作很直观,不用再像之前要考虑各个表之间的关系。
    提供的图搜索和图遍历方法很方便,速度也是比较快的。
    更快的数据库操作。当然,有一个前提条件,那就是数据量较大,在MySql中存储的话需要许多表,并且表之间联系较多(即有不少的操作需要join表)。

  • 缺点:
    当数据过大时插入速度可能会越来越慢。.
    超大节点。当有一个节点的边非常多时(常见于大V),有关这个节点的操作的速度将大大下降。这个问题很早就有了,官方也说过会处理,然而现在仍然不能让人满意。
    提高数据库速度的常用方法就是多分配内存,然而看了官方操作手册,貌似无法直接设置数据库内存占用量,而是需要计算后为其”预留“内存…

注:鉴于其明显的优缺点,Neo4j适合存储”修改较少,查询较多,没有超大节点“的图数据。

Neo4j常见问题

  1. neo4j数据库支持最大多少个节点?最大支持多少条边?
    目前累积统计它有34.4亿个节点,344亿的关系,和6870亿条属性。
  2. neo4j数据库支持的最复杂的连接是什么?(比如每个节点都与其他任何一个节点相连)
    可以从上面的数字得出理论的极限:它基本上就产生了262144节点和34359607296的关系图。我们从来没有见过这种使用情况。
  3. 在数据库中,读/写性能跟节点/边的数量有关吗?
    这个问题意味着两个不同的问题。单次读/写操作不依赖数据库的大小。不管数据库是有10个节点还是有1千万个都一样。 — 然而,有一个事实是如果数据库太大,你的内存可能无法完全缓存住它,因此,你需要频繁的读写磁盘。虽然很多用户没有这样大尺寸的数据库,但有的人却有。如果不巧你的数据库达到了这个尺寸,你可以扩展到多台机器上以减轻缓存压力。
  4. neo4j数据库支持的读/写并发请求最大数量是多少呢?
    在并发请求上面没有任何限制。服务器的并发量更多的是依赖于操作本身的性能(高压写操作,简单读,复杂的遍历等等),以及使用的硬件性能。据粗略估计,在遍历最简单路径时每毫秒可以达到1000次请求。在讨论了指定的用户案例后,我们能得到更好的性能优化方案。
  5. 在数据库集群环境中数据一致性如何保证的呢?
    主从复制。从服务器从主服务器拉取数据变化。拉取间隔可以在每个从服务器上进行配置,从毫秒到分钟,根据你自己的需要来定。HA也可以通过从服务器来进行写操作。当发生时,从服务器通过追上主服务器来被写入,然后写入在主从之间完成。其他从服务器做一般处理。
  6. 当在一个数据库中发生更新操作时如何快速更新其他所有服务器呢?
    拉取间隔在每个从服务器上面进行配置,从几秒到几分钟不等,根据需求而定。当通过一个从服务器写操作时,从服务器立即在写之前与主服务器进行同步。一般情况下,读写加载不并影响从服务器的同步工作。一个复杂的写操作会给从服务器的文件系统巨大压力,与此同时,从服务器也要求拉取同步数据。实际上,我们不系统这成为一个关注的问题。
  7. 在集群环境中,在不同服务器会出现按比例延迟新增吗?
    在集群中从服务器超过10台的规模时,我们能预料到来自从服务器的大量的拉取请求会降低从服务器的性能。在集群中的写操作才会受影响,而读操作依然保持线性缩放。
  8. 支持在线扩展吗?换句话说,如果我们想新加入一台服务器到集群中需要关闭所有服务器吗?
    新的从服务器在不用停止或者启动整个集群的情况下可以被加入到一个已经存在的集群中。我们的HA协议会新增入加入的服务器。从服务器也可以简单的通过关闭他们自己来从集群中移除。
  9. 新加入一台服务器到全部同步需要多长时间?
    我们推荐在将从服务器加入之前先做一个最近的数据库的快照。一般通过备份来完成。从服务器之需要同步最近的更新,一般情况下只会一点点时间的数据。
  10. 重启需要多久呢?
    如果重启,你的意思是关闭集群然后再重启它,这完全依赖与你打字的速度。一般是10秒的样子。Neo4j的缓存不会自动预加载,而操作系统的文件系统缓存不会重置。
  11. 是否有备份恢复机制?
    Neo4j 企业版提供了一个在线备份(完整备份和增量备份&#x
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值