我正在创建所有节点,然后添加所有关系。所有节点都存储在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)
任何人都可以确认并指出我在哪里出错了吗?
答案 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)在关闭交易之前,如果已经做出改变,则应始终提交更改。