在前一篇文章,对掘金用户数据进行了一些单维度的统计分析,本文继续发挥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…