每次更改节点或关系时,Neo4j都可以自动设置updatedAt字段吗?

时间:2015-09-18 13:46:22

标签: transactions neo4j updates

在我写的应用程序中,我在每个节点和关系上手动设置createdAtupdatedAt字段。这意味着我可以定期检查应用程序的其他用户是否添加了任何新内容。

但是,不同应用程序(例如Neo4j浏览器)在同一数据库中编辑的任何元素可能都不会设置这些字段,因此我的应用程序仍然不会意识到这些更改。

是否可以配置Neo4j,以便来自任何源的任何修改都将updatedAt字段设置为当前服务器时间?

我已经阅读了beforeCommit transaction event,这似乎是一个很好的引导,但看起来好像我需要在某处编写一些Java代码。你能举例说明如何解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

您应该可以通过GraphAware查看Improved Transaction Event API。它为您提供了更好的处理事件的API 使用此(或使用默认功能),您可以为您创建TransactionEventHandler(即TimestampUpdater)。

要向Neo4j服务器添加所需的功能,您应该创建unmanaged extension。这将允许您使用自定义功能丰富Neo4j服务器。

根据官方Neo4j文档的说明,您应该可以创建基本的非托管扩展。

此外,还有由Neo4j贡献者开发的非托管扩展示例 - neo4j-tx-participation。它非常简单,可以很好地概述如何做到这一点。

并且here可以找到关于如何在非托管扩展初始化(数据库启动)上向Neo4j添加内容的答案。它概述了如何使用PluginLifecycle

如果您拥有非托管扩展程序和TimestampUpdater事件处理程序,则可以将它们组合在一起。

PluginLifecycle注册处理程序:

public class ExtensionPluginLifecycle implements PluginLifecycle {

    @Override
    public Collection<Injectable<?>> start(GraphDatabaseService graphDatabaseService,
                                           Configuration config) {
        graphDatabaseService.registerTransactionEventHandler(new TimestampUpdater());
    }

    @Override
    public void stop() {
    }
}
祝你好运!