1

作为记录,我使用的是 Neo4j 2.0.0-M02。

我目前有一种方法可以搜索其用户 ID 上带有标签“用户”的节点,该用户 ID 作为节点属性“id”存储在图中。这一切都发生在事务中,因为这会自动关闭 ResourceIterator。

现在,我想在两个用户之间建立关系。我所拥有的只是他们的用户 ID。现在,我显然想重用通过 id 搜索用户的方法。我能想到三种方法。

第一个是显而易见的。使用现有方法检索两个节点。然后调用创建它们之间关系的方法。显然,这也发生在一个事务中,因此这需要三个事务。没那么高效。

第二种只是在创建关系的新方法中重用代码(而不是方法)。这样,我可以在一个事务中完成所有操作,但是我正在复制代码,这对开发人员来说并不是一个很好的做法。

第三种是在创建关系的新方法的事务中调用现有方法两次。这样我的代码仍然可以重用,但我不确定嵌套事务在 Neo4J 中是如何工作的。是否会因为已有交易而忽略现有方法中的交易?那将解决我的问题。

如果没有,我必须重新考虑我在哪里管理我的交易。我知道在服务中管理它们通常比在 DAO 中更好,但我想将 Neo4j 的东西排除在我的服务类之外。

4

1 回答 1

6

第三个选项是它的工作方式,因为 Neo4j 中没有真正的嵌套事务,而是存在外部事务的非常浅的事务,因此几乎没有开销。

交易 tx = db.beginTx();
尝试
{
    其他方法(数据库);
    tx.成功();
}
最后
{
    tx.finish();
}

私人无效其他方法(GraphDatabaseService db)
{
    交易 tx = db.beginTx();
    尝试
    {
        // 做一些其他的事情...
        tx.成功();
    }
    最后
    {
        tx.finish();
    }
}

在上面的示例中,调用 otherMethod() 将在有或没有现有事务的情况下工作。如果事务存在,它执行的操作将在其中发生,但如果没有现有事务,则将创建一个。所以两者都会起作用。

于 2013-05-08T11:53:22.817 回答