Neo4j在社交媒体挖掘中的应用

Sep 11, 2016


Neo4j在社交媒体挖掘中的应用

最近在做一个关于社交网络中家庭关系挖掘的项目,其中有用到Neo4j,下面我就来介绍一下Neo4j在整个项目中的应用,并且分享在应用过程中的一些经验。

图形数据库,属性图和Neo4j

维基百科对图形数据库或称为图数据库的定义是:图形数据库是一种使用图结构或者图模型来对节点和边进行语义查询,存储数据和表示数据的数据库。图形数据库使用图模型来表示数据以满足表达关系语义的需求。Neo4j 是一款用Java语言编写开源图形数据库。它使用 Property Graph Model 作为数据模型,它将现实中的实体建模成节点,将实体间的联系建模成边,并且点和边都可以有相应的属性,这是一种非常灵活的语义表示模型。同时,Neo4j 使用 Cypher 作为查询语言。Cypher 是一种宣言式的语言,它有点像SQL语言,Neo4j使用它来表达图形中的pattern。我们可以使用Cypher来表达我们要查询什么,插入什么,修改或者删除什么。(具体详细的介绍我不过多重复介绍,因为你可以在 http://www.infoq.com/cn/articles/graph-nosql-neo4j 找到更加详尽且专业的入门介绍。)

Neo4j 与社交网络的天然契合

Neo4j 的强大的图形表示和存储功能与社交网络数据可以说是天造地设的一对。在我们的项目中我们使用的是新浪微博数据,新浪微博是一种类似Twitter的微博客社交网站,人与人之间有关注和被关注的关系,这就构成了非常简单的图形关系,人作为节点,由于关注与被关注是对称关系所以可以作为有向边来表示。例如:A用户关注B用户,在Neo4j 可以表示为两点一条边,如下图。我最近做的项目是一个关于社交关系分类问题,也就是通过数据挖掘技术对

新浪微博中人与人之间的关注关系进行分类,以识别出哪些关系是家庭成员之间的关注关系,最后要将挖掘出来的结果以图形的形式在web端展示出来。由于 Neo4j 使用的 Cypher 查询语言具有 human-readable 的特性这使得我们在开发服务器端时能够很方便地表达我们的查询语义。比如我要找到一个名为“小小小小小小小子XW”的用户的关系网我们可以进行如下查询:match (n:User {screenname:"小小小小小小小子XW"})-[r:Follow]->(m:User) return n,r limit 10 。这段代码表示一种关系模式,这种模式是:一个类型为 User 的节点,它的属性sreenname的值为“小小小小小小小子XW”字符串,它通过关系类型 Follow 有向地与另一个类型为 User 的节点相连接的路径,并且在结果集中限制输出10个。很清晰地,这种模式表达了微博中用户名为“小小小小小小小子XW”所关注的人10个人。最终查询结果在 Neo4j 后端管理平台所展示的图形是这样的:

可见,neo4j 可以通过简单的易读的查询来表示图论中的路径,并且通过路径上点点之间的边来传达语义,这样方式非常地直观,使得一些复杂逻辑可以很好地,清晰地和明确地表达出来。这也是RDBMS无法比拟的,因为随着查询逻辑的复杂,RDBMS需要通过复杂且代价高昂的连接语法操作才可以完成,而通过 Cypher 查询复杂度只跟数据规模相关。