为什么选择图形数据库,为什么选择Neo4j?
最近在抓取一些社交网站的数据,抓下来的数据用MySql存储。问我为什么用MySql,那自然是入门简单,并且我当时只熟悉MySql。可是,随着数据量越来越大,有一个问题始终困扰着我,那就是社交关系的存储。
就以新浪微博举例,一个大V少则十几万,多则几千万的粉丝,这些关注关系要怎么存呢?在MySql中,一条关注关系(大V id,大V的一个粉丝 id)存为一条数据,那么当用户数量上来的时候,关注关系轻松破亿,破十亿,甚至上百亿,并且为了保证每条数据的唯一性,还需要设置联合索引,MySql就有些力不从心了。那么有人要说了:分表呀。嗯,没错,分表的确可以在插入端和读取端提升一些速度。比如我们可以根据id哈希到100张表中。查询一个用户有哪些粉丝是快了,但是查询一个用户关注了哪些人时仍然需要遍历全表。好,这时候我们还可以以(id,其关注的一个用户的id)再构造100张表,于是两种查询都快了。然而,后面那100张表是冗余数据,看着就不爽...并且生成一张子图也不方便(需要多次写SQL查表)。
于是,在搜索更好的方案时无意间发现了图形数据库,查阅一番资料后感觉确实是个不错的选择,毕竟业界的一些大佬,如twitter,Adobe等也在用。
那么,什么是图形数据库呢?在这里我贴上较为官方的定义:a database that uses graph structures for semantic queries with nodes, edges and properties to represent and store data – independent of the way the data is stored internally. It’s really the model and the implemented algorithms that matter.注意,这里只是说数据模型是图结构的,没有说数据的存储也一定要是图结构的。其数据模型如下图
进入今天的主题,我将以Neo4j为例,说明为什么选择图形数据库?
首先,先简要介绍一下Neo4j。Neo4j是由Java和Scala写成的一个NoSql数据库,专门用于网络图的存储。更详细的内容可见官网。作为一个图形数据库,Neo4j有以下优点:
- 更快的数据库操作。当然,有一个前提条件,那就是数据量较大,在MySql中存储的话需要许多表,并且表之间联系较多(即有不少的操作需要join表)。
- 数据更直观,相应的SQL语句也更好写(Neo4j使用Cypher语言,与传统SQL有很大不同)。
- 更灵活。不管有什么新的数据需要存储,都是一律的节点和边,只需要考虑节点属性和边属性。而MySql中即意味着新的表,还要考虑和其他表的关系。
- 数据库操作的速度并不会随着数据库的增大有明显的降低。这得益于Neo4j特殊的数据存储结构和专门优化的图算法。
接着,试着从更深一些的层次看图形数据库。我将从Neo4j的数据存储和数据读写两方面来说明为什么选它。
数据存储
Neo4j对于图的存储自然是经过特别优化的。不像传统数据库的一条记录一条数据的存储方式,Neo4j的存储方式是:节点的类别,属性,边的类别,属性等都是分开存储的,这将大大有助于提高图形数据库的性能。如下图:数据读写
在Neo4j中,存储节点时使用了"index-free adjacency",即每个节点都有指向其邻居节点的指针,可以让我们在\(O(1)\)的时间内找到邻居节点。另外,按照官方的说法,在Neo4j中边是最重要的,是"first-class entities",所以单独存储,这有利于在图遍历的时候提高速度,也可以很方便地以任何方向进行遍历。
更多的资料可以看参考资料第一条。
关于为什么选图形数据库就说到这。如今可供选择的图形数据库也不少,为什么就选择了Neo4j呢?我简要归结为以下几点:
- 作为较早的一批图形数据库之一,文档和各种技术博客较多。
- 最开始曾尝试过flockdb(据说操作简单+轻量级),但是败于安装过程...,依赖太多。
- 网上经常有人将orientdb,arangodb与neo4j做对比,我当然也考虑过orientdb和arangodb。从易用性来说都差不多。速度上的话看过一些评测,arangodb应该是相对最快的,因为其使用了混合索引。但是从稳定性来说,neo4j是最好的。
时间有限,我并没有通读Neo4j的官方文档。但作为一个数据库使用者,能大概地了解为什么要选这个数据库就已经足够了。
最后做个总结吧。图形数据库是这几年兴起的,整体还不是很完善,而且适用面也是比较窄的。只有在明确自己的需求之后,才能确定是否选择图形数据库。
转载请注明出处:http://www.cnblogs.com/rubinorth/
参考资料
- Graph Databases for Beginners: Native vs. Non-Native Graph Technology
- neo4j是怎么pk掉orientdb和titan的
- arangodb官方文档,讲为什么arangodb比neo4j快
为什么选择图形数据库,为什么选择Neo4j?的更多相关文章
- 图形数据库 Neo4j 开发实战
https://www.ibm.com/developerworks/cn/java/j-lo-neo4j/ Neo4j 是一个高性能的 NoSQL 图形数据库.Neo4j 使用图(graph)相关的 ...
- 图形数据库 Neo4j 开发实战【转载】
简介: Neo4j 是一个高性能的 NoSQL 图形数据库.Neo4j 使用图(graph)相关的概念来描述数据模型,把数据保存为图中的节点以及节点之间的关系.很多应用中数据之间的关系,可以很直接地使 ...
- Neo4j安装&入门&一些优缺点
本篇将介绍Neo4j的安装,入门,和自己使用了一段时间后发现的优点缺点,争取简洁和实用. 如果你是第一次接触Neo4j,并且之前也都没接触过类似的Graph Database的话,建议先浏览一下我之前 ...
- Neo4j安装&入门&一些优缺点(转)
本篇将介绍Neo4j的安装,入门,和自己使用了一段时间后发现的优点缺点,争取简洁和实用. 如果你是第一次接触Neo4j,并且之前也都没接触过类似的Graph Database的话,建议先浏览一下我之前 ...
- 图数据库neo4j和关系数据库的区别
相信您和我一样,在使用关系型数据库时常常会遇到一系列非常复杂的设计问题.例如一部电影中的各个演员常常有主角配角之分,还要有导演,特效等人员的参与.通常情况下这些人员常常都被抽象为Person类型,对应 ...
- Ubuntu 下 Neo4j单机安装和集群环境安装
1. Neo4j简介 Neo4j是一个用Java实现的.高性能的.NoSQL图形数据库.Neo4j 使用图(graph)相关的概念来描述数据模型,通过图中的节点和节点的关系来建模.Neo4j完全兼容A ...
- Neo4j入门之中国电影票房排行浅析
什么是Neo4j? Neo4j是一个高性能的NoSQL图形数据库(Graph Database),它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持 ...
- 史上最全面的Neo4j使用指南
Neo4j图形数据库教程 Neo4j图形数据库教程 第一章:介绍 Neo4j是什么 Neo4j的特点 Neo4j的优点 第二章:安装 1.环境 2.下载 3.开启远程访问 4.测试 第三章:CQL 1 ...
- neo4j 安装步骤 转自:http://blog.csdn.net/luoluowushengmimi/article/details/19987995
1. Neo4j简介 Neo4j是一个用Java实现的.高性能的.NoSQL图形数据库.Neo4j 使用图(graph)相关的概念来描述数据模型,通过图中的节点和节点的关系来建模.Neo4j完全兼容A ...
随机推荐
- Oracle18c Exadata 版本安装介质安装失败。
下载下来的介质安装失败 白费一早上的功夫.. 一会儿问问云和恩墨的人呢.. INFO: [-- ::] Skipping line: 复制数据库文件 INFO: [-- ::] Skipping li ...
- mouseover与mouseenter,mouseout与mouseleave的区别
mouseover事件:不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件,对应mouseout事件: mouseenter事件:只有在鼠标指针穿过被选元素时,才会触发 mouse ...
- centos7黑客帝国装逼
黑客帝国既视感 搜 cmatrix 然后放到本地解压缩 ,安装 yum install ncurses-devel./configure && make && make ...
- 装CentOS 系统
一. 二. 三. 四. 五. 六. 七. 八. 九. 十. 十一. 十二. 十三. 十四. 十五. 十六. 十七. 十八. setup设置
- git常用命令及用法小计
git init 初始化一个本地git仓库repository git status 查看状态 git add <file> 将工作区修改加到暂存区(stage) git commit - ...
- 牛客网练习赛7-D-无向图(bfs,链式前向星)
题意:中文题: 思路:就是找某个点距离其他点的距离,他给你很多点也无所谓.用一个dist[]数组,这个数组保存的是他给你的点到其他点的最短距离且标记的作用,然后bfs搜索就行了. 代码: #inclu ...
- pgm11
这里简要的讨论 hybrid network 与一些时序数据的分析. hybrid network 指网络中存在离散随机变量与连续随机变量,这种情况下一般非常麻烦,这主要是因为连续型随机变量需要使用某 ...
- BZOJ1798[Ahoi2009]维护序列——线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- share.js轻松分享/邀请
GitHub地址 https://github.com/overtrue/share.js 安装 安装的方法很多,大家选择自己合适的进行安装就好. clone $ git clone https:// ...
- BZOJ4008 : [HNOI2015]亚瑟王(期望dp)
题意 略(看了20min才看懂...) 题解 我一开始天真地一轮轮推期望,发现根本不好算... 唉~ 不会做就只能抄题解咯 看了一波DOFY大佬的解法qwq 发现有句神奇的话 记住,期望要倒着推... ...