0

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

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属性,但同样,当我在单独的查询中匹配节点时,我发现一切都很好。只是在CREATE查询中,返回的节点信息是我的插件修改它们之前的信息。

问题是;这是为什么?我不是在事务中通过我的插件修改了节点吗?返回的节点不应该显示我对它们所做的修改吗?有什么办法可以做到这一点?

4

1 回答 1

2

当您仍在交易中时,Cypher 结果已经被计算出来,并且没有干净的方法可以向其中添加额外的信息。

我猜对 neo4j 存储库的功能请求可能很酷,但老实说,这需要对 neo4j 核心代码库进行重大更改。

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

于 2017-02-13T21:51:56.350 回答