我们现在遇到了一种情况。假定有TagA->TagB->TagC,TagA->TagB->TagD->TagC,TagA->TagD->TagC这样的多条路径。我们执行find shortest path from vertexA to vertexC1,vertexC2,vertexC3,vertexC4,vertexC5,vertexC6 over *。其中确实存在点A到点C1,C2,C3的路径。
如果执行不同的语句:
find shortest path from vertexA to vertexC1,vertexC2,vertexC3,vertexC4,vertexC5,vertexC6 over *; 需要130ms
find shortest path from vertexA to vertexC1,vertexC2,vertexC3 over *; 需要5ms
find shortest path from vertexA to vertexC4,vertexC5,vertexC6 over *; 需要3ms
这种情况给我们的接口可用性带来了极大的困扰。具体执行的结果如下图:
尝试了几个,看起来这个语句的执行效率不仅仅与起点能够连到的节点有关,并不是一个简单的广度优先搜索。能够到达终点的连通图的复杂度也会影响这个语句的执行效率。我们这边的场景是使用nebula进行员工是否有某一个权限的判断,在人-角色-权限的路径外加了一条人-邮件组-角色-权限。然后有以下场景:
1、员工通过一个邮件组获得了一个角色和一个权限,这个邮件组关联了公司大部分人(超过两万),执行find all path from 员工 to 权限 over * ,大约用了160ms;
2、还是同样的员工,但权限通过所有路径关联的员工减少到10人以下,查询任意该员工能关联到的权限,都不会超过5ms;
3、还是同样的员工,权限通过所有路径关联的员工也在10人以下,但是这些权限都是该员工不可达的,这些权限任意组合,不会超过5ms;
4、将2,3两步的权限混合组合,执行时间也不超过5ms;
5、还是该员工,权限通过角色关联了400个员工,但该员工与该权限无连通。执行find path最终耗时90ms