首先,我不是泰坦和图形数据库的专家,因此任何评论都将受到赞赏。
目前我有大约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。
任何线索?
答案 0 :(得分:6)
边缘检索不是O(1)
通过id检索边缘,例如tx.getEdge(edge.getId()),不是 恒定时间操作。泰坦将检索相邻的顶点 要检索的边,然后执行顶点查询以识别 边缘。前者是恒定时间,但后者可能是线性的 在具有相同边缘的顶点上入射的边数 标签
这也适用于通过标准或的边缘索引检索 外部指数。
此行为的原因是Titan存储顶点和边的方式(请参阅Data Model)。只能直接访问顶点(O(1))。
底线:即使您有属性的边缘索引,Titan仍然必须迭代所有相邻顶点以通过id识别边缘。
尝试更改架构,以便查询可以继续遍历的顶点。
干杯, 丹尼尔