如何解决Java Neo4j减少事务数量以提高性能
我正在尝试使用Java基于Kleene矩阵的计算来生成Neo4j数据库。为简化起见,每个节点都有一个ID,其形式为m&n
,其中m和n是整数,对于此图中的每个级别i
,我想找到所有ID为*&i
的节点和i&*
,因此我可以将它们结合起来以i
作为中间节点来获得新节点。例如,当前级别为2,然后从ID为1&2
和2&3
的节点中创建ID为1&3
的新节点。并且还将新节点连接到其父节点。
我的代码如下所示:
foreach(level i){
foreach(nodeid id_m ends with i){//
foreach(nodeid id_n starts with i){
try(Transaction tx = graph.beginTx()){
Node m = tx.findNode(id_m);
Node n = tx.findNode(id_n);
Node newNode = tx.createNode();
newNode.setProperties(...);
newNode.createRelationshipTo(m);
newNode.createRelationshipTo(n);
tx.commit();
}
}
}
}
通过外部循环中的Java函数搜索id_m
和id_n
并将它们放在列表中。每次代码创建一个新节点时,它都会提交一次事务。但是,当创建大量新节点(大约数百万个新节点)时,它会变得异常缓慢(超过4小时,这是不可接受的)。
我在考虑以下解决方案:
- 使用多线程来创建这些节点,但这可能不适合我的情况,因为每次在两个节点之间创建关系时,两个节点都将被锁定,直到被提交为止,并且相同的节点可能会出现在不同的线程中。
- 将新节点信息保存到队列中,并在其大小太大时将其提交到Neo4j数据库。但是,如果没有在数据库中创建新节点,则无法将其与其父级连接。因此,减少交易数量似乎是不可能的。
那么还有其他可能的方法来提高此代码的性能吗?还是可以通过Neo4j子句实现这一点?任何帮助将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。