текущие / предыдущие отношения узлов в spring data neo4j (LinkedList)

#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. У меня все еще есть сомнения, поскольку я не уверен, что это хороший подход для обработки этого сценария, поэтому, если вы знаете лучшее решение, продолжайте и опубликуйте его, мы всегда можем поменять «лучший ответ» 🙂