社交图谱好友关系分析

  • 一、两两之间好友关系查询
  • 二、自定义函数实现两两关系统计
  • 三、使用UNWIND实现节点属性更新
  • 四、自定义过程实现节点属性更新
id(source)源节点 id(target)目标节点 result
60667 60669 60667:3条好友关系
60667 80988 60652:2条好友关系
60652 60667 60669:2条好友关系
60652 60669 80988:1条好友关系

以下代码完成快速统计目标人群中两两之间的好友关系数量(某节点相关联的好友关系数量)

一、两两之间好友关系查询

使用with定义一个列表变量,里面是所有的节点ID;使用match匹配出所有的结点,将结点放到列表中。使用两个unwind将结点列表打散到行,两个unwind的结点也是以笛卡尔积的方式返回的,所以这里是两两的任意组合,甚至两个结点相同的组合。实际上我们这里求最短路径1到2和2到1肯定是一样的,所以用id(source)<id(target)来去除一半;

WITH [60667,60652,60669,60635,80988] AS groupIdsMATCH (n) WHERE id(n) IN groupIdsWITH collect(n) AS nodesUNWIND nodes AS sourceUNWIND nodes AS targetWITH source,target WHERE id(source)<id(target)MATCH paths=(source)-[:好友]-(target) RETURN path

二、自定义函数实现两两关系统计

1、通过节点列表统计之后将count值更新到节点并且返回节点列表

     /*** @param* @return* @Description: TODO(两两之间的好友关系分析)*/@Procedure(name = "zdr.apoc.publicFriendAnalysis", mode = Mode.WRITE)@Description("Public friend analysis")public Stream<NodeResult> publicFriendAnalysis(@Name("sourceList") List<Node> sourceList, @Name("targetList") List<Node> targetList) {List<Node> nodes = new ArrayList<>();// 合并节点集合nodes.addAll(sourceList);nodes.addAll(targetList);// 统计好友关系数HashMap<Long, Integer> countMap = countFriedsRela(nodes);// 节点集合排重nodes = distinctNodes(nodes);// 给节点更新属性并返回return returnFriendResultNodes(nodes, countMap);}/*** @param* @return* @Description: TODO(统计好友关系数)*/private HashMap<Long, Integer> countFriedsRela(List<Node> nodes) {HashMap<Long, Integer> countMap = new HashMap<>();nodes.forEach(node -> {long id = node.getId();if (countMap.containsKey(id)) {int count = countMap.get(id);count++;countMap.put(id, count);} else {countMap.put(id, 1);}});return countMap;}/*** @param* @return* @Description: TODO(节点集合排重)*/private List<Node> distinctNodes(List<Node> nodes) {return nodes.stream().filter(distinctById(v -> {Node node = v;return node.getId();})).collect(Collectors.toCollection(ArrayList::new));}

2、通过节点ID列表统计之后返回LIST MAP(此过程使用函数实现更简洁)

     /*** @param* @return* @Description: TODO(两两之间的好友关系分析)*/@Procedure(name = "zdr.apoc.publicFriendAnalysisMap", mode = Mode.WRITE)@Description("Public friend analysis")public Stream<NodeFriendCountList> publicFriendAnalysisMap(@Name("sourceList") List<Long> sourceList, @Name("targetList") List<Long> targetList) {List<Long> nodes = new ArrayList<>();// 合并节点集合nodes.addAll(sourceList);nodes.addAll(targetList);// 统计好友关系数HashMap<Long, Integer> countMap = countFriedsRelaIds(nodes);// 给节点更新属性并返回return Stream.of(new NodeFriendCountList(returnFriendResultNodesById(countMap)));}/*** @param* @return* @Description: TODO(统计好友关系数)*/private HashMap<Long, Integer> countFriedsRelaIds(List<Long> nodes) {HashMap<Long, Integer> countMap = new HashMap<>();nodes.forEach(nodeId -> {long id = nodeId;if (countMap.containsKey(id)) {int count = countMap.get(id);count++;countMap.put(id, count);} else {countMap.put(id, 1);}});return countMap;}/*** @param* @return* @Description: TODO(将统计结果更新为节点属性并返回节点集合)*/private List<Map<String, Object>> returnFriendResultNodesById(HashMap<Long, Integer> countMap) {List<Map<String, Object>> list = new ArrayList<>();countMap.forEach((k, v) -> {Map<String, Object> map = new HashMap<>();map.put("id", k);map.put("count", v);list.add(map);});return list;}

三、使用UNWIND实现节点属性更新

# Nodes id listWITH [60667,60652,60669,60635,80988] AS groupIdsMATCH (n) WHERE id(n) IN groupIdsWITH collect(n) AS nodesUNWIND nodes AS sourceUNWIND nodes AS targetWITH source,target WHERE id(source)<id(target)MATCH paths=(source)-[:好友]-(target) WITH collect(id(source)) AS sourceList,collect(id(target)) AS targetListCALL zdr.apoc.publicFriendAnalysisMap(sourceList,targetList) YIELD list WITH listUNWIND list AS rowMATCH (n) WHERE id(n)=row.id SET n.targetGroupFriendsRelaCount=row.count RETURN n# publicFriendAnalysisMap过程返回的数据样例# [{"count":3,"id":60667},{"count":2,"id":60652},{"count":2,"id":60669},{"count":1,"id":80988}]

四、自定义过程实现节点属性更新

# Nodes listWITH [60667,60652,60669,60635,80988] AS groupIdsMATCH (n) WHERE id(n) IN groupIdsWITH collect(n) AS nodesUNWIND nodes AS sourceUNWIND nodes AS targetWITH source,target WHERE id(source)<id(target)MATCH paths=(source)-[:好友]-(target) WITH collect(source) AS sourceNodes,collect(target) AS targetNodesCALL zdr.apoc.publicFriendAnalysis(sourceNodes,targetNodes) YIELD node RETURN node# publicFriendAnalysis过程可以返回更新属性targetGroupFriendsRelaCount之后的节点

社交图谱好友关系分析相关推荐

  1. 实战 SQL:微信、微博等社交网络中的友好、粉丝关系分析

    文章目录 数据结构 好友关系图 粉丝关系图 数据的存储 好友关系分析 查看好友列表 查看共同好友 可能认识的人 最遥远的距离 粉丝关系分析 我的关注 共同关注 我的粉丝 相互粉丝 总结 如今,社交软件 ...

  2. 【采用】反欺诈之血缘关系分析和犯罪传导监测 - 知识图谱

    近期,一银行找到我,说他们现在有一个立项,题目是<数据血缘关系智能分析和犯罪风险传导监测>,希望听听我的建议.今天正好听到妈妈跟我说起这件事,就想,还是针对这个课题,好好整理下思路,讲一讲 ...

  3. 基于社交图谱的多层关系挖掘推荐

    基于社交图谱的多层关系挖掘推荐 一.需求分析 1.推荐功能 2.亲密度衡量标准 3.实现思路 二.案例测试 1.准备样例数据 2.构建查询 3.优化 一.需求分析 1.推荐功能 根据多层人员互动类关系 ...

  4. PostgreSQL 社交类好友关系系统实践 - 正反向关系查询加速

    标签 PostgreSQL , 好友关系 , 正向关系 , 反向关系 背景 关系系统在很多设计类应用中非常常见,例如查询你有哪些好友,你是哪些人的好友. 又比如我LIKE了哪些人,哪些人LIKE了我. ...

  5. mysql好友关系数据表设计_社交系统中用户好友关系数据库设计

    基础分析 第一步,有一张用户表,表内包含用户的基本信息,比如账号.姓名.性别等信息.这里用tb_user表示用户信息表. ID用户名 1张三 2李四 3王五 4赵六 第二步,需要将用户与用户直接建立好 ...

  6. 【行业报告】基于社交图谱关系的反欺诈产品应用——青云

    报告来源:https://blog.csdn.net/yeziand01/article/details/80644856#commentsedit 感谢博主分享 另附Tech Fin微信社群,感兴趣 ...

  7. MyRocks: 为facebool 的社交图谱服务的LSM-tree存储引擎

    文章目录 概览 1. UDB 架构 2. UDB 表格式 3. Rocksdb:针对flash存储优化过的第三方库 3.1 Rocksdb架构 3.2 为什么选择Rocksdb 4. MyRocks ...

  8. 【图的表示】:如何存储微博、微信等社交网络中的好友关系?

    微博.微信.LinkedIn 这些社交软件我想你肯定都玩过吧.在微博中,两个人可以互相关注:在微信中,两个人可以互加好友.那你知道,如何存储微博.微信等这些社交网络的好友关系吗? 这就要用到我们今天要 ...

  9. 知识图谱和图分析与可视化

    来源:知链数据 "知识图谱和图分析与可视化"这个题目看起来比较大,我尝试基于本人的一些图数据可视化与分析经验,对知识图谱和图分析与可视化之间的关系进行简单梳理,并分享一些以知识图谱 ...

最新文章

  1. Spring Security OAuth2 Demo -- good
  2. 多种IP网络技术的原理和特点
  3. 在服务器上打包部署springboot+vue的项目(二)让服务器上有sql数据,且可以进行用户交互
  4. 更改整个目录文件的所有权限
  5. 视频编码器的智能化——AI辅助编解码的ASIC解决方案
  6. UI标签库专题三:JEECG智能开发平台 FormValidation(表单提交及验证标签)
  7. python控制鼠标_Python直接控制鼠标键盘模块 pyautogui
  8. css - 布局 - rem布局
  9. 测试驱动开发(TDD)实践与技巧
  10. Python with as用法详解
  11. MFC界面编程基础(08):菜单(一)
  12. 基于Python的电影数据可视化分析系统 设计报告+答辩PPT+项目源码
  13. 随笔6 崇拜轩昂神有感
  14. [WC2021] 斐波那契——数论、斐波那契数列
  15. python爬虫登录网站_主流网站 Python 爬虫模拟登陆方法汇总
  16. C语言实现超长整数减法
  17. Android自动化测试工具SoloPi
  18. wkhtmltopdf 网页转换为pdf
  19. BaiduPCS-Go 使用CMD命令行全速下载百度云
  20. python制作电子相册的软件_请问:制作电子相册的这个软件是不是不支持试用呢?...

热门文章

  1. npm ERR! code ENOENTnpm ERR! syscall open
  2. java git打包iOS_懒人做iOS系列之jenkins+git+fir打包(xCode9)
  3. java poi 导出xlsx_java 使用poi存储Excel(.xlsx格式)
  4. Xft字体库:体系结构及用户指南(转)
  5. 大专毕业,一年工作经验,每天都是CRUD。如何实现月薪从7k到10k?
  6. android高仿微信聊天消息列表自由复制文字,双击查看文本内容
  7. 信息熵、相对熵(KL散度)、交叉熵、条件熵、互信息、联合熵
  8. 红米 Redmi 6A 在 HbuilderX 上进行真机调试
  9. zimbra邮件服务器配置,zimbra邮箱服务器搭建使用一年左右的
  10. 工程师解密:实例分析数控机床故障及排除