gremlin - 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 个查询的性能。
解决方案
我将在这里提供一个一般性的答案,该答案主要来自对问题本身的评论。确实不可能profile()
绘制一张图,然后将这些结果投影到另一张图上。它们各自具有不同的功能和性能特征。如果您需要知道两种查询方法中的哪一种更好,那么您必须在您打算定位的图形系统上测试这两种遍历。
如果不对目标图进行持续测试,我也会警惕在特定开发方向上走得太远。正如您不会在 MySQL 上进行所有开发,只是在需要投入生产时切换到 Oracle,您真的不应该尝试针对您不打算使用的图构建整个应用程序。这些系统中存在细微的差异,可能会对您产生重大影响。
至于profile()
TinkerGraph 上的时间差异,JVM 上肯定会存在时间差异,因为我猜这是对驻留在内存中的小数据集的测试。或者对于 TinkerGraph 来说,这两种方法之间没有显着差异。考虑尝试执行几千次查询并平均花费的时间并进行比较。Gremlin Console 有一个clock()
功能可以帮助解决这个问题。当然,正如我之前提到的,你所学到的东西并不能保证你在海王星上有正确的解决方案。
如果您想对您的查询进行一些分析,我可以提供几句话(尽管我没有将这种想法专门基于海王星)。每个执行的方式很大程度上取决于您的图形结构,但我认为我将是第一个更快的查询,因为它捕获“阻塞”顶点:
.out("blocked").fold()
并一遍又一遍地重复使用它,无论V().hasLabel('user')
有多少。不过,这只是一种直觉。我猜阻止列表对于单个用户来说会相对较小,因此遍历相反的方式:
out("subscribed").in("blocked")
只会更昂贵,因为您将不得不遍历更多不以初始顶点终止的“阻塞”边。
推荐阅读
- ios - 如何在我的 swiftui 应用程序中嵌入苹果的演示:Capturing Body Motion in 3D?
- dll - 当我重新加载解决方案时,Visual Studio 会删除文件
- c++ - Emacs - LSP compile_command.json 文件?
- speech-recognition - 识别音频文件中的重复句子
- mips - MIPS 试图换成单词
- ios - 如何在 Apollo GraphQL 0.49.1 for iOS 中添加标题
- php - 作曲家更新错误。您的要求无法解决为一组可安装的软件包
- c# - 如何在面板控件中指定图片框的位置而不是使用foreach?
- oracle - 本次查询结果的格式化时间
- delphi - Delphi - 泛型类型作为参数