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

时间:2018-03-15 11:01:23

标签: scala orientdb gremlin

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

  • 标签A的班级数为6
  • 标签B的班级数为10 000

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

  • g.V.hasLabel( “A”)。toList()

  • g.V.has( “类”, “A”)。toList()

  • g.V.hasLabel( “B”)。toList()

  • g.V.has( “类”, “B”)。toList()

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

1 个答案:

答案 0 :(得分:2)

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

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

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