如何在TransactionEventHandler中进行在同一CREATE查询中返回的节点更改

时间:2017-02-13 14:19:50

标签: neo4j graphaware

我正在尝试为neo4j实现一个插件,以使用GraphAware库添加自动增量ID。为此,我写了以下几个类:

<root>
  <declaration>
     <id>12</id>
  </declaration>
</root>

public class ModuleBootstrapper implements RuntimeModuleBootstrapper
{
    public RuntimeModule bootstrapModule(String moduleId, Map<String, String> config, GraphDatabaseService database)
    {
        return new MyModule(moduleId, config, database);
    }
}

我可以执行测试:

public class MyModule extends BaseTxDrivenModule<Void>
{
    int counter = 0;
    public Void beforeCommit(ImprovedTransactionData transactionData)
        throws DeliberateTransactionRollbackException
    {
        if (transactionData.mutationsOccurred()) {
            for (Node newNode : transactionData.getAllCreatedNodes()) {
                newNode.setProperty("id", counter++);
            }
        }
    }
}

然后:

CREATE (n);

我可以看到我的插件的效果,因为某些MATCH (n) RETURN n; 属性已添加到节点中。但是当我跑步时:

id

返回的节点没有提到的CREATE (n) RETURN n; 属性,但是当我在单独的查询中匹配节点时,我发现事情已经完成了。只是在id查询中,返回的节点信息是我的插件修改它们之前的信息。

问题是;这是为什么?我没有在事务中通过我的插件修改节点吗?返回的节点不应该显示我对它们所做的修改吗?有什么方法可以让这种情况发生吗?

1 个答案:

答案 0 :(得分:2)

当您仍然在事务中时,Cypher结果已经计算出来,并且没有干净的方法来添加其他信息。

我想neo4j存储库上的功能请求可能很酷,但总体而言,这需要对neo4j核心代码库进行严格更改。

BTW,增量ID已经在graphaware-uuid插件中实现:https://github.com/graphaware/neo4j-uuid#specifying-the-generator-through-configuration