日常中,我们经常听说过,我想认识xxx人,最少通过1个人可以认识别人,最多通过6个人可以认识某人。这里就体现的是生活中,所有人与人之间其实都是有联系的。比如:
张三认识李四,李四认识王五 张三认识赵六,赵六认识田七,田七认识王五
那么张三想要认识王五,只需要通过李四就可以认识王五了。这就是最短路径。所以接下来我们演示一下这里的场景。由于需要造比较多的数据,形成复杂的关系,所以这里我们使用网上的数据案例。整体流程如下:
一、创建多个节点和关系网络
这里我们模拟创建多个节点和关系网络,示例数据如下:
create (小北:Person{name:"小北", likes:"Poetry"}), (小菲:Person{name:"小菲", likes:"Science Fiction"}), (小鹏:Person{name:"小鹏", likes:"Music"}), (小颖:Person{name:"小颖", likes:"Politics"}), (小兰:Person{name:"小兰", likes:"Music"}), (小峰:Person{name:"小峰", likes:"Travel"}), (小讯:Person{name:"小讯", likes:"Poetry"}), (小东:Person{name:"小东", likes:"Sequential Art"}), (小唯:Person{name:"小唯", likes:"Young Adult"}), (小窦:Person{name:"小窦", likes:"Poetry"}), (小齐:Person{name:"小齐", likes:"Default"}), (小林:Person{name:"小林", likes:"Poetry"}), (小锐:Person{name:"小锐", likes:"Default"}), (小伟:Person{name:"小伟", likes:"Young Adult"}), (小玲:Person{name:"小玲", likes:"Business"}), (小讯)-[:认识]->(小窦), (小讯)-[:认识]->(小齐), (小讯)-[:认识]->(小林), (小讯)-[:认识]->(小鹏), (小讯)-[:认识]->(小伟), (小讯)-[:认识]->(小峰), (小菲)-[:认识]->(小鹏), (小菲)-[:认识]->(小峰), (小菲)-[:认识]->(小唯), (小峰)-[:认识]->(小北), (小峰)-[:认识]->(小兰), (小东)-[:认识]->(小林), (小东)-[:认识]->(小锐), (小东)-[:认识]->(小菲), (小鹏)-[:认识]->(小颖), (小北)-[:认识]->(小兰), (小颖)-[:认识]->(小东), (小唯)-[:认识]->(小鹏), (小唯)-[:认识]->(小锐), (小伟)-[:认识]->(小玲)
创建完成之后,我们可以看到整个关系网络的复杂度,示例图如下:
二、思考场景
从上图看出,如果小菲想要认识小锐的话,他可以选择的最短途径有:
小讯->小林->小东-小锐
有这两种途径,这里由于数据量比较少,我们看的比较直观,但是如果有成千上万的人和关系,我们如何来找你?是不是有走迷宫的感觉?所以接下来我们使用neo4j的最短路径方法来查找下。
三、使用neo4j最短路径查找
最短路径查找的话,主要使用的shortestPath函数,下面我们来演示一下:
MATCH (a:Person{name:"小讯"}),(b:Person{name:"小锐"}), p=shortestpath((a)-[*]-(b)) RETURN p
执行之后我们就找到了对应的效果:
这就是最短路径。当然上诉的展示可能不全,有人会说还有一条路径是:
小讯->小鹏->小唯->小锐
这里要说明一下:由于这里有两个路径都是深度为3,所以对于neo4j来说,最短路径是满足要求即可,如果想要找到所有的路径的话,则我们可以定义,用如下的方法:
MATCH (a:Person{name:"小讯"}),(b:Person{name:"小锐"}), p=(a)-[*3]-(b) RETURN p
执行后如下图:
这里最短关系对应路径如下:
使用这种方式的话,我们一般主要是自定义需求,例如我想通过3层深度关系找到两个人建立的关系。就可以使用这个方法。比如我想通过4层关系找到小讯和小锐之间的关系,那么把查询语言修改为4即可:
MATCH (a:Person{name:"小讯"}),(b:Person{name:"小锐"}), p=(a)-[*4]-(b) RETURN p
查询结果如下:
4层关系对应的内容如下:
备注:
1、这里我们的最短路径查询演示的时候可以看到关系是没有指向的
也就是查询语句里面没有带箭头方向,所以这里查询主要以有关联为主,如果我们希望有明确的指向的话,比如只能是a认识b,b认识c,c认识d,然后a认识d这种有方向的话,我们就需要在查询语句里面添加箭头,示例如下:
MATCH (a:Person{name:"小讯"}),(b:Person{name:"小锐"}), p=shortestpath((a)-[*]->(b)) RETURN p
查询结果就可以看到强制有指向了
所以对于最短路径来说,还是要根据实际场景来判断是否需要有明确的指向。
还没有评论,来说两句吧...