为什么我不能为 neo 创建与 spring 数据的 neo4j 关系?

Why can't i create a neo4j relationship with spring data for neo?

我对 neo 的 spring 数据相当陌生(尽管我对 neo4j 本身有经验)。我尝试按照 'official' 关于 spring neo 数据的指南,特别是关于 creating relationships.

的章节

但我似乎无法让它工作。 Spring 给我一个

java.lang.IllegalStateException: This index (Index[__rel_types__,Relationship]) has been marked as deleted in this transaction

让我强调一下,我不会删除任何节点或关系。这些是我的域模型的相关 classes:

@NodeEntity
public class User {

    @GraphId
    private Long nodeid;

    @Indexed(unique = true)
    private String uuid;
    ....


}

@NodeEntity
public class Website {

    @GraphId
    private Long nodeid;

    @Indexed(unique = true)
    private String uuid;

    ....

}

@RelationshipEntity(type = RelTypes.REL_USER_INTERESTED_IN)
public class UserInterest {

    @GraphId
    private Long nodeid;

    @StartNode
    private User user;

    @EndNode
    private Website site;
    ...

}

这是我的基本测试,我无法变绿.. (请注意,我省略了大部分代码,spring 上下文等的基本设置工作正常)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@Transactional
public class BaseTest {

    @Autowired
    protected Neo4jTemplate template;
    @Autowired
    protected GraphDatabaseService graphDatabaseService;

    protected Transaction tx;

    @Configuration
    @EnableNeo4jRepositories
    static class TestConfig extends Neo4jConfiguration {
        TestConfig() throws ClassNotFoundException {
            setBasePackage("me.bcfh.model");
        }

        @Bean
        GraphDatabaseService graphDatabaseService() {
            return new TestGraphDatabaseFactory().newImpermanentDatabase();
        }

    }

    public void before() {
        // provide implementation if necessary
    }

    public void after() {
        // provide implementation if necessary

    }

    @Before
    public void setup() throws Exception {
        Neo4jHelper.cleanDb(graphDatabaseService, false);
        before();
    }

    @After
    public void tearDown() throws Exception {
        after();
        if (tx != null) {
            tx.success();
            tx.close();
            tx = null;
        }
    }
}
public class BasicGraphTest extends BaseTest {

    User user;
    Website website;
    UserInterest interest;

    @Override
    public void before() {
        user = new User();
        website = new Website();
        website = template.save(website);
        user = template.save(user);
    }

    @Test
    @Transactional
    public void dbShouldContainData() throws Exception {
        UserInterest interest = new UserInterest();
        interest.setSite(website);
        interest.setUser(user);
        template.save(interest);

        // some assertions 
        ... 
    }
}

当我尝试保留 UserInterest 实例时抛出 IllegalStateException,我不明白这是因为我没有在任何地方删除任何东西。

spring指南中提到的创建关系的方法对我也不起作用,这里我遇到了同样的异常..

任何人都可以发现我在这里做错了什么吗?

我正在使用 Spring 版本 4.1.4.RELEASE 和 Spring Data For Neo 版本 3.2.1.RELEASE。 Neo4j 有版本 2.1.6

注意:我还尝试将域模型 classes 从 cineasts 示例复制到我的项目中,并借用了几行 DomainTest class 但这也给了我IllegalStateException,也许我的设置有问题?

我认为您收到 IllegalStateException 是因为您在设置方法中调用了 cleanDb。

您可能不需要清理数据库。因为你的测试是 makred @Transactional 你在测试中所做的任何事情都会在测试结束时回滚。

看起来事务正在尝试回滚,但找不到它期望的关系。