我正在使用以下组件:
采取的步骤:
创建节点 B 和 C.
B 节点与 C 具有传出关系“xyz”。
创建B的节点时,需要像传递C的引用
neo4jReactiveRepository.save(new B(C));
现在创建一个与 B 具有“pqr”关系的节点 A。因此节点 A 将创建为 -
neo4jReactiveRepository.save(new A(B));
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 个查询:
代码:
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;
}
如果第 3 步和第 4 步同时发生,那将导致死锁,因为它们都需要锁定 B。每当您创建新关系时,它的两个端节点也必须被锁定(因为它们必须更新以引用新的关系)。有关更多详细信息,请参阅文档一些。
改为一次只执行一步应该可以避免死锁。