提交后如何从服务器插件中的 Neo4j 数据库获取属性?

How to get Properties from a Neo4j Database in Server Plugin after Commit?

我必须实现一个 Neo4j 服务器插件,该插件对数据库的更改做出反应并获取有关这些更改的信息。我需要获取一个事务中所有已添加、更改和删除的数据。我用一个TransactionEventHandler注册到数据库。出于性能原因,我必须使用在对数据库进行更改后调用的 afterCommit 回调。这样交易就不会被插件阻止了。

现在在这个回调中我做了类似的事情:

public void afterCommit(TransactionData data, Void arg1) {
    for(Node n:data.createdNodes()) {
        String firstkey = n.getPropertyKeys().iterator().next();
    }
}

但是 getPropertyKeys 抛出异常,因为事务已经提交。我不明白为什么这是个问题,我不想对事务进行任何更改,我只想要节点具有已更改的属性。有什么办法可以解决这个问题吗?异常的原因是什么?

异常:

java.lang.IllegalStateException: This transaction has already been completed.
    at org.neo4j.kernel.impl.api.KernelTransactionImplementation.assertTransactionOpen(KernelTransactionImplementation.java:376)
    at org.neo4j.kernel.impl.api.KernelTransactionImplementation.acquireStatement(KernelTransactionImplementation.java:261)
    at org.neo4j.kernel.impl.api.KernelTransactionImplementation.acquireStatement(KernelTransactionImplementation.java:80)
    at org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.instance(ThreadToStatementContextBridge.java:64)
    at org.neo4j.kernel.InternalAbstractGraphDatabase.statement(InternalAbstractGraphDatabase.java:785)
    at org.neo4j.kernel.impl.core.NodeProxy.getPropertyKeys(NodeProxy.java:358)
    at de.example.neo4jVersionControl.ChangeEventListener.afterCommit(ChangeEventListener.java:41)

afterCommit 中事务已经提交(因此得名)。要从节点访问属性,您需要事务上下文 - 请记住每个操作(甚至只读)都需要它。

实施 TransactionEventHandler 的推荐方法是仅依赖 TransactionDataTransactionData.assignedNodeProperties() 也将 return 新创建节点的属性。