Neo4j 使用UniqueNodeFactory创建节点时发生ConstraintViolationException

Neo4j 使用UniqueNodeFactory创建节点时发生ConstraintViolationException,neo4j,Neo4j,这个测试失败了,我不明白为什么。。 我认为UniqueNodeFactory只在节点不存在时创建节点。 当然,我也可以用Cypher做同样的事情,但我想知道这里发生了什么。。 有人能解释一下吗? 我正在使用neo4j 2.3.1 public class SimpleTest { private GraphDatabaseService graphService; @Before public void setUp() throws Exception { graphService

这个测试失败了,我不明白为什么。。 我认为
UniqueNodeFactory
只在节点不存在时创建节点。 当然,我也可以用Cypher做同样的事情,但我想知道这里发生了什么。。 有人能解释一下吗? 我正在使用neo4j 2.3.1

public class SimpleTest {

private GraphDatabaseService graphService;

@Before
public void setUp() throws Exception {
    graphService = new TestGraphDatabaseFactory().newImpermanentDatabase();
    graphService.execute("CREATE CONSTRAINT ON (user:User) ASSERT user.userId IS UNIQUE");
}

@After
public void tearDown() throws Exception {
    graphService.shutdown();
}

public static UniqueFactory.UniqueNodeFactory createUserFactory(GraphDatabaseService graphDatabaseService) {

    return new UniqueFactory.UniqueNodeFactory(graphDatabaseService, "User") {

        @Override
        protected void initialize(Node created, Map<String, Object> properties) {
            created.addLabel(DynamicLabel.label("User"));
            created.setProperty("userId", properties.get("userId"));
        }
    };
}

@Test
public void testCreateUser() throws Exception {
    try (Transaction tx = graphService.beginTx()) {
        Node node = graphService.createNode(DynamicLabel.label("User"));
        node.setProperty("userId", 100L);
        tx.success();
    }

    try (Transaction tx = graphService.beginTx()) {
        UniqueFactory.UniqueNodeFactory uniqueFactory = createUserFactory(graphService);
        uniqueFactory.getOrCreate("userId", 100L);
        tx.success();
    }
}

}

好了,现在我明白原因了。我用Cypher和
UniqueNodeFactory创建了schema索引,并使用legacy索引。要解决此问题,只需使用
UniqueNodeFactory
创建节点

Caused by: org.neo4j.kernel.api.exceptions.schema.UniquePropertyConstraintViolationKernelException: Node 0 already exists with label 0 and property 0=100
at org.neo4j.kernel.impl.api.ConstraintEnforcingEntityOperations.validateNoExistingNodeWithLabelAndProperty(ConstraintEnforcingEntityOperations.java:165)
at org.neo4j.kernel.impl.api.ConstraintEnforcingEntityOperations.nodeSetProperty(ConstraintEnforcingEntityOperations.java:140)
at org.neo4j.kernel.impl.api.LockingStatementOperations.nodeSetProperty(LockingStatementOperations.java:453)
at org.neo4j.kernel.impl.api.OperationsFacade.nodeSetProperty(OperationsFacade.java:896)
at org.neo4j.kernel.impl.core.NodeProxy.setProperty(NodeProxy.java:293)
... 33 more