current/previous spring 数据 neo4j(LinkedList)中的节点关系
current/previous node relations in spring data neo4j (LinkedList)
我正在尝试创建具有类似于下图的 CURRENT/PREVIOUS
关系的节点链表。
我不确定我的解决方案是否是处理这种情况的正确方法,但为了实现这一点,我使用一种方法创建了两个节点来填充新消息,如下所示:
@Builder
@Data
@NoArgsConstructor
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
@Relationship(type = "LATEST")
private Message message;
void newMessage(Message newMessage) {
newMessage.setPrevious(message);
message = newMessage;
}
}
@Builder
@Data
@NoArgsConstructor
public class Message {
@Id
@GeneratedValue
private Long id;
private String text;
@Relationship(type = "PREVIOUS")
private Message previous;
}
我还创建了一个示例代码来测试这个解决方案:
@SpringBootApplication
public class NewsFeedApplication {
public static void main(String[] args) {
SpringApplication.run(NewsFeedApplication.class, args);
}
@Bean
CommandLineRunner init(PersonRepository personRepository) {
return args -> {
Person personToAdd1 = Person.builder().name("John").build();
personToAdd1.newMessage(Message.builder().text("first message").build());
personToAdd1.newMessage(Message.builder().text("second message").build());
personToAdd1.newMessage(Message.builder().text("third message").build());
personRepository.save(personToAdd1);
personToAdd1.newMessage(Message.builder().text("New message.").build());
personRepository.save(personToAdd1);
};
}
}
我觉得我很接近,但我不知道如何重置以前的 CURRENT
关系,我的解决方案产生的输出为:
所以问题是:
- 如果我的方法没问题,我怎样才能删除以前的
CURRENT
关系。
- 如果这种方法是错误的,我如何才能正确地实现具有节点 CURRENT/PREVIOUS 关系的链表。
我找到了缺失的谜题,即分离供应商关系。我不知道为什么我事先假设这个关系应该被 spring 数据存储库“保存”方法自动删除。
工作解决方案:
public interface PersonRepository extends Neo4jRepository<Supplier, Long> {
@Query("MATCH (n:Person {name: $name})-[r:LATEST]->() DELETE r")
void detachLatestFromPerson(String name);
}
void newMessage(PersonRepository personRepository, Message newMessage) {
personRepository.detachLatestFromPerson(name);
newMessage.setPrevious(message);
message = newMessage;
}
PS。我仍然有疑问,因为我不确定这是否是处理这种情况的好方法,所以如果你知道更好的解决方案,请继续 post 它,我们总是可以交换 'best answer' : )
我正在尝试创建具有类似于下图的 CURRENT/PREVIOUS
关系的节点链表。
我不确定我的解决方案是否是处理这种情况的正确方法,但为了实现这一点,我使用一种方法创建了两个节点来填充新消息,如下所示:
@Builder
@Data
@NoArgsConstructor
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
@Relationship(type = "LATEST")
private Message message;
void newMessage(Message newMessage) {
newMessage.setPrevious(message);
message = newMessage;
}
}
@Builder
@Data
@NoArgsConstructor
public class Message {
@Id
@GeneratedValue
private Long id;
private String text;
@Relationship(type = "PREVIOUS")
private Message previous;
}
我还创建了一个示例代码来测试这个解决方案:
@SpringBootApplication
public class NewsFeedApplication {
public static void main(String[] args) {
SpringApplication.run(NewsFeedApplication.class, args);
}
@Bean
CommandLineRunner init(PersonRepository personRepository) {
return args -> {
Person personToAdd1 = Person.builder().name("John").build();
personToAdd1.newMessage(Message.builder().text("first message").build());
personToAdd1.newMessage(Message.builder().text("second message").build());
personToAdd1.newMessage(Message.builder().text("third message").build());
personRepository.save(personToAdd1);
personToAdd1.newMessage(Message.builder().text("New message.").build());
personRepository.save(personToAdd1);
};
}
}
我觉得我很接近,但我不知道如何重置以前的 CURRENT
关系,我的解决方案产生的输出为:
所以问题是:
- 如果我的方法没问题,我怎样才能删除以前的
CURRENT
关系。 - 如果这种方法是错误的,我如何才能正确地实现具有节点 CURRENT/PREVIOUS 关系的链表。
我找到了缺失的谜题,即分离供应商关系。我不知道为什么我事先假设这个关系应该被 spring 数据存储库“保存”方法自动删除。
工作解决方案:
public interface PersonRepository extends Neo4jRepository<Supplier, Long> {
@Query("MATCH (n:Person {name: $name})-[r:LATEST]->() DELETE r")
void detachLatestFromPerson(String name);
}
void newMessage(PersonRepository personRepository, Message newMessage) {
personRepository.detachLatestFromPerson(name);
newMessage.setPrevious(message);
message = newMessage;
}
PS。我仍然有疑问,因为我不确定这是否是处理这种情况的好方法,所以如果你知道更好的解决方案,请继续 post 它,我们总是可以交换 'best answer' : )