我正在使用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()
)的变体时,不再有全表扫描 - 你只需立即计数。