База данных Titan Graph: обработка транзакций в IdGraph

Я просматривал эту статью о Титане. Здесь речь идет о транзакции в графе Титана

Vertex v1 = g.addVertex(null);
//Do many other things
TransactionalGraph tx = g.newTransaction();
Vertex v2 = tx.addVertex(null);
v2.setProperty("uniqueName","foo");
tx.commit();
g.addEdge(null,v1,g.getVertex(v2),"related"); //Need to load v2 into outer transaction
//Do many other things
g.commit(); // Likely to fail due to lock congestion

Это нормально, если я использую TitanGraph, но как мне обрабатывать транзакцию при использовании IdGraph? Должен ли я сделать что-то вроде ниже:

    // baseGraph is TitanGraph,   g is IdGraph

    TransactionalGraph tx = baseGraph.newTransaction();
    Vertex v = g.addVertex(pageId);

    v.setProperty("prop1",       prop1);
    v.setProperty("prop2",       prop2);
    v.setProperty("prop3",       prop3);

    tx.commit();

    .....create some edges here

    g.commit();

person Manish Kumar    schedule 09.02.2014    source источник


Ответы (1)


Интересный вопрос. Если бы я делал это, я бы инстинктивно использовал baseGraph для запуска новой транзакции, а затем обернул созданный tx в IdGraph следующим образом:

// baseGraph is TitanGraph,   g is IdGraph
TransactionalGraph tx = baseGraph.newTransaction();
IdGraph txId = new IdGraph(tx);
Vertex v = txId.addVertex(pageId);

v.setProperty("prop1",       prop1);
v.setProperty("prop2",       prop2);
v.setProperty("prop3",       prop3);

txId.commit();

.....create some edges here using txId

txId.commit();

Обертывание baseGraph в IdGraph только украшает g этой особенностью. Так как tx является "новым" экземпляром графа, его тоже необходимо обернуть, чтобы он был украшен функциями IdGraph. Обратите внимание, что приведенный выше код не будет работать, пока эта проблема не будет решена:

https://github.com/thinkaurelius/titan/issues/592

Я не понимал, что такая упаковка невозможна, пока не возник этот вопрос.

person stephen mallette    schedule 11.02.2014
comment
Привет, @stephen, я ждал тебя, чувак. Я знал, что только ты дашь ответ. Мало кому интересна такая красивая БД Титан на SO. Ну, я также делаю то же самое baseGraph, чтобы начать новую транзакцию, и внутри этой транзакции я выполняю всю операцию IDgraph. Правильно? - person Manish Kumar; 11.02.2014
comment
я сделал свой ответ более конкретным. - person stephen mallette; 11.02.2014
comment
где tx.commit() ??? я думаю, что первым txId.commit(); должно быть tx.commit() - person Manish Kumar; 13.02.2014
comment
Когда я проверял new IdGraph(tx), мне приходилось делать IdGraph idGraph = new IdGraph((KeyIndexableGraph) txGraph);, потому что нет ничего похожего на предыдущее, и когда я это сделал, он показывает java.lang.UnsupportedOperationException: Not supported threaded transaction graph. Call on parent graph.. В чем проблема с кодом, который я предложил в своем вопросе ?? - person Manish Kumar; 13.02.2014
comment
Хм... возможно, вы не сможете использовать IdGraph в контексте ThreadedTransactionalGraph. Очевидно, IdGraph нужно знать особенности экземпляра Graph, а ThreadedTransactionalGraph этого не поддерживает. Не уверен, почему. Проблема с вашим исходным кодом заключается в том, что вы изменяете график в контексте g, а не ThreadedTransactionalGraph, поэтому ваши изменения не привязаны к созданной вами транзакции. Обратите внимание, что если вы не пытаетесь записать транзакцию в несколько потоков, использование newTrnasaction необязательно. - person stephen mallette; 13.02.2014
comment
Я спрошу команду Titan Core о том, почему функции не реализованы на ThreadedTransactionalGraph. - person stephen mallette; 13.02.2014
comment
Итак, каково решение? - person Manish Kumar; 13.02.2014
comment
После разговора с командой Titan Core Team кажется, что на данный момент решения нет. Я создал задачу: github.com/thinkaurelius/titan/issues/592 Пожалуйста, отследите разрешение там. Убедитесь, что ваш вариант использования требует многопоточных транзакций. Судя по другим вашим сообщениям, я не уверен, что вам нужно их использовать. Немного обновил свой ответ. - person stephen mallette; 17.02.2014
comment
Да, столкнувшись с этой проблемой, я вернулся к TitanGraph за мешком Transaction. Мне понравился график IdGraph для легкого назначения пользовательского идентификатора. Но я решил эту проблему также с помощью g.makeKey("myid").dataType(String.class).indexed(Vertex.class).unique().make() Так что для меня я решил свою проблему - person Manish Kumar; 17.02.2014