如何在同一 CREATE 查询中返回的 TransactionEventHandler 中进行节点更改
How to make node changes in a TransactionEventHandler that are returned within the same CREATE query
我正在尝试为 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
查询中,返回的节点信息是我的插件修改之前的信息。
问题是;这是为什么?我不是在交易中通过我的插件修改了节点吗?返回的节点不应该显示我对它们所做的修改吗?有什么办法可以实现吗?
当您仍在交易中时,Cypher 结果已经计算出来,没有干净的方法可以向其添加额外信息。
我猜对 neo4j 存储库的功能请求可能很酷,但老实说,这需要对 neo4j 核心代码库进行重大更改。
顺便说一句,增量 ID 已经在 graphaware-uuid 插件中实现:https://github.com/graphaware/neo4j-uuid#specifying-the-generator-through-configuration
我正在尝试为 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
查询中,返回的节点信息是我的插件修改之前的信息。
问题是;这是为什么?我不是在交易中通过我的插件修改了节点吗?返回的节点不应该显示我对它们所做的修改吗?有什么办法可以实现吗?
当您仍在交易中时,Cypher 结果已经计算出来,没有干净的方法可以向其添加额外信息。
我猜对 neo4j 存储库的功能请求可能很酷,但老实说,这需要对 neo4j 核心代码库进行重大更改。
顺便说一句,增量 ID 已经在 graphaware-uuid 插件中实现:https://github.com/graphaware/neo4j-uuid#specifying-the-generator-through-configuration