我试图运行以下代码段(使用Neo4j v2.2.1 /非永久图数据库):
@BeforeClass
public static void prepareAll() {
graphDB = new TestGraphDatabaseFactory().newImpermanentDatabase();
}
// [...]
try (Transaction tx = graphDB.beginTx()) {
IndexDefinition definition = graphDB.schema()
.indexFor(Labels.ARTIST)
.on("name")
.create();
graphDB.schema().awaitIndexOnline(definition, XXX, TimeUnit.MILLISECONDS);
// [...]
tx.success();
}
无论我设置XXX多高,都会抛出IllegalStateException:
java.lang.IllegalStateException: Expected index to come online within a reasonable time.
at org.neo4j.kernel.impl.coreapi.schema.SchemaImpl.awaitIndexOnline(SchemaImpl.java:172)
at xxx.Exercise_3_Test.should_create_index_on_name(Exercise_3_Test.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:168)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
这是否特定于非永久图数据库?
非常感谢你的帮助!
答案 0 :(得分:0)
只需将索引创建和等待分成两个单独的事务:
try (Transaction tx = graphDB.beginTx()) {
graphDB.schema().indexFor(Labels.ARTIST).on("name").create();
tx.success();
}
try (Transaction tx = graphDB.beginTx()) {
graphDB.schema().awaitIndexesOnline(XXX, TimeUnit.MILLISECONDS);
tx.success();
}