2013-03-20 62 views
1

我目前正在使用neo4j 1.8.1。我得到NotInTransactionException,當我查詢neo4j索引來獲取一些節點。查詢neo4j索引時獲取NotInTransactionException

下面是一個簡單的查詢,其中我對Neo4j的

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

執行以下是異常堆棧跟蹤。

"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 2013-03-20 16:19:59

+0

由於這是一個讀取事務,因此我沒有明確指出有關索引的任何事務 – Subbu 2013-03-21 08:38:18

+0

,但我的猜測是需要明確的事務,但即使只讀取也是如此。 – Rolf 2013-03-21 14:54:18

回答

1

這裏有一個理論:我不知道這是隻與粘貼在這裏的代碼,但檢查一個問題:

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

檢查名爲「NODEINDEX」的指標,但實際查詢

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

檢查常量NODEINDEX中名爲whatever的索引。這兩者可能並不相同,因此它會嘗試爲您創建該索引,並且由於未處於事務中而失敗。

0

如果沒有現有的適當索引,我認爲它會在返回之前創建一個;這個操作需要被包裝在一個事務中。