这是否意味着我们不能通过Java API调用这样的东西? 我收到错误 - “由以下原因引起:org.neo4j.graphdb.QueryExecutionException:无法在已执行数据更新的事务中执行架构更新。” 当我通过neo4j控制台从过程调用调用模式更新时会发生这种情况。
try (Transaction tx = db.beginTx()) {
String query = "CREATE INDEX ON :" + lbl + "(" + name + ")";
db.execute(query);
tx.success();
}
答案 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发布时被修复。