查询neo4j索引时获取NotInTransactionException

时间:2013-03-20 10:41:24

标签: neo4j

我目前正在使用neo4j 1.8.1。当我查询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索引的事务? 有什么想法吗? 感谢

2 个答案:

答案 0 :(得分:1)

这是一个理论:我不知道这只是粘贴在这里的代码的问题,而是检查:

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

检查名为“NODEINDEX”的索引,但实际查询

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

检查名为常量NODEINDEX中的名称的索引。这两个可能不一样,因此它会尝试为您创建该索引并因未处于事务中而失败。

答案 1 :(得分:0)

如果没有现有的适当索引,我认为它会在返回之前创建一个;此操作需要包含在事务中。