Gremlin 小精灵:哪一个更快?in()或out().in()中

Gremlin 小精灵:哪一个更快?in()或out().in()中,gremlin,tinkerpop,tinkerpop3,gremlin-server,amazon-neptune,Gremlin,Tinkerpop,Tinkerpop3,Gremlin Server,Amazon Neptune,我的应用程序中有一个用户搜索功能,搜索者不想看到一些结果,他通过“阻止”一个标签来实现这一点,当阻止一个标签时,所有“订阅”该标签的用户都将在他的搜索结果中被忽略 我编写查询是为了过滤搜索结果,我找到了两种获得相同结果的方法: 第一: g.V(1991) .out("blocked").fold().as("blockedTags") .V().hasLabel("user") .not( where( out(

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

我编写查询是为了过滤搜索结果,我找到了两种获得相同结果的方法:

第一:

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")
    )
)
小鬼化:

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

编辑:


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

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

在特定的开发方向上,如果不在目标图上进行持续的测试,我也会小心走得太远。正如您不会在MySQL上进行所有开发,只是在投入生产时切换到Oracle一样,您确实不应该尝试根据您不打算使用的图形构建整个应用程序。这些系统之间存在细微的差异,可能会对你产生重大影响

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

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

.out("blocked").fold()
无论有多少
V().hasLabel('user')
都要反复使用它。不过,这只是一种直觉。我猜对于单个用户来说,阻止列表相对较小,因此使用以下相反的方式:

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

这样做的代价会更高,因为您将必须遍历更多不以初始顶点终止的“阻塞”边。

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

在特定的开发方向上,如果不在目标图上进行持续的测试,我也会小心走得太远。正如您不会在MySQL上进行所有开发,只是在投入生产时切换到Oracle一样,您确实不应该尝试根据您不打算使用的图形构建整个应用程序。这些系统之间存在细微的差异,可能会对你产生重大影响

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

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

.out("blocked").fold()
无论有多少
V().hasLabel('user')
都要反复使用它。不过,这只是一种直觉。我猜对于单个用户来说,阻止列表相对较小,因此使用以下相反的方式:

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

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

分析此类问题的一个好方法是分析查询。您是否尝试过将查询发送到/status端点并观察到任何差异?我还没有在Neptune上运行代码,我仍在使用本地主机中的gremlin server进行开发。在gremlin consoleOK中运行profile()步骤后,我用我的结果编辑了这个问题,我指的是上面的/profile而不是/Status,我再次编辑了我的问题,因为在多次执行profile()之后,它给出了两个查询的随机执行时间,从问题的标签上看,您似乎正在使用Amazon Neptune。Neptune有一个/profile端点,您可以使用curl或从Neptune笔记本(workbench)向其发送查询。这将更深入地了解查询计划器是如何处理查询的。总的来说就是这样