【问题标题】:Titan Warning: Query requires iterating over all verticesTitan 警告:查询需要遍历所有顶点
【发布时间】:2014-02-12 10:51:01
【问题描述】:

下面我添加cdate 索引,然后添加一些数据:

    baseGraph.makeKey("cdate").dataType(Long.class).indexed(Vertex.class).make();

    for(int i=0;i<20;i++){
        Vertex page = g.addVertex("P0"+i);            
        page.setProperty("cdate", new Date().getTime());
        page.setProperty("pName","pName-P0"+i);
        Edge e =g.addEdge(null, user, page, "created");
        e.setProperty("time", i);
        Thread.sleep(2000);
    }


    for(int i=20;i<25;i++){
        Vertex page = g.addVertex("P0"+i);
        page.setProperty("cdate", new Date().getTime());
        page.setProperty("pName","pName-P0"+i);
        Edge e =g.addEdge(null, user, page, "notcreated");
        e.setProperty("time", i);
        Thread.sleep(2000);
    }
g.commit();

现在当我运行以下查询时:

Iterable<Vertex> vertices = g.query().interval("cdate",0,time).
             orderBy("cdate", Order.DESC).limit(5).vertices(); 

它以正确的顺序给出输出,但它显示:

WARN  com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx  - 
Query requires iterating over all vertices [(cdate >= 0 AND cdate < 1392198350796)].
For better performance, use indexes

但我已经将cdate 定义为索引(见顶行)。

【问题讨论】:

    标签: titan


    【解决方案1】:

    cdate 的类型定义中,您使用的是Titan 的标准索引(不指定任何其他索引)。 Titan 的标准索引仅支持相等比较(即不支持范围查询)。

    要获得对范围查询的支持,您需要使用必须向 Titan 注册的索引后端,然后在类型定义中显式引用它。

    查看此页面上的文档Chapter 8. Indexing for better Performance

    Titan 支持两种不同类型的索引来加速查询处理:图索引以顶点为中心的索引。大多数图形查询从由其属性标识的顶点或边列表开始遍历。图索引使这些全局检索操作在大型图上高效。以顶点为中心的索引加快了图的实际遍历速度,尤其是在遍历具有许多入射边的顶点时。

    底线:Titan 支持多种类型的索引,它会自动选择最合适的索引来回答特定查询。在您的情况下,没有支持范围查询,因此警告和性能缓慢。上面的文档概述了如何注册提供所需支持的其他索引。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多