Neo4j 图数据库在社交网络等领域的应用

向作者提问
在读学生,csdn优秀博主,国家级大学生创业项目负责人 对NodeJs、Python、Android等学有所成,在 csdn博客有50多篇原创文章 目前在校数据挖掘实验室学习
查看本场Chat

一、前言

Neo4j 是一种基于图论实现的新型 NoSQL 数据库。这种数据库,在处理社交网络,物流运输,推荐系统,欺诈检测等,关系分析等领域有着巨大优势。本场 Chat,我将为你介绍:

  1. Neo4j 与关系型、其他非关系型数据库的优势比较
  2. 哪些领域适合 Neo4j,哪些领域不适合
  3. Neo4j 的安装
  4. 介绍 Cypher 查询语言
  5. 案例实战:
  • 银行欺诈环分析
  • 文献索引
  • 寻找垃圾邮箱源头
  • 企业关系构建
  • 社交关系分析,实现一个简单的好友推荐功能

二、正文

我想,大家对Mysql这种关系型(SQL型)的数据库肯定很熟悉。对MongoDb这种非关系型(NoSQL型)数据库也不会陌生。今天我们要介绍一种新型数据库—图数据库。这种数据库是基于图论实现的。

一提到图论,可能有的小伙伴就会倒吸一口冷气,如果你曾涉及过一些数据结构的知识,会发现图几乎是最难学的,涉及到许多晦涩难懂的算法。这里不用担心,今天介绍的Neo4j把很多算法已经封装好了。不需要你涉及底层,很是方便。下面我们开始对比一下图数据库和其他关系型、非关系型的数据库的优劣。

与传统数据库不同的是,图数据库存的是节点(对象)和边(对象与对象之间的关系)。当数据存在错综复杂的关系时,使用这类数据库是最好的选择。

enter image description here

1. Neo4j 与关系型、其他非关系型数据库的优势比较

(1)Neo4j与关系型数据库的比较

以Mysql为代表的关系型数据库已经诞生了很久了,一直是数据库领域的动力,他们将高度结构化的数据储存在一张张二维表格里,必须严格地按照相关约定对数据进行操作(比如外键约束)。你可以把它理解成一张张账本。

enter image description here

但是,正是因为关系型数据库在建表之前就需要制定相关约定,常常会出现表与表之间有相互制约、相互引用的关系。随着数据库的不断增大,相互制约的关系会不断增多,执行搜索匹配的操作次数将呈现指数增加,进而消耗大量的资源。 举一个例子,当你要查询“小明的朋友”这样的问题,关系层数据库会涉及到一些代价高昂的间接层,比如用索引表查询:

enter image description here

从表里可以发现,小明(ID:2)的朋友是小华(ID:1),你也许会说这并不复杂呀,才一张表而已。

但是要是我问“小明的朋友的朋友的朋友…”这样的深度不断增加,每增加一层就要加一张索引表,这样间接层不断增加。查询就越来越慢,而且所需的内存开销就越来越大。

还有一点,如果我反向问,“谁的朋友是小明”,你可能会说,当然是小华呀。但是你仔细看看索引表,可小华的FriendID是3 不是1(小明)。也就是说,对于这种反向提问,关系型数据库也不能很好处理。

这种反向提问有意义吗?当然有意义,而且很有用,打个比方,小明喜欢编程,那么反向问,谁还喜欢编程。找到喜欢编程里的大神(通过紧密度中心性等属性评判)推荐给小明关注。这样一个简单的推荐功能就出来了。

对比起来,图数据库就有着得天独厚的优势,它储存节点,节点的属性,节点的关系。而这些关系是按类型和方向组织起来的。关系的访问是直接通过节点完成的。问“小明的朋友的朋友的朋友…”,即使深度增加也只是增加节点而已。在复杂连接的查询上,能达到毫秒级别。

怎么理解节点,关系,属性这些概念呢?

这里举个例子,创建一个节点,标签是人,他的名字叫小明。小明就是一个节点。小明喜欢看电影(节点的属性),他和小华是朋友(关系)。这样一个简单的关系就建立了。

enter image description here

(2)Neo4j与其他非关系型数据库比较

目前,大部分的NoSQL数据库都是基于集合和文档的,这些数据被储存在不连贯的集合里,那么这样使得数据间的相互联系,建立关系变得更加困难。也就是说数据是离散的,如果要建立关系,通常会将一个集合嵌到另一个集合里,再来实现关系。这样的开销也很大。但是,这种数据没有太多"关系",使用这种数据库效率特别高,有很好的读写功能。

enter image description here

这篇文章对比了8种不同的NoSQL数据库可以参考

余博伦
目前主流图数据库除了Neo4J还有什么值得推荐?Neo4J的商业许可具体在应用中对我们有什么限制?文章对比了Neo4J与关系数据库和一些非关数据库,那么请问Neo4J与同样是图数据库的ArangoDB/OrientDB相比较有什么优劣?不好意思有点贪心,文章中只是例举了简单的示例,那么在数据量大的情况下(例如千万级)Neo4J具体的性能表现如何?与其他主流数据库的性能相比呢?
微信扫描登录