Ошибка при попытке использовать индексы в titan graph db

Используйте следующие команды, чтобы использовать индексы для повышения производительности для запроса узла в 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, но я думаю, что она не работает..


person user3646858    schedule 04.10.2015    source источник


Ответы (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
person Jason Plurad    schedule 05.10.2015
comment
g.V().has(покупатель,покупатель, покупатель10).out(order_is).values(order).fill(list); я использую эту команду после mgmt.commit(); но все еще в терминале отображается: итерация все вершины [(~метка = покупатель И покупатель = покупатель10)]. Для повышения производительности используйте индексы. Это означает, что он вообще не использует индексы, следовательно, низкая скорость. – - person user3646858; 05.10.2015
comment
Пожалуйста, ответьте :( @Jason Plurad - person user3646858; 05.10.2015
comment
обновил мой ответ полным примером, который вы можете запустить в консоли Gremlin - person Jason Plurad; 05.10.2015
comment
Он по-прежнему показывает предупреждение, повторяющееся по всем вершинам [(покупатель = покупатель10)]. Для повышения производительности используйте индексы - person user3646858; 05.10.2015
comment
Использование Java Eclipse @JasonPlurad - person user3646858; 05.10.2015
comment
Вы не получите предупреждение об индексе в оболочке Gremlin, но если вы запустите Java Eclipse, g.V().has(buyer,buyer10) .values(buyer).fill(list); LOGGER.info(list.toString()); , Он покажет предупреждения индекса - person user3646858; 05.10.2015
comment
Тогда я предполагаю, что что-то не так с вашей средой Java Eclipse. У вас есть полный пример кода, которым вы можете поделиться? - person Jason Plurad; 05.10.2015
comment
Переместите вызов на graph.io(graphson().readGraph() после определения схемы, т.е. после mgmt.commit() - person Jason Plurad; 05.10.2015