【问题标题】:Scaning through all element without using index不使用索引扫描所有元素
【发布时间】:2018-03-15 11:01:23
【问题描述】:

我正在使用 gremlin scala 和 orientdb。我想用标签搜索所有顶点。我有超过一定数量的顶点开始需要一段时间才能获得一些结果(10 秒或更长时间)。

  • 标签为 A 的类数为 6
  • 标签为 B 的类数为 10 000

我的问题是 A 上的操作和 B 上一样慢,我不知道为什么。

  • g.V.hasLabel("A").toList()

  • g.V.has("class","A").toList()

  • g.V.hasLabel("B").toList()

  • g.V.has("class","B").toList()

this thread 中写到了这一点。它很慢,因为它就像全表扫描。但看起来它需要 g.V 步骤中的所有顶点,然后开始排序。

【问题讨论】:

    标签: scala orientdb gremlin


    【解决方案1】:

    大多数图形数据库不会优化仅依赖于顶点标签的遍历。这很可能是这种情况,因为您正在获取完整的顶点列表,然后在内存中的标签上进行过滤。如果 OrientDB 能够通过标签快速检索计数,那么应该修改 orientdb-gremlin 以支持该功能并公开该功能。

    Apache TinkerPop 允许图形数据库通过 TraversalStrategy 实现展示其优势和独特特性。策略在执行之前进行遍历,并允许图数据库根据其特性对其进行优化。

    例如,考虑一下 TinkerGraph - 它能够非常快速地获取全局计数,因为它由内存中的 Map 提供支持。因此,我们开发了TinkerGraphCountStrategy,它将标准的count() 步骤替换为TinkerGraph 优化的步骤,可以直接访问Map。当对 TinkerGraph 执行 g.V().count()(或 g.E().count())的变体时,不再进行全表扫描 - 您只需立即获得计数。

    【讨论】:

    • 问题是没有标签的过滤..他希望内存中所有具有相同标签的顶点,但它看起来像是将所有顶点都放入内存而不是按标签过滤..
    • 我认为这与我写的一致。它以这种方式工作并不让我感到惊讶。正如我所说,我不知道在按标签请求图形元素时许多图形的行为不同 - 所有顶点都被返回,然后在 has 步骤中过滤。如果一个特定的图可以优化它,那么他们需要开发一个TraversalStrategy 来公开该性能增强,只返回带有该标签的顶点。换句话说,TinkerPop/Gremlin 无法解决这个问题。这是底层图形数据库的问题,在这种情况下是 OrientDB。
    • 但是图形工作室中的相同请求(直接到 OrientDB)很快......但只有 gremlin 慢到 10 秒。这不是 OrientDB 的问题。
    • 我很抱歉 - 也许我不清楚。如果 OrientDB 本身对获取“按标签的顶点”的查询速度很快,那么需要修改 orientdb-gremlin 以在 Gremlin 查询中启用相同的速度。 orientdb-gremlin 需要实现一个 TinkerPop TraversalStrategy 优化 g.V().hasLabel() 以“快速”。所以,我并不是说这是 OrientDB 本身的问题 - 这是 orientdb-gremlin 的问题。这有意义吗?
    • orientdb-gremlin 已经有一个策略 - github.com/orientechnologies/orientdb-gremlin/blob/… 并且它基本上植入了这一步 github.com/orientechnologies/orientdb-gremlin/blob/… - OrientGraphStep 是否进行了优化以在工作室中获得性能?
    猜你喜欢
    • 1970-01-01
    • 2020-02-14
    • 2020-09-06
    • 2011-06-28
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多