【发布时间】:2018-04-11 19:24:30
【问题描述】:
我在使用 Spring Boot (v1.5.10) 和 Neo4j OGM (v2.1.6,带有 Spring Data Neo4j v4.2.10) 删除或更改两个节点之间的现有关系时遇到问题。我发现一些使用旧版 Neo4j OGM 版本(如 1.x.something)的人报告的类似问题的痕迹,但我认为,随着 2.1.6 和最新的 Spring Boot v1 版本,它应该早已不复存在。因此,我不知道这是回归还是我没有以正确的方式使用 API。
所以,我的节点实体定义如下:
@NodeEntity
public class Task {
@GraphId
private Long id;
private String key;
@Relationship(type = "HAS_STATUS")
private Status status;
public Task() {
}
public Long getId() {
return id;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
}
@NodeEntity
public class Status {
@GraphId
private Long id;
private String key;
@Relationship(type = "HAS_STATUS", direction = Relationship.INCOMING)
private Set<Task> tasks;
public Status() {
tasks = new HashSet<>();
}
public Long getId() {
return id;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Set<Task> getTasks() {
return tasks;
}
public void addTask(Task task) {
tasks.add(task);
}
public boolean removeTask(Task task) {
if(this.hasTask(task)) {
return this.tasks.remove(task);
}
return false;
}
public boolean hasTask(Task task) {
return this.tasks.contains(task);
}
}
这是它可以用类似 Cypher 的样式表示的方式:
(t:Task)-[:HAS_STATUS]->(s:Status)
这是尝试更新任务状态的 Service 方法:
public void updateTaskStatus(Task task, Status status) {
Status prevStatus = task.getStatus();
if(prevStatus != null) {
prevStatus.removeTask(task);
this.saveStatus(prevStatus);
}
task.setStatus(status);
if(status != null) {
status.addTask(task);
this.saveStatus(status);
}
this.saveTask(task);
}
作为更新的结果,我得到了两个 HAS_STATUS 关系到两个不同的状态节点(旧的和新的),或者,如果我尝试删除现有的关系,什么也没有发生(旧的关系仍然存在)
可以在 GitHub 上找到说明问题的完整演示:
https://github.com/ADi3ek/neo4j-spring-boot-demo
非常欢迎任何可以帮助我解决该问题的线索或建议! :-)
【问题讨论】:
-
为 Spring Date Neo4j jira.spring.io/browse/DATAGRAPH-1082创建了一个问题
标签: java spring-boot spring-data-neo4j spring-data-neo4j-4 neo4j-ogm