首页 > 解决方案 > Gremlin:哪个更快?inside() 或 out().in()

问题描述

我的应用程序中有一个用户搜索功能,搜索者不想看到某些结果,他通过“阻止”一个标签来做到这一点,当阻止一个标签时,所有“订阅”该标签的用户都将在他的搜索结果。

我正在编写查询来过滤搜索结果,我发现了两种获得相同结果的方法:

第一的:

g.V(1991)
.out("blocked").fold().as("blockedTags")
.V().hasLabel("user")
.not(
    where(
        out("subscribed").where(
            within("blockedTags")
        )
    )
)

第二:

 g.V(1991).as("user")
 .V().hasLabel("user")
 .not(
    where(
        out("subscribed")
        .in("blocked")
        .as("user")
    )
)

Gremlify:https ://gremlify.com/xnqhvtzo6b

一个使用 inside(),另一个执行 2 个步骤 out() 和 in(),我想知道哪个更快,所以我可以决定使用哪个,这两个选项在我的应用程序的许多查询中都是可能的。

编辑:

我在 gremlin 控制台中运行了两个查询,最后使用 profile() 步骤,但该>TOTAL字段为两个查询提供了从 0.300ms 到 1.220ms 的随机时间数,因此我不知道如何比较 2 个查询的性能。

标签: gremlintinkerpoptinkerpop3gremlin-serveramazon-neptune

解决方案


我将在这里提供一个一般性的答案,该答案主要来自对问题本身的评论。确实不可能profile()绘制一张图,然后将这些结果投影到另一张图上。它们各自具有不同的功能和性能特征。如果您需要知道两种查询方法中的哪一种更好,那么您必须在您打算定位的图形系统上测试这两种遍历。

如果不对目标图进行持续测试,我也会警惕在特定开发方向上走得太远。正如您不会在 MySQL 上进行所有开发,只是在需要投入生产时切换到 Oracle,您真的不应该尝试针对您不打算使用的图构建整个应用程序。这些系统中存在细微的差异,可能会对您产生重大影响。

至于profile()TinkerGraph 上的时间差异,JVM 上肯定会存在时间差异,因为我猜这是对驻留在内存中的小数据集的测试。或者对于 TinkerGraph 来说,这两种方法之间没有显着差异。考虑尝试执行几千次查询并平均花费的时间并进行比较。Gremlin Console 有一个clock()功能可以帮助解决这个问题。当然,正如我之前提到的,你所学到的东西并不能保证你在海王星上有正确的解决方案。

如果您想对您的查询进行一些分析,我可以提供几句话(尽管我没有将这种想法专门基于海王星)。每个执行的方式很大程度上取决于您的图形结构,但我认为我将是第一个更快的查询,因为它捕获“阻塞”顶点:

.out("blocked").fold()

并一遍又一遍地重复使用它,无论V().hasLabel('user')有多少。不过,这只是一种直觉。我猜阻止列表对于单个用户来说会相对较小,因此遍历相反的方式:

out("subscribed").in("blocked")

只会更昂贵,因为您将不得不遍历更多不以初始顶点终止的“阻塞”边。


推荐阅读