org.springframework.data.neo4j.repository.ReactiveNeo4jRepository保存操作执行合并级联关系

问题描述 投票:0回答:1

我正在使用以下组件:

  1. Neo4jReactiveRepository
  2. Spring WEbFlux
  3. Neo4j

采取的步骤:

  1. 创建节点 B 和 C.

  2. B 节点与 C 具有传出关系“xyz”。

  3. 创建B的节点时,需要像传递C的引用

       neo4jReactiveRepository.save(new B(C));
    
  4. 现在创建一个与 B 具有“pqr”关系的节点 A。因此节点 A 将创建为 -

      neo4jReactiveRepository.save(new A(B));
    
  5. neo4j 数据库中的最终流程看起来是 A -> B -> C,A 和 B 之间有“pqr”关系,B 和 C 之间有“xyz”关系

问题:在步骤号。 4,当创建与B有关系的节点A时,它也会更新B和C之间的关系。

我不想更新 B 和 C 之间的关系。我只想创建节点 A 以及 A 和 B 之间的关系。

任何帮助将不胜感激。

在创建节点 A 期间尝试设置 C 的空对象,但它正在删除 B 和 C 之间的关系

编写手动查询将解决我的问题,但我需要执行 2 个查询:

  1. 创建节点A
  2. 创建 A 和 B 之间的关系

代码:

Create interface of ReactiveNeo4jRepository
    
public interface DemoRepository extends ReactiveNeo4jRepository<A, String> {
}

Service Class
    
class DemoService{
    @Autowired
    DemoRepository demoRepository;

    public void saveObjectA(B b){
        demoRepository.save(new A(b));
    }
}


POJO of A class
    
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@Node("A")
public class A {
    @Relationship(type = "EXECUTES", direction = OUTGOING)
    private B b;

    public A(B b){
        this.b = b; = JobStatus.STARTING;
    }
}


POJO of class B
@Getter
@AllArgsConstructor
@Builder(toBuilder = true)
@Node("B")
@ToString
@EqualsAndHashCode
public class B {
    @Relationship(type = "SUPPORTS", direction = OUTGOING)
    private C c;

}


POJO of class C
@Getter
@AllArgsConstructor
@Builder
@Node("C")
@EqualsAndHashCode
public class C {
    private final String name;
}
neo4j spring-webflux spring-data-neo4j
1个回答
0
投票

如果第 3 步和第 4 步同时发生,那将导致死锁,因为它们都需要锁定 B。每当您创建新关系时,它的两个端节点也必须被锁定(因为它们必须更新以引用新的关系)。有关更多详细信息,请参阅文档一些。

改为一次只执行一步应该可以避免死锁。

© www.soinside.com 2019 - 2024. All rights reserved.