有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

spring数据neo4j(LinkedList)中的java当前/先前节点关系

我试图创建具有CURRENT/PREVIOUS关系的节点链表,类似下图

this picture

我不确定我的解决方案是否是处理此场景的正确方法,但为了实现这一点,我使用一种方法创建了两个节点来填充新消息,如下所示:

@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关系,我的解决方案产生如下输出:

invalid solution

因此,问题是:

  • 如果我的方法是正确的,我如何删除前面的CURRENT关系
  • 如果这种方法是错误的,我如何正确地实现节点当前/以前关系的链表

共 (1) 个答案

  1. # 1 楼答案

    我发现了缺失的谜题,即分离供应商关系。我不知道为什么我事先假设这个关系应该通过spring数据存储库的“save”方法自动删除

    工作解决方案:

    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;
        }
    

    另外,我仍然有疑问,因为我不确定这是否是处理这种情况的好方法,所以如果您知道更好的解决方案,请继续发布,我们可以随时交换“最佳答案”: