管理唯一性
遍历的唯一性问题决定在遍历期间能访问一个节点多少次。在Neo4j的遍历Api中有几个不同的唯一性设置,它们能作用于遍历中,这个问题之前已经稍微探讨过,这一节来详细了解下。
数据展示图如下:
NODE_GLOBAL唯一性
NODE_GLOBAL意味着每个节点只能访问一次并且在遍历期间只能访问一次
下面我们解决一个问题:找出将用户1(Jane)介绍给用户5(Leeo)的直接联系人
可以通过查看上图确认John时Jane网络中唯一能将塔介绍给Ben的人。
NODE_PATH唯一性
NODE_PATH意味着同一个节点在不同路径中可以多次被访问,但在同一路径中只能被访问一次
上面的程序进需要修改一行代码
从结果看出同一个节点John被遍历了两次,表示有两条路径可以到达目的地,下面修改下遍历查询,将之打印节点name属性修改成打印整个遍历路径,所用的代码之前已经贴出来过,这里直接使用就浩。
可以清楚的看出为什么会有两个John节点,它们来自不同的路径。
但是发现一个问题,再次修改成.uniqueness(Uniqueness.NODE_GLOBAL),并且打印出全路径,会发现输出结果为:
(1.Jane)–[KNOWS]–>(3.Kate)<–[KNOWS]–(2.John)
也就是说Neo4j并没有优先遍历最短路劲,也许是我想多了。
其他唯一性
- RELATIONSHIP_GLOBAL 图中每一个关系只能别访问一次
- RELATIONSHIP_PATH 与NODE_PATH类似
- NODE_RECENT 记忆访问过的节点有一个上线
- NODE_LEVEL 确保处于同一级的节点在遍历期间只能被访问一次
- RELATIONSHIP_LEVEL 确保处于统一级的关系在遍历期间只能被访问一次
其他唯一性使用场景可能不多,暂不深究了。
双向遍历
双向遍历是指分别从起始节点和结束节点同事开始遍历图,当这两个遍历相遇时(称作碰撞点),就完成了遍历,并且可以确定整个路径。
下面给出一个双向遍历的例子,以本章构造的数据为例,从起始节点1.John,遍历到结束节点5.Leeo
到此,深度遍历一章结束,在具体项目中该如何去遍历,还得自己琢磨了。