2

Давайте эту классовую структуру:Добавить вторую метку унаследованного узла в весенне-данных-Neo4j-4

@NodeEntity 
abstract class BasicNodeEntity { 
    @GraphId 
    private Long nodeId; 
    //... 
} 

abstract class IdentifiableEntity extends BasicNodeEntity { 
    private String id; 
    //... 
} 

abstract class Ad extends IdentifiableEntity { 
    //... Ad attibutes 
} 

class OfferAd extends Ad { 
    // ... OfferAd attibutes 
} 

Сохранение OfferAd узла через Neo4jRepository, я ожидаю, что узел будет иметь две метки: OfferAd и Ad (унаследовано). Однако метка Ad не добавляется к узлу.

Я знаю, что могу сделать это, сохраняя узел через запрос cypher, но мне интересно, возможно ли это вместо Neo4jRepository.

Я рассмотрел this question (относящийся к SDN3), и я думаю, что это очень близко к моему прецеденту, но это, кажется, не работает ...

Любая помощь будет оценена. Спасибо

ответ

6

Правила для этикеток являются:

  • любой обычный бетон класса в иерархии создает метку, по умолчанию
  • равнину абстрактный класс не создает ярлык по умолчанию
  • обычный интерфейс не генерирует метку по умолчанию
  • любой класс, аннотированный с помощью @NodeEntity или @NodeEntity (label = "something «) Создает ярлык
  • пустых или нулевые метки не должны быть разрешены
  • классов/иерархии, которые не должны быть сохранены, должны быть аннотированным с @Transient

Поэтому, если вы удалите абстрагироваться от базового класса, или добавить аннотацию @NodeEntity, вы должны увидеть ожидаемые результаты.

Дополнительно (новый в OGM 2.0.4 и исправлений в 2.0.5), вы можете добавлять и удалять дополнительные метки, создавая поле типа Collection<String> и аннотирования его с @Labels, например:

@Labels 
private List<String> labels = new ArrayList<>(); 

Использовать версию 2.0.4 (gradle):

compile "org.neo4j:neo4j-ogm-core:{version}" 
compile "org.neo4j:neo4j-ogm-http-driver:{version}" 
+0

Спасибо за подробные правила для пояснения меток. – troig

+0

Добро пожаловать @troig :) Сообщите нам, если у вас возникли проблемы с интеграцией 2.0.4/5. –

2

Так же просто, как добавление аннотации @NodeEntity к классу Ad. Кажется, что spring-data-neo4j-4 создает только по одной метке на узел, даже если узел наследует другую.

Если мы хотим разрешить SDN добавлять классы родительских ярлыков, нам нужно добавить @NodeEntity.

Таким образом, для этого случая использования, если добавить его в Ad класс,

@NodeEntity 
abstract class Ad extends IdentifiableEntity { 
    //... Ad attibutes 
} 

когда мы сохранить OfferAd через Neo4jRepository узел создан будет иметь обе метки: Ad и OfferAd.

enter image description here