【问题标题】:How to Query a Titan index(standard) directly to retrieve vertices in sorted order如何直接查询 Titan 索引(标准)以按排序顺序检索顶点
【发布时间】:2015-08-01 21:21:46
【问题描述】:

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

我的要求是遍历每个顶点并确定是否有重复项,然后将其删除。 有没有办法直接从已经存在的索引中获取排序的顶点列表。 对索引(标准 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

此查询未使用在“域”上创建的标准索引,并且无法运行,出现内存不足异常。我在图中有大约 1000 万个顶点。

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

【问题讨论】:

    标签: graph-databases titan gremlin rexster


    【解决方案1】:

    答案和我在你之前question的cmet中提供的一样:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-26
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多