Neo4j - 如何单独管理架构和数据交易?

时间:2016-09-15 21:29:49

标签: neo4j

这是否意味着我们不能通过Java API调用这样的东西? 我收到错误 - “由以下原因引起:org.neo4j.graphdb.QueryExecutionException:无法在已执行数据更新的事务中执行架构更新。” 当我通过neo4j控制台从过程调用调用模式更新时会发生这种情况。

try (Transaction tx = db.beginTx()) {
    String query = "CREATE INDEX ON :" + lbl + "(" + name + ")";
    db.execute(query);
    tx.success();
}

1 个答案:

答案 0 :(得分:0)

调用程序的Cypher查询已在事务中执行,并且Neo4j中没有嵌套事务:当您致电db.beginTx()时,您正在获取现有事务,并且它已经完成了除非你需要Transaction对象(例如创建锁),否则实际上并不需要。

无论如何,即使它没有明确记录,显然也不可能从Neo4j程序中操纵模式。您可以说它未通过

的用例
  

提供对Cypher中不可用的功能的访问,例如手动索引和模式内省。

我创建了一个类似于你的测试程序:

public class IndexProcedure {
    @Context
    public GraphDatabaseService db;

    @Procedure
    @PerformsWrites
    public void index(@Name("label") String label, @Name("property") String property) {
        db.schema().indexFor(Label.label(label)).on(property).create();
    }
}

并在最简单的Cypher查询中从shell运行它:

CALL my.package.index('Node', 'name');

没有@PerformsWrite注释,我得到以下(预期)异常:

  

警告:无法调用过程my.package.index:由以下原因引起:org.neo4j.graphdb.security.AuthorizationViolationException:READ次事务不允许进行模式操作。

使用注释,我会得到与您相同的异常:

  

警告:无法调用过程my.package.index:由以下原因引起:org.neo4j.graphdb.QueryExecutionException:无法在已执行数据更新的事务中执行架构更新。

我认为基本原理是设置架构主要是一次性操作,并不真正需要一个过程:如果你要执行一些Cypher查询来调用该过程,你可能会并运行创建约束和索引的脚本。

也可能存在技术限制:索引创建是异步的,可能不参与事务(你可以回滚创建索引吗?)。

或者它可能只是一个错误?我们应该让Neo的某人确认。

更新:根据对SlackHQ的讨论,它将在Neo4j 3.1发布时被修复。