Ошибка при попытке использовать индексы в графе титановых БД
Использование следующих команд для использования индексов для повышения производительности при запросе узла в titan db.
TitanManagement mgmt = graph.openManagement();
PropertyKey buyer = mgmt.makePropertyKey("buyer").dataType(String.class).cardinality(Cardinality.SINGLE).make();
TitanGraphIndex buyeri = mgmt.buildIndex("buyer", Vertex.class).addKey(buyer).buildCompositeIndex();
mgmt.setConsistency(buyeri, ConsistencyModifier.LOCK);
g.V().has("buyer","buyer", "buyer10").out("order_is").values("order").fill(list);
Используя titan 1.0.0, язык запросов gremlin, при выполнении этого запроса выдается ошибка:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
at java.lang.Thread.run(Thread.java:745)Caused by: com.thinkaurelius.titan.core.SchemaViolationException: Adding this property for key [~T$SchemaName] and value [rtbuyer] violates a uniqueness constraint [SystemIndex#~T$SchemaName]
at com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx.addProperty(StandardTitanTx.java:780)
at com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx.addProperty(StandardTitanTx.java:706)
at com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx.makeSchemaVertex(StandardTitanTx.java:836)
at com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx.makePropertyKey(StandardTitanTx.java:856)
at com.thinkaurelius.titan.graphdb.types.StandardPropertyKeyMaker.make(StandardPropertyKeyMaker.java:86)
at pluradj.titan.tinkerpop3.example.JavaExample2.main(JavaExample2.java:56)
Обновления как упомянуто ниже в ответе @jason Plurad
я использовал
PropertyKey buyer = (!mgmt.containsPropertyKey("buyer")) ?
mgmt.makePropertyKey("buyer").dataType(String.class).cardinality(Cardinality.SINGLE).make() :
mgmt.getPropertyKey("buyer");
TitanGraphIndex buyeri = mgmt.getGraphIndex("buyeri");
if (buyeri == null) {
VertexLabel buyr = mgmt.getVertexLabel("buyer");
buyeri = mgmt.buildIndex("buyeri", Vertex.class).addKey(buyer).indexOnly(buyr). buildCompositeIndex();
mgmt.setConsistency(buyeri, ConsistencyModifier.LOCK);
}
mgmt.commit();
st=System.currentTimeMillis();
g.V().has("buyer","buyer", "buyer10").out("order_is").values("order").fill(list);
System.out.println(System.currentTimeMillis()-st +"millllli");
Используя следующий код для индексации покупателя, чтобы сделать поиск вершины быстрее, но не знаю, почему не работает индексация, не работает, Может кто-нибудь исправить это, пожалуйста.
Я прочитал документацию по части индексации Titan DB, но я думаю, что это не работает..
1 ответ
Проблема здесь указана этим в следе стека:
Caused by: com.thinkaurelius.titan.core.SchemaViolationException: Adding this property for key [~T$SchemaName] and value [rtbuyer] violates a uniqueness constraint [SystemIndex#~T$SchemaName]
Ваш код пытается создать схему несколько раз (возможно, повторяющимися вызовами вашей программы). Приведенный выше код создания схемы не проверяет, существует ли ключ свойства, прежде чем пытаться его создать.
Ваше использование has("buyer", "buyer", "buyer10")
ищет вершины, имеющие метку вершины "покупатель" и свойство вершины "покупатель", равное "покупатель10". В определении определения схемы не было метки вершины, поэтому я думаю, has("buyer", "buyer10")
более уместно.
Посмотрите на этот пример, который вы можете запустить из gremlin.sh. Он использует индекс и не показывает никаких предупреждающих сообщений.
gremlin> graph = TitanFactory.build().set('storage.backend','inmemory').open()
==>standardtitangraph[inmemory:[127.0.0.1]]
gremlin> g = graph.traversal()
==>graphtraversalsource[standardtitangraph[inmemory:[127.0.0.1]], standard]
gremlin> mgmt = graph.openManagement()
==>com.thinkaurelius.titan.graphdb.database.management.ManagementSystem@7026b7ee
gremlin> buyer = (!mgmt.containsPropertyKey("buyer")) ?
gremlin> mgmt.makePropertyKey("buyer").dataType(String.class).cardinality(Cardinality.SINGLE).make() :
gremlin> mgmt.getPropertyKey("buyer");
==>buyer
gremlin> buyeri = mgmt.getGraphIndex("buyeri");
==>null
gremlin> if (buyeri == null) {
gremlin> buyeri = mgmt.buildIndex("buyeri", Vertex.class).addKey(buyer).buildCompositeIndex();
gremlin> mgmt.setConsistency(buyeri, ConsistencyModifier.LOCK);
gremlin> }
==>null
gremlin> mgmt.commit();
==>null
gremlin> v = graph.addVertex("buyer", "buyer10", "name", "ten")
==>v[4184]
gremlin> g.V().has("buyer", "buyer10").values("name")
==>ten