neo4j - 使用 Spring Data Neo4j 4 更新简单对象关系的目标不会产生预期结果

标签 neo4j spring-data-neo4j spring-data-neo4j-4

刚刚将一个 Spring Data Neo4j 3 项目迁移到版本 4(4.0.0.RELEASE,Neo4j 2.2.5 社区服务器)并遇到了一个简单的单向对象关系未按预期更新的问题。此关系不使用 RelationshipEntity。

节点 A、B1 和 B2 已经在数据存储中并且现有关系 A -> B1,将 A 的 B 目标节点更改为 B2 并保存 A 会得到 B1 <- A -> B2。创建了新关系,但未删除与 B1 的旧关系。

expected resulting state:: actual resulting state

A 定义了与 B 的关系,但 B 没有定义与 A 的关系(因为 B 到 A 可能最终成为一对多)。

...imports omitted

@NodeEntity
public class TypeA {

    @GraphId
    private Long id;

    @Relationship(type = "TYPEB", direction = Relationship.OUTGOING)
    private TypeB b;

    ...getters and setters omitted

}

和B

...imports omitted

@NodeEntity
public class TypeB {

    @GraphId
    private Long id;

    private String identifier;

    public TypeB() {}

    public TypeB(String identifier) {
        this.identifier = identifier;
    }

    ...getters and setters omitted

}

调试它花了很长时间(尽管应用程序中不断出现故障),因为编写失败的集成测试(针对真实的 Neo4j 服务器运行)似乎是不可能的。事实上,当对象 A、B1 和 B2 在测试运行时创建时,我无法编写失败的测试。但是,如果在运行测试时(运行应用程序时的实际情况)数据存储中已经存在三个节点和关系,则会看到 B1 <- A -> B2 结果。测试的基本结构如下(可提供完整代码)。

// Find the TypeA node
Iterable<TypeA> As = typeARepository.findAll();
TypeA a = Iterables.get(As, 0);

// Find the TypeB node using its String identifier
TypeB b1 = typeBRepository.findByIdentifier(ONE);
assertNotNull(b1);
assertEquals(ONE, b1.getIdentifier());
// check that this is the TypeB node that is related to a
assertEquals(b1.getId(), a.getB().getId());

// Find the other TypeB node using its String identifier
TypeB b2 = typeBRepository.findByIdentifier(TWO);
assertNotNull(b2);
assertEquals(TWO, b2.getIdentifier());

// now create a relationship between a and this TypeB node instead
a.setB(b2);
// and save a
TypeA savedUpdatedA = typeARepository.save(a);

存储库是在测试运行时以编程方式创建的。并使用 GraphAware RestTest 库在运行存储库保存调用之前和之后验证数据存储子图。

设置:

<logger name="org.neo4j.ogm" level="DEBUG" />

可以看出,当节点已经存在于数据存储中时,发送到 Neo4j 服务器的 Cypher 不包括在保存 a 时对起始 A -> B1 关系的删除调用。它在测试运行时创建节点时执行。所以我认为 Neo4jSession 周围存在一个问题,即现有关系没有被标记为删除 - 但是当同一个 session 首先用于创建对象时(在测试中)。

有人在使用或迁移到 SDN 4 时遇到过类似问题吗?我不记得在 SDN 3 中看到过这种情况。这不是我认真研究的东西,它似乎有效,但显然 SDN 4 是完全重写的。

最佳答案

我相信这个问题现在已经解决了。您需要使用 OGM 的最新快照版本 1.1.4-SNAPSHOT,而不是 1.1.3 版本。

关于neo4j - 使用 Spring Data Neo4j 4 更新简单对象关系的目标不会产生预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33243558/

相关文章:

docker 启动 apache 和 neo4j 后立即退出

java - Neo4j:无法实例化 BatchInserter

neo4j - 映射异常与 Neo4j 和 Spring Data 中相同类型的两个节点之间的关系

neo4j - 为什么 Neo4j 中隐藏方面不好?

neo4j - Spring Data Neo4j 5 和动态@Properties - InvalidDataAccessApiUsageException

neo4j - Spring Data Neo4J - 创建与现有节点有关系的新节点

java - Spring Data Neo4j - 参数类型不匹配

python - 使用多个属性键进行 Py2Neo 合并

plugins - Neo4j安装APOC插件后重启失败

java - 如何在 java 应用程序中创建 neo4j 图形数据库