Neo4j 和 Spark 下的 GraphX 有什么区别? - Jeffrey511/Jeffrey-Yu GitHub Wiki
Neo4j and Apache Spark https://neo4j.com/developer/apache-spark/
原文链接:https://www.zhihu.com/question/23916994/answer/157031958
首先来说 Neo4j
Neo4j 是 native graph database,也就是有自己的数据库存储。它的长处在于支持交互式查询,属于 OLTP 系统,很多人说不支持分片存储使其无法应付海量数据,本人觉得恰恰相反,可以说 Neo4j 的存储方式是教科书式的以空间换时间,每台服务器配备 ssd 磁盘阵列虽然贵,但是可以大幅减少分片存储的带宽占用和通信时间开销,保证 OLTP 的效率。
Neo4j 很容易上手,特有的 Cypher 查询语言以画草图的方式查询和建模数据,很直观。适当构建查询计划的情况下,Neo4j 的查询效率很高,能够迅速从整网中找出符合特定模式的子网,供随后分析之用。以下给出一个示例图: 此外,Neo4j 实现了 tinkerpop 接口,tinkerpop 是刚刚毕业的一个阿帕奇项目,有望建立图数据库的一套标准用户接口。同样实现 tinkerpop 的还有 titan,orient 等主流图数据库。
再来看 GraphX
GraphX 是 Spark 的系统组件,存储是基于 Spark RDD 的,有节点和边两种rdd。熟悉 Spark 的朋友对 RDD 该不会陌生,Spark 通过缓存 RDD 的操作节省了大量计算和 IO 开支,因此 Spark 特别适合对海量数据进行运算,此理同样适用于 GraphX。因此,GraphX 自设计之初就是奔着图计算的目标去的,属于 OLAP 系统,而非 OLTP 系统。
GraphX 有丰富的函数库,能完成很多经典图算法,如 PageRank、三角计数、社群发现、最短路径计算等等。此外,图存储和计算的方式不禁让人想到神经网络算法,如果将隐层用节点 RDD 表示,隐层之间的边用边 RDD 表示,运用 GraphX 的计算优势搭建起一套多层神经网络的想法很美妙,这应该就是 MLlab 相应算法模块的工作原理。
因此跟 GraphX 相关的概念集中在图计算,而非图存储和查询领域。所以经常浏览 DB-Engines 的朋友们不难发现,图数据库列表里就没有 GraphX 这一项。在比较图存储和图查询性能时,比较集合多是 Neo4j、orientdb、titan、arangodb 等图数据库系统。而比较图计算时,比较集合多是 GraphLab、giraph、GraphX。
简言之,图数据库系统和图计算系统不是一回事:前者是为了存储完整数据,并根据需求从中查询数据子集供分析展示之用;后者的任务是拿到一个图结构的数据集,从中计算一些有用的东西。
如果你有随时增长的海量数据,希望以图的方式存储这些数据,从而能在需要时顺利挖出一个子图来,那就要借助于图数据库,此时如果你有充足的资金,Neo4j 是不二之选,否则就要从 DB-Engines 里面第二名以后的一众数据库里挑选。进一步,如果你的需求不只停留在查询,还要依据查询结果计算出一些图的特征来,那么建议你将图数据库系统同图计算系统联合使用。如下链接可以提供相关案例 https://neo4j.com/developer/apache-spark/ 有关 OLTP 和 OLAP 的比较,以及图数据库系统和图计算系统的比较问题,建议参考《Spark GraphX in Action》一书中的第一部分。