分区策略对 Gremlin 遍历性能有帮助吗

Does partition strategy helps on Gremlin traversal performance

我尝试使用这里提到的分区策略https://tinkerpop.apache.org/docs/current/reference/。最初,我希望当我为一个区域定义一个特定的分区键并在上面写一些顶点时,它会索引该特定区域并改进顶点查找。最终,我意识到分区键就像在顶点中定义的另一个 属性 值。换句话说,这些代码不过是 属性 值查找,导致全图遍历扫描:

g.withStrategies(new PartitionStrategy(partitionKey: "_partition", writePartition: "a", 
                                     readPartitions: ["a"]));

我不确定这个分区策略的底层逻辑是什么,但如果它真的进行全图扫描,它似乎并没有改进查找。如果我错了请纠正我

从 TinkerPop 的角度来看,PartitionStrategy 只是自动修改您的 Gremlin 以利用图表中的特定 属性。 TinkerPop 对图形数据库的底层索引功能一无所知,也没有实现任何功能。优化这些事情取决于你的图表。有些图表可能会自行完成,有些可能会为您提供创建索引的机会,这将有助于提高 PartitionStrategy 的速度,而其他图表可能什么都不做,让 PartitionStrategy 对所有人都不起作用用例。

回到 TinkerPop 的观点,PartitionStrategy(以及 SubgraphStrategy 的目标)更多的是简化为部分图形需要的用例编写 Gremlin 的方式被隐藏。没有它,您将在遍历中混入大量重复过滤器,这会影响其可读性。

考虑这段代码:

graph = TinkerGraph.open()
strategy = new PartitionStrategy(partitionKey: "_partition", writePartition: "a", readPartitions: ["a"])
g = traversal().withEmbedded(graph).withStrategies(strategy)
g.addV().addE('link')
g.V().out().out().out()

遍历非常可读且简单明了。意图很容易理解——三步跳。但这并不是真正执行的遍历。执行的是:

g.V().out().has('_partition',within("a")).
  out().has('_partition',within("a")).
  out().has('_partition',within("a"))

如果您正在使用 PartitionStrategy,那么您需要确保它适合您的图形数据库以及您的用例。