快速兴起的小众数据库(一):为关系数据而生的Neo4j
前言
随着大数据时代的发展,诞生了一大批大数据时代下的新数据库产品,如今MongoDB、Redis、HBase这些NoSQL数据库已经成为了互联网开发的新标配,SQL一统江湖的时代不复存在了。
然而,如果你觉得只要学习了上边这几种NoSQL你就抓住了大数据时代的话,你可就大错特错了!大数据时代发展速度之快超乎你的想象,新的数据库产品仍然在不断诞生,一些快速兴起的小众数据库很有可能成为下一个MongoDB、HBase!为了不落后于时代,你还不抓紧时间了解一下?
本系列文章为大家挑选了几种适合不同场景的小众数据库。这些数据库尽管小众,但是在它们自身擅长的场景中却能够发挥出远大于大众数据库的作用。因此如果你的需求比较特殊,大众数据库产品无法很好的满足你,那么这些小众数据库没准更适合你。
这次给大家介绍的是非常适合在社交网络、智能推荐领域应用的图数据库Neo4j。
Neo4j初认识
Neo4j是现今最火爆的图数据[1]。Neo4j最早在2010年发布,背后的Neo4j公司在2016年完成了3600万美金的D轮融资,产品的发展势头还算不错。
作为图数据库,Neo4j最大的特点是关系数据的存储。
估计大部分人压根还不知道啥是图数据库。图数据库除了能够像普通的数据库一样存储一行一行的数据之外,还可以很方便的存储数据之间的关系信息。
例如,对于一个社交网络的用户数据库,你除了要存储每个用户的姓名、性别、喜好这些基本信息外,你还需要存储一个用户和哪些用户是朋友,和哪个用户是情侣这些关系数据,这个时候Neo4j这样的图数据就可以派上用场啦!
通过下图,大家可以了解下什么是图数据库以及什么是关系数据。
关系数据示例
在上图中,包含两个标签为“人”的数据节点,分别代表Ann和Dan两个用户。这两个数据节点还包含姓名、出生地等属性信息,用于表示两个用户的基本信息,就如同常规数据库中的两行数据。
除此之外,两个数据节点之间还包含两条关系数据,即Ann嫁给了Dan,Ann和Dan同居。利用这些关系数据,你就可以方便的作出基于关系的查询,例如你可以查询Ann跟谁结婚了,这就是图数据库的优势。
Neo4j的独特优势
可能有人会说,上边写的这种关系数据结构,SQL也可以通过多表join等方法实现,那要Neo4j还有什么用?但毕竟术业有专攻,对于大量、复杂的关系数据处理,Neo4j在性能和使用方便程度上都是要远胜于SQL的。下边给大家简单总结下Neo4j的优势:
- 数据底层存储专门针对图数据的特点进行优化,在关系数据的处理上具备远高于其他数据库的性能
- 专门为关系数据设计的查询语言,对于关系数据的操作更加的方便。
- 没有表结构这个概念,相较SQL在使用上更加灵活。
- 自动为数据建立合适的索引(根据数据的标签),免去管理索引的麻烦。
- 支持高可用性主从集群部署。
- 具备图形化平台等配套工具,帮助开发者快速构建出完整的关系数据平台。
Neo4j的使用场景
- 社交网络:根据用户与其他用户的关系为用户推荐新的朋友。例如,在QQ中给你推荐朋友的朋友 。
- 智能推荐引擎:通过分析用户有哪些朋友、用户朋友喜好的产品、用户的浏览记录等关系信息推测用户的喜好进而为用户推荐商品。
- 知识图谱:根据知识点之间的关系建立知识图,帮助用户搜索到关联的知识。例如,在百度上搜索Neo4j,会同时出现MySQL等类似的内容。
- 恶意软件检测:通过记录软件行为的各种关系数据,例如其访问了哪些IP、访问了哪些系统资源,进而分析软件行为是否具有恶意。
- 网络、数据中心管理:网络、数据中心这些基础设施自身就是一个包含复杂关系的网络,利用Neo4j可以方便的建立设备之间的关系,以便于对整个系统的管理。
Neo4j简单体验
Neo4j有一套自己的查询语言,整体写法和SQL非常类似,因此对习惯SQL的用户非常友好。
例如,以下语句用于新建一个人类型的数据节点,这个人的姓名是Emil,来自Sweden。(以下教程摘自Neo4j官网[2],感兴趣的同学可以到官网查看详细教程)
CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })
以下语句则用来创建另一个人,名字叫Johan,并且他和Emil从2001年开始认识。(ee)-[:KNOWS {since: 2001}]->(js) 这段语句就相当于是为Johan和Emil建立了一个关系数据。
MATCH (ee:Person) WHERE ee.name = "Emil"
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js)
数据建立后,就可以开始见识Neo4j在关系数据处理方面的威力了。以下语句用于查询Emil的所有朋友。(出于简洁考虑省略掉了其他用户数据的创建过程)
MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = "Emil" RETURN ee, friends
Neo4j中的数据
上边的图是由Neo4j自带的图形化平台生成的。这里顺带介绍下Neo4j配套的图形化平台,真的是非常强大,能够以图形化的形式在Web中展示数据节点之间的关系,并且可以通过点击拖动等交互实现更加复杂的查询操作。
Neo4j的图形化平台
以上只是Neo4j最简单基本的使用介绍,Neo4j的功能还有很多,感兴趣的同学可以自己去官网上了解。
Neo4j的局限
Neo4j在关系数据的处理方面具备很强的性能和功能,但是为了实现这点,Neo4j也在其他方面做出了很多牺牲:
- Neo4j对于关系数据以外的复杂查询支持不佳,例如range、复杂聚合,更不用说SQL中的多表查询了。
- 性能低于常规NoSQL。受限于图数据的复杂性,Neo4j在性能上尤其是写性能上明显弱于MongoDB这类NoSQL,并且在性能水平扩展上也比较受限。
- 缺乏原生分片支持,容量水平扩展上比较受限。
因此,Neo4j仅仅适用于包含大量关系数据的场景中,如果你的数据模型并没有包含太多关系结构,还是老老实实的用MySQL、MongoDB这些常规数据库吧。
总结
综上,Neo4j对关系数据具备非常强的处理能力,如果你有类似推荐引擎、社交网络这样的关系数据应用场景,那就完全可以考虑尝试一下。