Титан не может найти подходящий индекс, пока он существует

Я пытаюсь создать простую графовую систему Titan в Беркли, но Titan не использует созданный мной индекс для своих запросов.

String INDEX_NAME = "search"
File dir=new File("C:/TEMP/titanTest1");
dir.mkdirs();
TitanFactory.Builder config = TitanFactory.build();
config.set("storage.backend", "berkeleyje");
config.set("storage.directory", dir.getAbsolutePath());
config.set("index."+INDEX_NAME+".backend","elasticsearch");
config.set("index." + INDEX_NAME + ".directory", new File(dir,"es").getAbsolutePath());
config.set("index."+INDEX_NAME+".elasticsearch.local-mode",true);
config.set("index."+INDEX_NAME+".elasticsearch.client-only",false);
config.set("query.force-index",true);
TitanGraph tg= config.open();
try {

     if (tg.getPropertyKey("name")==null){
         TitanManagement mgmt = tg.getManagementSystem();
         VertexLabel metaclassLabel=mgmt.makeVertexLabel("metaclass").make();

         final PropertyKey name = mgmt.makePropertyKey("name").dataType(String.class).make();
         mgmt.buildIndex("metaClassesByName",Vertex.class).addKey(name).indexOnly(metaclassLabel).buildMixedIndex(INDEX_NAME);

         mgmt.commit();
     }

     System.out.println("indexed:"+tg.getIndexedKeys(Vertex.class));

     Vertex v=tg.addVertexWithLabel("metaclass");
     v.setProperty("name", "test");

     for (Object o:tg.query().has("name").has(ImplicitKey.LABEL.getName(), "metaclass").vertices()){
            Vertex v2=(Vertex)o;
            System.out.println(v2);
     }
     tg.commit()
} finally {
    tg.shutdown();
}

этот код печатает:

 indexed:[name]
 Exception in thread "main" com.thinkaurelius.titan.core.TitanException: Could not find a suitable index to answer graph query and graph scans are disabled: [(name <> null AND label = metaclass)]:VERTEX
at com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx$8.execute(StandardTitanTx.java:1198)

Я не понимаю, почему Титан не может использовать индекс, который я определил. Я хочу перечислить все объекты с меткой метакласса. Единственное, что работает, — это определить составной индекс и найти вершину с точным значением имени. Это вообще возможно?

Спасибо!


person JP Moresmau    schedule 16.01.2015    source источник


Ответы (1)


Вы можете использовать прямой индексный запрос:

for (Result<TitanVertex> res : g.indexQuery("metaClassesByName","v.name:*").vertices()) {
    Vertex v2 = res.getElement();
    System.out.println(v2);
}
person Daniel Kuppitz    schedule 16.01.2015
comment
Спасибо! Жаль, что индекс нельзя использовать автоматически. - person JP Moresmau; 19.01.2015
comment
Я создал новую задачу: github.com/thinkaurelius/titan/issues/932 Вы надеюсь, это будет решено в будущих версиях. - person Daniel Kuppitz; 19.01.2015