我正在尝试为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
查询中,返回的节点信息是我的插件修改它们之前的信息。
问题是;这是为什么?我没有在事务中通过我的插件修改节点吗?返回的节点不应该显示我对它们所做的修改吗?有什么方法可以让这种情况发生吗?
答案 0 :(得分:2)
当您仍然在事务中时,Cypher结果已经计算出来,并且没有干净的方法来添加其他信息。
我想neo4j存储库上的功能请求可能很酷,但总体而言,这需要对neo4j核心代码库进行严格更改。
BTW,增量ID已经在graphaware-uuid插件中实现:https://github.com/graphaware/neo4j-uuid#specifying-the-generator-through-configuration