2013-03-20 4 views
1

В настоящее время я использую neo4j 1.8.1. Я получаю NotInTransactionException, когда я запрашиваю индекс neo4j, чтобы получить некоторые узлы.Получение NotInTransactionException при запросе индекса neo4j

Ниже приведен простой запрос, который я уверен, выполнение на Neo4j

if (graphDb.index().existsForNodes("NODEINDEX")) { 
    IndexHits<Node> hits = graphDb.index().forNodes(NODEINDEX).query(query); 
} 

Ниже StackTrace за исключением.

"message" : "Error fetching transaction for current thread", 
"exception" : "NotInTransactionException", 
"stacktrace" : [ "org.neo4j.kernel.impl.index.IndexConnectionBroker.getCurrentTransaction(IndexConnectionBroker.java:134)", "org.neo4j.kernel.impl.index.IndexConnectionBroker.acquireReadOnlyResourceConnection(IndexConnectionBroker.java:84)", "org.neo4j.index.impl.lucene.LuceneIndex.getReadOnlyConnection(LuceneIndex.java:105)", "org.neo4j.index.impl.lucene.LuceneIndex.query(LuceneIndex.java:245)", "org.neo4j.index.impl.lucene.LuceneIndex.query(LuceneIndex.java:227)", "org.neo4j.index.impl.lucene.LuceneIndex.query(LuceneIndex.java:238)", "com.uprr.netcontrol.starmap.neo4j.plugins.aggregate_node_status.NodeStatusHelper.getGraphNodes(NodeStatusHelper.java:39)", 

Я нашел следующее в Neo4j api.

private Transaction getCurrentTransaction() throws NotInTransactionException 
{ 
    try 
    { 
     return transactionManager.getTransaction(); 
    } 
    catch (SystemException se) 
    { 
     throw new NotInTransactionException(
       "Error fetching transaction for current thread", se); 
    } 
} 

Нужно ли нам явно запускать транзакцию для запроса индекса neo4j?
Любые мысли?
Благодаря

+0

Вы начали транзакцию, начатую непосредственно перед выполнением запроса? – Rolf

+0

Поскольку это транзакция с чтением, я не начинаю какую-либо транзакцию явно – Subbu

+0

относительно индексов, моя догадка должна заключаться в явной транзакции, хотя даже при чтении. – Rolf

ответ

1

Вот теория: я не знаю, если это только вопрос с кодом наклеена здесь, но проверки:

 
if (graphDb.index().existsForNodes("NODEINDEX")) 

проверяет для индекса с именем «NODEINDEX», однако фактическое запрос

 
graphDb.index().forNodes(NODEINDEX).query(query); 

проверяет индекс, обозначенный как постоянный NODEINDEX. Эти два, вероятно, не совпадают, и поэтому он пытается создать этот индекс для вас и терпит неудачу из-за отсутствия транзакции.

0

Если нет существующего соответствующего индекса, я думаю, он создаст его перед его возвратом; эта операция должна быть завернута в транзакцию.

Смежные вопросы