Gremlin相关查询会降低性能

时间:2019-10-24 20:58:36

标签: gremlin

我知道实施细节是这个问题的因素,但是我也意识到我在这里可能做错了什么。如果是这样,我能做得更好吗?如果Gremlin具有一些我不知道的多结果集提交查询批处理功能,则可以解决该问题。就像Gremlin一样,并行运行这三个查询并将结果提供给我。

从本质上讲,我需要知道某个顶点何时具有一定的边缘,如果它没有该边缘,则需要拉一个空白。所以...

g.V().as("v").coalesce(outE("someLabel").has("someProperty","someValue"),constant()).as("e").select("v","e")

该查询比简单地使用以下方法获得优势要高 10倍

g.V().outE("someLabel").has("someProperty","someValue")

因此,如果我想获得一组具有其边缘或空白占位符的顶点,则有两个选择:进行两个离散查询并“联接” API中的数据或进行一个非常昂贵的查询。

我的假设是,在Gremlin中,我们“ 一次旅行” ,实际上这可能是完全错误的。也就是说,我也知道在API中撤回大量数据并有效地进行联接是不好的做法,因为它破坏了封装主体。这还会增加往返开销。

3 个答案:

答案 0 :(得分:0)

好的,所以我找到了一个荒谬但快速的解决方案。它涉及遍历遍历,因此,如果有更好的方法,让我先道歉...

g.inject(true).
union(
  __.V().not(outE("someLabel")).constant().as("ridiculous"),
  __.V().outE("someLabel").as("ridiculous")
).
select("ridiculous")

本质上,我必须编写两次查询。一次用于我想要的边缘遍历,再一次用于缺少边缘的遍历。因此,如果我有n个存在/不存在的检查,我将需要2 ^ n个查询副本,每个副本都有其自己的检查组合,以便获得最佳性能。不幸的是,采用这种方法会带来堆栈溢出的风险,更不用说使代码无法可靠地管理了。

答案 1 :(得分:0)

您的原始查询返回了顶点边对,而答案只返回边。

您可以运行g.E().hasLabel("somelabel")以获得相同的结果。

可能比原始查询更快的替代方法是:

g.E().hasLabel("somelabel").as("e").outV().as("v").select("v","e")

g.V().as("v").outE("somelabel").as("e").select("v","e")

答案 2 :(得分:0)

  

如果Gremlin有一些我不知道的多结果提交查询批处理功能,那就可以解决问题

Gremlin / TinkerPop没有内置这种功能。至少有一个图形确实具有某种形式的Gremlin批处理-DataStax图形...对其他图形不确定。

我也不确定我是否真的有任何答案可能对您有用,但是我不希望这两个遍历之间的性能差异达到10倍,但我希望第一个遍历在大多数图形数据库上会更差。基本上,将命名步骤与as()一起使用可对遍历进行路径计算要求,从而增加了成本。优化Gremlin时,我最早的步骤之一就是尝试寻找方法来排除可能会做的任何事情。

这个问题似乎与您在Jagged Result Array上的另一个问题有关,但是我无法将上下文从一个问题保留到另一个问题,以了解如何进一步阐述。

相关问题