创建关系时Neo4j异常

时间:2014-03-04 20:38:57

标签: java neo4j

我正在创建所有节点,然后添加所有关系。所有节点都存储在HashMap中,其中包含String名称作为键,节点作为值存储,因此我可以轻松地访问节点以创建关系。

    for(Map.Entry<String[], Integer> entry: company_counts_backward.entrySet()){
        String[] node_names  = entry.getKey();
        String company_from = node_names[0];
        String company_to = node_names[1];

        int count = entry.getValue();

        Node companyFromNode = nodes_created.get(company_from);
        Node companyToNode = nodes_created.get(company_to);
        Relationship relationship = companyFromNode.createRelationshipTo(companyToNode, Relations.WORKED_AT);
        relationship.setProperty("relationship-type", "knows");
        relationship.setProperty("length", count);
    }

请注意,这个for循环被a包围 Transaction tx = graphDB.beginTx(); tx.finish();

问题是,在创建关系时,我似乎得到了Exception in thread "main" org.neo4j.graphdb.NotInTransactionException抛出。

完整的错误跟踪如下:

at org.neo4j.kernel.impl.persistence.PersistenceManager.getCurrentTransaction(PersistenceManager.java:284)
at org.neo4j.kernel.impl.persistence.PersistenceManager.getResource(PersistenceManager.java:249)
at org.neo4j.kernel.impl.persistence.PersistenceManager.currentKernelTransactionForReading(PersistenceManager.java:230)
at org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.transaction(ThreadToStatementContextBridge.java:53)
at org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.instance(ThreadToStatementContextBridge.java:47)
at org.neo4j.kernel.impl.core.NodeProxy.createRelationshipTo(NodeProxy.java:406)

任何人都可以确认并指出我在哪里出错了吗?

1 个答案:

答案 0 :(得分:0)

将处理数据库的任何代码放在try-with-resources块中:

try (Transaction tx = db.beginTx()) {
  Node n1 = db.createNode();
  Node n2 = db.createNode();
  n1.createRelationshipTo(n2, REL_TYPE);
  tx.success(); // This is important!
}

请注意,有时(例如,执行只读操作时)您不必调用tx.success(),因为没有任何内容可以提交。

有关交易管理的更多信息,请参阅docs

P.S。我明白你指出你知道交易管理的必要性,所以我不只是重复你的话,我强调a)Transaction#finish()已弃用且不应使用,因此我建议使用现代方法,和b)在关闭交易之前,如果已经做出改变,则应始终提交更改。