neo4j在一个迭代器上处理一个长事务

时间:2013-11-02 19:07:26

标签: java neo4j

我想查看图中的所有“用户”节点,并对它们执行一些操作。

问题是我有太多“用户”节点,我无法将所有节点都保存在堆上。

所以,做一些事情:

try (Transaction tx = graphDb.beginTx())
{
   Iterator<Node> n_column = autoNodeIndex.get( "type", "user" );   


   while (n_column.hasNext()) {
     //create relationship for node...
   }
   tx.success();
}

会导致GC开销异常。

如何将它拆分为少量事务,但是在同一个迭代器上?

我考虑过嵌套事务,但手册说的不同。嵌套事务将本地内存滚动到顶层事务。

1 个答案:

答案 0 :(得分:2)

只需添加一个计数器,然后每隔50.000个节点提交并启动一个新事务。

   Transaction tx = graphDb.beginTx();
   Iterator<Node> n_column = autoNodeIndex.get( "type", "user" );   

   int counter=0;
   while (n_column.hasNext()) {
     //create relationship for node...
     if (++counter % 50000 == 0) {
        tx.success(); tx.close();
        tx = graphDb.beginTx();
     }
   }
   tx.success(); 
   tx.close();