我在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使用索引?
答案 0 :(得分:1)
答案与我之前question的评论中提供的答案相同:
-Xmx
增加到控制台或运行查询的任何应用程序) - 这将是一个短期解决方案。尽管你不愿意使用titan-hadoop并且不想用它来“只是为了查找/删除图表中的重复项”,这就是它擅长的确切用例。你有一个批处理过程必须迭代所有顶点,它不能适合你分配的内存,你不想使用titan-hadoop。这有点像说:“我有一个钉子和一把锤子,但我不想用锤子钉在钉子上。” :)
在这种特殊情况下,如何强制gremlin使用索引?
gremlin无法做到这一点。理论上,可能有一种方法可以尝试直接从Cassandra读取(绕过Titan),解码二进制结果并以某种方式迭代和删除,但我不知道。即使你想出来,这意味着要花费很多时间试图深入了解Titan的深度,看看如何阅读索引数据,这将是一个黑客,你可能会在任何时候升级Titan,作为核心当你以意想不到的方式绕过泰坦时,开发者可能随时关闭这条道路。
最好的选择是简单地使用titan-hadoop来解决您的问题。除非你的图表是完全静态的并且不再增长,否则你将达到titan-hadoop不可避免的程度。当您有100M +边缘时,您如何确保图表正确增长?您将如何收集有关数据的全球统计数据?您将如何修复从代码中的错误进入数据库的错误数据?当你的图表达到一定规模并且titan-hadoop是你此时唯一的朋友时,所有这些都会成为问题。