2015-10-04 5 views
0

Использование следующих команд для использования индексов для лучшей производительности для запроса узла в titan db.Ошибка при попытке использовать индексы в титановом графе 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);  

Использование титана 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) 

Updates, как указано ниже в @jason Plurad ответить

Я использовал

Используя нижеследующий код для индексации покупателя, выполните поиск вершин faste r, но не знаю, почему это не индексирование, не работает, может ли это исправить это.

я прочитал документацию титаном дб индексации части, но я предполагаю, что это не работает ..

ответ

5

Проблема здесь указывается это в трассировке стека:

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.t[email protected]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 
+0

ГВ() есть ("Покупатель", "покупатель", "buyer10") из ("order_is") значения ("порядок") заполнить (список),... Я использую эту команду после mgmt.commit(); Но все же в терминале он показывает: итерирование по всем вершинам [(~ label = покупатель И покупатель = покупатель10)]. Для повышения производительности используйте индексы. Это означает, что он не использует индексы, а значит, и медленную скорость. - – user3646858

+0

Пожалуйста, ответьте :(@Jason Plurad – user3646858

+0

обновил мой ответ с полным примером, который вы можете запустить в консоли gremlin. –