2016-10-06 4 views
5

Mam strukturę danych drzewa, które chciałbym przechowywać przy użyciu Neo4j.Jak poprawnie kodować hierarchiczną zależność z węzłem tego samego typu w danych sprężynowych neo4j?

Jest węzeł nadrzędny :CodeSet, która zawsze jest korzeniem drzewa i węzłów :Node dziecko, które same mogą mieć węzły potomne tego samego typu. Są one powiązane z relacją typu :SUBTREE_OF w następujący sposób: tree data structure

Węzeł macierzysty jest wyświetlany na czerwono, a sam jego element macierzysty jest wyświetlany na zielono.

Gdy tylko węzeł nadrzędny i węzły potomne mają pewne wspólne dane, stworzyłem klasę abstrakcyjną:

public abstract class AbstractNode { 
    private Long id; 
    @NotEmpty 
    private String code; 
    @Relationship(type = "SUBTREE_OF", direction = Relationship.INCOMING) 
    private Set<Node> children; 

    <getters & setters omitted> 
} 

Class dla węzła nadrzędnego:

public class CodeSet extends AbstractNode { 
    @Relationship(type = "SUBTREE_OF", direction = Relationship.OUTGOING) 
    private Application parent; 

    <getters and setters omitted> 
} 

klasy do węzła potomnego:

public class Node extends AbstractNode { 
    @NotEmpty 
    private String description; 
    @NotEmpty 
    private String type; 
    @NotEmpty 
    private String name; 
    @NotNull 
    @Relationship(type = "SUBTREE_OF", direction = Relationship.OUTGOING) 
    private AbstractNode parent; 

    <getters and setters omitted> 
} 

Potrzebuję tylko aktualizacji węzła podrzędnego. Używam następujące metody w moim warstwie usług:

public Node update(Node node, Long nodeId) throws EntityNotFoundException { 
    Node updated = findById(nodeId, 0); 
    updated.setDescription(node.getDescription()); 
    updated.setType(node.getType()); 
    updated.setName(node.getName()); 
    updated.setCode(node.getCode()); 
    nodeRepository.save(updated); 
    return updated; 
} 

Z tym mam następujący wynik: result of node update Zależność jest zepsuty. Próbowałem również, aby określić depth=1 na findById metoda parametru, ale to spowodowało niewłaściwych relacji jeszcze raz: enter image description here

Potem starał się modyfikując dwukierunkową relację w moich zajęciach na jednokierunkowych tak tylko jedna klasa ma anotowane z polem @Relatinship wskazujące na inny, ale to też nie pomogło.

Jak to działa?

+0

Witam, której wersji SDN używasz? – Vince

+0

@Vince to było 'org.springframework.data: spring-data-neo4j: 4.1.2.RELEASE' – Polyakoff

Odpowiedz

5

został rozwiązany przez aktualizację operacji zapisywania w metodzie usług:

public Node update(Node node, Long nodeId) throws EntityNotFoundException { 
    Node updated = findById(nodeId, 0); 
    updated.setDescription(node.getDescription()); 
    updated.setType(node.getType()); 
    updated.setName(node.getName()); 
    updated.setCode(node.getCode()); 
    //added param depth=0 here 
    nodeRepository.save(updated, 0); 
    return updated; 
} 
+0

To działa, ponieważ nie aktualizuje żadnych relacji, ale myślę, że to maskowanie rzeczywistego problemu tutaj. Istniejące relacje nie powinny zostać zniszczone. – Vince

0

Może jest problem z definicji relacji w abstrakcyjnej klasie. Węzły dzieci dziedziczą również relacje INCOMING, więc gdy aktualizujesz używając głębi 1, relacje są dwustronne.

Powiązane problemy