如何直接查询Titan索引(标准)以按排序顺序检索顶点

时间:2015-05-20 14:38:45

标签: graph-databases titan gremlin rexster

我在Cassandra上使用Rexster / TITAN 0.4。 使用标准索引对顶点键进行索引,如下所示。 g.makeKey(“domain”)。dataType(String.class).indexed(“standard”,Vertex.class).make(); 我没有使用Uniqueness来提高性能和可扩展性。 图中有大约10M个顶点。

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

如果不可能,实现这一目标的最佳方法是什么。 我不想使用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

此查询未使用在“域”上创建的标准索引,并且无法运行,从而导致内存不足异常。我在图中有~10M顶点。

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

1 个答案:

答案 0 :(得分:1)

答案与我之前question的评论中提供的答案相同:

  1. 在问题上投入更多内存(即将-Xmx增加到控制台或运行查询的任何应用程序) - 这将是一个短期解决方案。
  2. 使用titan-hadoop。
  3. 以某种方式重构图表或查询以允许使用索引。这可能意味着放弃插入和使用唯一性锁定的一些性能。也许您不必删除源数据中的重复项 - 也许您可以在遍历时在Gremlin查询中对它们进行重复删除。关键是你需要有创意。
  4. 尽管你不愿意使用titan-hadoop并且不想用它来“只是为了查找/删除图表中的重复项”,这就是它擅长的确切用例。你有一个批处理过程必须迭代所有顶点,它不能适合你分配的内存,你不想使用titan-hadoop。这有点像说:“我有一个钉子和一把锤子,但我不想用锤子钉在钉子上。” :)

      

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

    gremlin无法做到这一点。理论上,可能有一种方法可以尝试直接从Cassandra读取(绕过Titan),解码二进制结果并以某种方式迭代和删除,但我不知道。即使你想出来,这意味着要花费很多时间试图深入了解Titan的深度,看看如何阅读索引数据,这将是一个黑客,你可能会在任何时候升级Titan,作为核心当你以意想不到的方式绕过泰坦时,开发者可能随时关闭这条道路。

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