【问题标题】:Query based on index too slow基于索引的查询太慢
【发布时间】:2014-03-13 17:27:31
【问题描述】:

首先,我不是关于 Titan 和图形数据库的专家,因此我们将不胜感激。

目前我有大约 12.000.000 个顶点和 16.000.000 个边。我创建了 2 个索引,为 Vertex 创建了索引“fbid”,为边创建了索引“dateInMs”。

graph.makeKey("fbid").dataType(String.class).single().indexed(Vertex.class).unique().make();
graph.makeKey("dateInMs").dataType(Long.class).indexed(Edge.class).make();

然后,我运行了以下查询。

g.query().interval("dateInMs",1394247600000,1394420400000).edges()

其中的数字代表两个日期,单位为 ms(2014-03-08 和 2014-03-10)

由于我是根据索引字段进行查询,因此我期待快速响应,但是查询太慢了,所以我不知道是预期结果还是我做错了什么。

注意:当我运行查询时,我收到以下消息:com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx - Query requires iterating over all vertices [(dateInMs >= 1394247600000 AND dateInMs < 1394420400000)]. For better performance, use indexes,

但是我使用的是索引 dateInMs。

有什么线索吗?

【问题讨论】:

    标签: performance graph titan


    【解决方案1】:

    请看:Titan Limitations

    边缘检索不是 O(1)

    通过 id 检索边缘,例如 tx.getEdge(edge.getId()),不是 恒定时间操作。 Titan 将检索 要检索的边,然后执行顶点查询以识别 边缘。前者是常数时间,但后者可能是线性的 在具有相同边的顶点上入射的边数 标签。

    这也适用于通过标准或 外部索引。

    这种行为的原因是 Titan 存储顶点和边的方式(请参阅Data Model)。只有顶点可以直接访问(O(1))。

    底线:即使您有属性的边缘索引,Titan 仍然必须遍历所有相邻顶点以通过 id 识别边缘。

    尝试更改您的架构,以便您可以查询可以继续遍历的顶点。

    干杯, 丹尼尔

    【讨论】:

    • 感谢您的评论!我注意到我还是错过了外部索引配置,但是您的输入非常有帮助,所以我将更改模型设计。
    • g.query().interval("dateInMs",1394247600000,1394420400000).vertices() 这个查询会是一个不错的选择并且比.edges()更快吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2019-01-27
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多