0

我在 Cassandra 上使用 Rexster/TITAN 0.4。顶点键使用标准索引进行索引,如下所示。g.makeKey("domain").dataType(String.class).indexed("standard", Vertex.class).make(); 我没有将唯一性用于性能和可伸缩性。图中大约有 10M 个顶点。

我的要求是遍历每个顶点并确定是否有重复项,然后将其删除。有没有办法直接从已经存在的索引中获取排序的顶点列表。类似于“直接索引查询”的索引(标准 TITAN 索引)的直接查询。这样我就可以将整个顶点分成更小的批次并单独处理。

如果不可能,实现这一目标的最佳方法是什么。我不想使用 Titan-Hadoop 或类似的解决方案来查找/删除图中的重复项。

我想运行以下查询以按排序顺序获取 1000 个顶点。

gremlin> g.V.has('domain').domain.order[0..1000]

WARN  com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx  - Query requires iterating over all vertice
s [(domain <> null)]. For better performance, use indexes

但是这个查询没有使用在 'domain' 上创建的标准索引,并且无法运行,出现内存不足的异常。我在图中有~10M 个顶点。

在这种特殊情况下,如何强制 gremlin 使用索引?

4

1 回答 1

1

答案与我在您上一个问题的评论中提供的答案相同:

  1. 在问题上投入更多内存(即增加-Xmx控制台或运行查询的任何应用程序)——这将是一个短期解决方案。
  2. 使用泰坦-hadoop。
  3. 以某种方式重组您的图表或查询以允许使用索引。这可能意味着放弃一些插入性能并使用唯一性锁。也许您不必删除源数据中的重复项——也许您可以在遍历时在 Gremlin 查询中对它们进行重复数据删除。关键是你需要有创造力。

尽管您不愿意使用 titan-hadoop 并且不想将其用于“仅用于查找/删除图中的重复项”,但这正是它擅长的用例。您有一个必须迭代所有顶点的批处理过程,并且它不适合您分配的内存,并且您不想使用 titan-hadoop。这有点像说:“我有钉子和锤子,但我不想用锤子敲钉子。” :)

在这种特殊情况下,如何强制 gremlin 使用索引?

gremlin 没有办法做到这一点。理论上,可能有一种方法可以尝试直接从 Cassandra 读取(绕过 Titan),解码二进制结果并以某种方式迭代和删除,但我不知道。即使你想通了,这意味着需要花费大量时间深入 Titan 的深处以查看如何读取索引数据,这将是一个 hack,在你升级 Titan 的任何时候都可能破坏,作为核心当您以一种意想不到的方式绕过 Titan 时,开发人员可能会随时关闭您的通道。

最好的选择是简单地使用 titan-hadoop 来解决您的问题。除非您的图表完全是静态的并且不再增长,否则您将达到一个不可避免的地步。当你有 100M+ 边时,你将如何确保你的图正确增长?您将如何收集有关您的数据的全球统计数据?您将如何修复因代码中的错误而进入数据库的不良数据?当您的图表达到一定规模时,所有这些事情都会成为问题,而此时,titan-hadoop 是您唯一的朋友。

于 2015-05-21T10:56:29.293 回答