如何用neo4j对50万掘金用户进行分析(2)

837 阅读4分钟

前一篇文章,对掘金用户数据进行了一些单维度的统计分析,本文继续发挥neo4j作为图数据存储和分析的优势,对用户信息进一步分析。

最短路径分析

neo4j 提供了方便快捷的查询给定2个节点之间最短路径函数shortestPath,通过制定

  • 寻找 saiwaiyanyu阴明 在9度关系内的最短路径。
// 最短路径
MATCH path = shortestPath((u1:User{id:"5a8d0c5df265da4e9d223ba5"})-[:follow*1..9]-(u2:User{id:"551d677ee4b0cd5b623f49cb"}))
RETURN path,u1.username,u2.username
LIMIT 1;

  • 寻找 saiwaiyanyu头条搜索前端团队 的字段路径
// 最短路径
MATCH path = shortestPath((u1:User{id:"5a8d0c5df265da4e9d223ba5"})-[:follow*1..9]-(u2:User{id:"5de0f0a0f265da06113c700f"}))
RETURN path,u1.username,u2.username
LIMIT 1

最长径分析

通过shortestPath能够方便查询给定点之间的最短关系,如果需要查询比较长的关系路径,该如何实现呢。

  • 查询存在6度关系的节点:

// 最长路径存在6度关系
MATCH path = (u1:User)-[:follow*6..6]-(u2:User)
WHERE  ALL(u IN  [u0 IN NODES(path)| size([m IN FILTER(f IN NODES(path) WHERE ID(f)=ID(u0))])] WHERE u<2) 
RETURN path
LIMIT 1;

在茫茫人海中,任何2个用户总能找到他们的关联,无论是隔壁邻居的八大姨的三外甥的同学。。。

  • 查询存在6度关系的节点,且指定follow方向:
// 最长路径存在6度关系
MATCH path = (u1:User)<-[:follow*6..6]-(u2:User)
WHERE  ALL(u IN  [u0 IN NODES(path)| size([m IN FILTER(f IN NODES(path) WHERE ID(f)=ID(u0))])] WHERE u<2) 
RETURN path
LIMIT 1
;

这一条粉丝关系路径算是比较长了。

  • 粉丝关系形成闭环的情形
// 最长路径
MATCH (u:User) WHERE NOT EXISTS( (u)<-[:follow*1..6]-(u) ) 
MATCH path = (u)<-[:follow*7..7]-(u) 
WHERE ALL(u IN  [u0 IN FILTER(n IN NODES(path) WHERE ID(n)<>ID(u)) | size([m IN FILTER(f IN NODES(path) WHERE ID(f)=ID(u0))])] WHERE u<2) 
RETURN u.username,path, LENGTH(path)
LIMIT 1
;

follow关系层层传递,发现回到原点 ^_^ .

关于用户推荐

推荐算法比较经典的有基于用户和基于物品,以及今年应用越来越广的基于深度学习模型的推荐。

因采集到的用户数据维度较少,用户的文章、沸点、行为数据等缺失,因此计算用户相似度等存在一些问题。尝试用用户关注关系实现一个简单的推荐。

  • 关注他的用户也关注了

给定用户,通过查询该用户粉丝关注的其他用户,查看粉丝群的共同关注。


MATCH(u0:User{id:'551d677ee4b0cd5b623f49cb'})
MATCH (u0)<-[:follow]-(u1:User)-[:follow]->(g:User)
WHERE NOT ID(u0)=ID(g)
WITH u0, g, COUNT(DISTINCT u1) AS sameFollowNum
RETURN u0.username,u0.id, g.username,g.id, sameFollowNum 
ORDER BY sameFollowNum DESC
LIMIT 20
;

u0.username g.username sameFollowNum
阴明 前端外刊评论 21304
阴明 李CHENGXI 21286
阴明 水墨寒 20161
阴明 稀土君 15042
阴明 liutao 10898
阴明 刘欣 9434
阴明 NeXT 8770
阴明 丁一 8741
阴明 雨神姥爷 8454
阴明 taotao.li 8392
阴明 闲鱼技术 8290
阴明 HollisChuang 8050
阴明 吆喝科技_Zoran 7810
阴明 腾讯云加社区 7554
阴明 杨昕霖 7391
阴明 超人汪小建 7172
阴明 可乐橙 7137
阴明 饿了么UED 7039
阴明 JJ-Ying 7039
阴明 stormzhangV 6910

从结果看,21304 用户既关注了阴明,同时也关注了前端外刊评论

  • 和我一起关注的用户也关注了他
// 和类似的用户也关注了
MATCH(u0:User{id:'5a8d0c5df265da4e9d223ba5'})
MATCH (u0)-[:follow]->(:User)<-[:follow]-(u1)-[:follow]->(g:User) 
WHERE NOT (u0)-[:follow]->(g)
WITH u0, g, COUNT(DISTINCT u1) AS sameFollowNum
RETURN u0.username, g.username, sameFollowNum
ORDER BY sameFollowNum DESC
LIMIT 10
;
u0.username g.username sameFolloweeNum sameFollowNum
saiwaiyanyu 稀土君 24 23476
saiwaiyanyu 前端外刊评论 23 21760
saiwaiyanyu 李CHENGXI 23 21662
saiwaiyanyu 水墨寒 23 20683
saiwaiyanyu 腾讯云加社区 23 18890
saiwaiyanyu liutao 24 16694
saiwaiyanyu 超人汪小建 24 13954
saiwaiyanyu 闲鱼技术 23 12828
saiwaiyanyu Java3y 24 12746
saiwaiyanyu 美团技术团队 24 12667

从结果看出有23476 用户,关注了 saiwaiyanyu关注的用户,且这23476也关注了 稀土君,可以尝试将稀土君推荐给saiwaiyanyu

分析代码见 github.com/saiwaiyanyu…