Spring数据neo4j(4.1)与关系实体的一致性和映射问题

Spring数据neo4j(4.1)与关系实体的一致性和映射问题,neo4j,cypher,spring-data-neo4j,spring-data-neo4j-4,neo4j-ogm,Neo4j,Cypher,Spring Data Neo4j,Spring Data Neo4j 4,Neo4j Ogm,我将SDN 4.1.2与neo4j 3.0.4一起使用,我发现了一些奇怪的行为,这些行为总结在简单的代码片段中(将HttpDriver与远程数据库一起使用) 我有两个问题(请参阅下面的详细信息): 存储库count()返回关系实体错误计数的方法 存储库findOne()未返回最新映射的方法 模型类: @NodeEntity public class A { @GraphId private Long graphId; @Relationship(type="HAS_

我将SDN 4.1.2与neo4j 3.0.4一起使用,我发现了一些奇怪的行为,这些行为总结在简单的代码片段中(将HttpDriver与远程数据库一起使用)

我有两个问题(请参阅下面的详细信息):

  • 存储库count()返回关系实体错误计数的方法
  • 存储库findOne()未返回最新映射的方法
模型类:

@NodeEntity
public class A {
    @GraphId
    private Long graphId;

    @Relationship(type="HAS_B", direction = Relationship.OUTGOING)
    private Set<B> bSet = new HashSet<>();

    public Long getGraphId() {
        return graphId;
    }

    public Set<B> getBSet() {
        return bSet;
    }
}

@RelationshipEntity(type="HAS_B")
public class B {
    @GraphId
    private Long graphId;

    private String value;

    @StartNode
    private A a;

    @EndNode
    private C c;

    public B() {
    }

    public B(A a, C c, String value) {
        this.a = a;
        this.c = c;
        this.value = value;
    }
}

@NodeEntity
public class C {
    @GraphId
    private Long graphId;
}
最后一行:存储库计数返回0而不是2

问题2:

// Create C node
C c = new C();
c = cRepository.save(c);

// Create A node
A a = new A();
a = aRepository.save(a);
assertEquals(0, a.getBSet().size());

// Create B relationships from A to C (relationship entities)
B b1 = new B(a, c, "value1");
B b2 = new B(a, c, "value2");
b1 = bRepository.save(b1);
b2 = bRepository.save(b2);
//assertEquals(2, bRepository.count()); // returns 0 instead of 2 !!
// Create C node
C c = new C();
c = cRepository.save(c);

// Create A node
A a = new A();
a = aRepository.save(a);
assertEquals(0, a.getBSet().size());

// Create B relationships from A to C (relationship entities)
B b1 = new B(a, c, "value1");
B b2 = new B(a, c, "value2");
b1 = bRepository.save(b1);
b2 = bRepository.save(b2);

// Reload a
a = aRepository.findOne(a.getGraphId(), -1);
assertEquals(2, a.getBSet().size());

// Delete b1
bRepository.delete(b1);
// This is not working (deleted in DB, but still present in POJO when fetched again below)
//neo4jOperations.query("MATCH (a:A)-[b1:HAS_B]-(c:C) WHERE b1.value = 'value1' DELETE b1", new HashMap());

// Reload a
a = aRepository.findOne(a.getGraphId(), -1);
assertEquals(1, a.getBSet().size());
如果使用密码查询而不是存储库删除操作来删除关系,则通过存储库重新加载对象时,已删除的关系仍存在于POJO中(最后一次断言失败,大小==2而不是1)。但是我可以看到,数据库中的关系已被正确删除

我试图使用会话的作用域(@scope(value=“session”,proxyMode=ScopedProxyMode.xxx),但没有任何帮助。在文档中,明确地说SDN/OGM没有缓存,但我不理解这种行为


提前感谢您告诉我我是否做错了什么或这是一个bug。

第一个问题是关系实体计数的bug。请在此处记录问题

第二种情况并非如此——会话不知道自定义密码查询中发生了什么,在同一会话中重新加载实体只会产生扩展子图的效果(如果适用)。不幸的是,在4.1.x中这一点记录得不够充分。4.2.x中的文档在这里有很大改进:


底线是,如果您使用自定义密码查询来修改实体的状态,那么您必须获得一个新会话以从基础图重新加载它们。

感谢您的反馈!我在这里记录了问题1:我通过执行会话解决了问题2。clear()!4.2.x文档更清晰,谢谢。