#java #spring-boot #neo4j #linked-list #spring-data-neo4j
#java #весенняя загрузка #neo4j #связанный список #spring-data-neo4j
Вопрос:
Я пытаюсь создать связанный список узлов с 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
отношение. - Если этот подход неверен, как я мог бы правильно реализовать связанный список с ТЕКУЩИМИ / ПРЕДЫДУЩИМИ отношениями для узлов.
Ответ №1:
Я нашел недостающую головоломку, то есть отсоединение отношения поставщика. Я не знаю, почему я заранее предположил, что это отношение должно быть удалено автоматически методом «сохранения» хранилища данных 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. У меня все еще есть сомнения, поскольку я не уверен, что это хороший подход для обработки этого сценария, поэтому, если вы знаете лучшее решение, продолжайте и опубликуйте его, мы всегда можем поменять «лучший ответ» 🙂