在不使用索引的情况下扫描所有元素



我正在使用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()

在这个线程中写到了这一点。它很慢,因为它就像全表扫描。但看起来它以 g.V 步长获取所有顶点,然后开始排序。

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

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

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

最新更新