Gremlin:哪个更快? within() 或 out().in()
Gremlin: Which one is faster? within() or 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
一个使用 within() 另一个执行 out() 和 in() 两个步骤,我想知道哪个更快所以我可以决定使用哪个,这两个选项在许多查询中都是可能的我的申请。
编辑:
I 运行 gremlin 控制台中的两个查询都在末尾使用 profile() 步骤但是 >TOTAL
字段给出了从 0.300 毫秒开始的 运行dom 时间数字两个查询都为 1.220 毫秒,因此我不知道如何比较 2 个查询的性能。
我将在此处提供一个一般性答案,该答案主要来自对问题本身的评论。 profile()
一张图然后将这些结果投影到另一张图上确实是不可能的。它们各自具有不同的功能和性能特征。如果您需要知道两种查询方法中哪一种更好,那么您必须在您打算定位的图形系统上测试这两种遍历。
我也会担心在特定的开发方向上走得太远而没有对目标图进行持续测试。正如您不会在 MySQL 上进行所有开发,只是为了在投入生产时切换到 Oracle 一样,您真的不应该尝试根据您不打算构建的图表构建整个应用程序采用。这些系统之间存在细微差别,可能会对您产生重大影响。
至于 TinkerGraph 上 profile()
时间的差异,JVM 上必然存在时间差异,因为我猜这是对驻留在内存中的小型数据集的测试。或者对于 TinkerGraph,这两种方法之间可能没有显着差异。考虑尝试执行查询几千次并平均所花费的时间并进行比较。 Gremlin 控制台有一个 clock()
功能可以帮助解决这个问题。当然,正如我之前提到的,你所学到的东西并不能保证你在 Neptune 上有正确的解决方案。
如果您想对您的查询进行一些分析,我可以提供几句话(尽管我没有将这种想法专门基于海王星)。每个的执行方式在很大程度上取决于您的图形结构,但我认为我会是第一个更快的查询,因为它捕获“阻塞”的顶点:
.out("blocked").fold()
和 re-use 一遍又一遍,无论有多少 V().hasLabel('user')
。但这只是一种直觉。我猜对于单个用户来说,阻止列表将相对较小,因此遍历相反的方式:
out("subscribed").in("blocked")
只会更昂贵,因为您将不得不遍历更多不以初始顶点终止的“阻塞”边。
我的应用程序中有一个用户搜索功能,搜索者不想看到某些结果,他通过“阻止”标签来做到这一点,当阻止所有“订阅”该标签的用户时在他的搜索结果中将被忽略。
我正在编写查询来过滤搜索结果,我发现了两种获得相同结果的方法:
第一个:
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
一个使用 within() 另一个执行 out() 和 in() 两个步骤,我想知道哪个更快所以我可以决定使用哪个,这两个选项在许多查询中都是可能的我的申请。
编辑:
I 运行 gremlin 控制台中的两个查询都在末尾使用 profile() 步骤但是 >TOTAL
字段给出了从 0.300 毫秒开始的 运行dom 时间数字两个查询都为 1.220 毫秒,因此我不知道如何比较 2 个查询的性能。
我将在此处提供一个一般性答案,该答案主要来自对问题本身的评论。 profile()
一张图然后将这些结果投影到另一张图上确实是不可能的。它们各自具有不同的功能和性能特征。如果您需要知道两种查询方法中哪一种更好,那么您必须在您打算定位的图形系统上测试这两种遍历。
我也会担心在特定的开发方向上走得太远而没有对目标图进行持续测试。正如您不会在 MySQL 上进行所有开发,只是为了在投入生产时切换到 Oracle 一样,您真的不应该尝试根据您不打算构建的图表构建整个应用程序采用。这些系统之间存在细微差别,可能会对您产生重大影响。
至于 TinkerGraph 上 profile()
时间的差异,JVM 上必然存在时间差异,因为我猜这是对驻留在内存中的小型数据集的测试。或者对于 TinkerGraph,这两种方法之间可能没有显着差异。考虑尝试执行查询几千次并平均所花费的时间并进行比较。 Gremlin 控制台有一个 clock()
功能可以帮助解决这个问题。当然,正如我之前提到的,你所学到的东西并不能保证你在 Neptune 上有正确的解决方案。
如果您想对您的查询进行一些分析,我可以提供几句话(尽管我没有将这种想法专门基于海王星)。每个的执行方式在很大程度上取决于您的图形结构,但我认为我会是第一个更快的查询,因为它捕获“阻塞”的顶点:
.out("blocked").fold()
和 re-use 一遍又一遍,无论有多少 V().hasLabel('user')
。但这只是一种直觉。我猜对于单个用户来说,阻止列表将相对较小,因此遍历相反的方式:
out("subscribed").in("blocked")
只会更昂贵,因为您将不得不遍历更多不以初始顶点终止的“阻塞”边。