基于索引的查询太慢

时间:2014-03-13 17:27:32

标签: performance graph 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。

任何线索?

1 个答案:

答案 0 :(得分:6)

请参阅:Titan Limitations

  

边缘检索不是O(1)

     

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

     

这也适用于通过标准或的边缘索引检索   外部指数。

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

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

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

干杯, 丹尼尔