【发布时间】:2018-09-07 18:24:59
【问题描述】:
我们需要有一些 AQL 来验证实体的特定路径。由于需要扫描整个集合,当前的解决方案性能很差。
例如这里我们有 3 个实体“类型”:a、b、c(尽管它们都在一个集合中)和它们之间的特定边集合,我们想确定 _key "123" 和 _key " 之间是否存在连接234" 完全通过 a -> b -> c。
FOR a IN entities FILTER e._key == "123"
FOR b IN 1..1 OUTBOUND e edges_a_to_b
FOR c IN 1..1 INBOUND e_1 edges_c_to_b
FILTER e_2._key == "234"
...
这会很快散开!
我们有另一个解决方案,我们使用 SHORTEST PATH 并指定适当的 DIRECTION 和边缘集合,这要快得多(>100 倍)。但担心这种方法不能完全满足我们的一般情况......边的顺序没有强制执行,我们可能不得不多次通过同一个边集合,而我们不能用这种语法来做到这一点。
还有其他方法,可能涉及遍历中的路径?
谢谢! 丹。
【问题讨论】:
-
the order of the edges is not enforced是什么意思?可以从 B 类节点到 C 类节点的边缘点,但也可以反过来,从 C 到 B?或者可能存在多个(最短)路径并且您需要检查特定路径?如果是这样,测试特定路径的原因是什么?路径上的边缘是否有过滤条件? -
该应用程序用于一般安全检查。想象一下全科医生,其中类型是手术、医生、患者。医生可以管理他自己的患者(医生 -> 患者),但只能读取他的其他医生的患者(医生 -> 手术 -> 医生 -> 患者)。需要知道个别医生和患者是否被第一个病例或第二个病例联系起来。对于我们的实际情况,这个安全检查可能会多次命中同一个关系对,并且可能存在更短的路径,不满足表达的关系条件。
-
不需要对边缘进行过滤。
标签: arangodb