六度理论是一个数学领域的猜想,名为Six Degrees of Separation,理论指出:你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过6个中间人你就能够认识任何一个陌生人。这就是六度分割理论,也叫小世界理论。
交往圈无论是在运营商还是在社交平台都发挥着举足轻重的作用,但交往圈由于其数据量庞大,社会交往关系网错综复杂,假设一个人平均交往10个人的话,6度模型扩散出去至少可以达到10万级,而运营商/社交平台的用户数都是百万级甚至数亿,由此形成的交往关系可达到数万亿,这样的数据量和运算量在关系数据库、在大数据平台中基本都是无法做到的。
neo4j提供了这种计算能力和扩展能力,本文的样例数据来自于《Neo4j权威指南》,本人也做了一些补充。
首先创建15个人,20条认识规则
代码语言:javascript复制CREATE
(小北:朋友圈{姓名:"小北"}),
(小菲:朋友圈{姓名:"小菲"}),
(小鹏:朋友圈{姓名:"小鹏"}),
(小颖:朋友圈{姓名:"小颖"}),
(小兰:朋友圈{姓名:"小兰"}),
(小峰:朋友圈{姓名:"小峰"}),
(小讯:朋友圈{姓名:"小讯"}),
(小东:朋友圈{姓名:"小东"}),
(小唯:朋友圈{姓名:"小唯"}),
(小窦:朋友圈{姓名:"小窦"}),
(小齐:朋友圈{姓名:"小齐"}),
(小林:朋友圈{姓名:"小林"}),
(小锐:朋友圈{姓名:"小锐"}),
(小伟:朋友圈{姓名:"小伟"}),
(小玲:朋友圈{姓名:"小玲"}),
(小讯)-[:认识]->(小窦),
(小讯)-[:认识]->(小齐),
(小讯)-[:认识]->(小林),
(小讯)-[:认识]->(小鹏),
(小讯)-[:认识]->(小伟),
(小讯)-[:认识]->(小峰),
(小菲)-[:认识]->(小鹏),
(小菲)-[:认识]->(小峰),
(小菲)-[:认识]->(小唯),
(小峰)-[:认识]->(小北),
(小峰)-[:认识]->(小兰),
(小东)-[:认识]->(小林),
(小东)-[:认识]->(小锐),
(小东)-[:认识]->(小菲),
(小鹏)-[:认识]->(小颖),
(小北)-[:认识]->(小兰),
(小颖)-[:认识]->(小东),
(小唯)-[:认识]->(小鹏),
(小唯)-[:认识]->(小锐),
(小唯)-[:认识]->(小玲)
展示整个朋友圈关系图
MATCH (n) RETURN n
MATCH n=(:朋友圈{姓名:"小峰"})-[*..6]-() RETURN n
由于数据量不大,交往圈尚未达到6度,所以返回六度数据等同于所有交往圈
展示一度关系
展示小讯直接认识的朋友
MATCH n=(:朋友圈{姓名:"小讯"})-[:认识]-() RETURN n
展示二度关系
展示小讯直接认识的朋友以及小讯认识的朋友的朋友
MATCH n=(:朋友圈{姓名:"小讯"})-[*..2]-() RETURN n
展示三度关系
展示小讯直接认识的朋友以及小讯认识的朋友的朋友以及小讯认识的朋友的朋友的朋友
MATCH n=(:朋友圈{姓名:"小讯"})-[*..3]-() RETURN n
展示相关人员
展示小讯可以通过朋友认识其他朋友的朋友
MATCH (n:朋友圈{姓名:"小讯"})-[:认识]-(other)-[:认识]-(otherother) RETURN other
展示小讯可以通过朋友认识的朋友的
MATCH (n:朋友圈{姓名:"小讯"})-[:认识]-(other)-[:认识]-(otherother) RETURN otherother
展示小讯可以通过朋友认识其他朋友的朋友和小讯的朋友
MATCH (n:朋友圈{姓名:"小讯"})-[:认识]-(other)-[:认识]-(otherother) RETURN other,otherother
展示小讯可以通过朋友认识其他朋友的朋友和小讯的朋友以及小讯
MATCH (n:朋友圈{姓名:"小讯"})-[:认识]-(other)-[:认识]-(otherother) RETURN n,other,otherother
依托社交网络搜寻两人之间的最短熟人路径
需要注意的是方向箭头,->代表有向,-代表无向
选择小讯和小锐之间的最短路径
MATCH n=shortestPath((小讯:朋友圈{姓名:"小讯"})-[*..6]->(小锐:朋友圈{姓名:"小锐"})) RETURN n
MATCH n=allshortestPaths((小讯:朋友圈{姓名:"小讯"})-[*..6]-(小锐:朋友圈{姓名:"小锐"})) RETURN n
MATCH n=allshortestPaths((小讯:朋友圈{姓名:"小讯"})-[*..6]-(小锐:朋友圈{姓名:"小菲"})) RETURN n