Spring Data Neo4j 5 меток узлов / отношений и наследования

У меня есть следующая сущность Spring Data Neo4j 5:

@NodeEntity
public class Value extends Flaggable {

    @Index(unique = true)
    private Long id;

    private String name;

    private String description;

    @Index(unique = false)
    private Object value;

}

Сейчас Value узлы имеют следующие метки:

MATCH(n:Value) RETURN labels(n) LIMITS 1

["BaseEntity", "Subscribable", "Flaggable", "Likeable", "Value"]

В некоторых случаях, в соответствии с требованиями моего проекта, мне нужно расширить Value узел с дополнительными свойствами, как например weight а также size,

Я не хочу менять существующий Value класс и хотите ввести новый - унаследованный, например:

@NodeEntity
public class WeightedValue extends Value{

    private Long weight;

    private Long size;

}

У меня есть вопрос, будет ли следующий запрос MATCH(n:Value) RETURN n вернуть также случаи WeightedValue?

Будет ли возможность искать WeightedValue узлы (по Value метка) по следующему запросу?

MATCH(n:Value) WHERE n.size > 1000 RETURN n

Подойдет ли вышеуказанный подход для @RelationshipEntity а наследство? Так можно ли использовать наследование для @RelationshipEntity и как сохранить один и тот же ярлык (например, HAS_VALUE_ON) для базовых и унаследованных классов, например:

@RelationshipEntity(type = "HAS_VALUE_ON")
public class RelationshipValue {

    @Id
    @GeneratedValue
    private Long id;

    @StartNode
    private Decision decision;

    @EndNode
    private Characteristic characteristic;

}

@RelationshipEntity(type = "HAS_VALUE_ON")
public class WeightedRelationshipValue extends RelationshipValue {

    private Long weight;

    private Long size; 

}

1 ответ

Решение

Для первой части вашего вопроса, узлы, созданные WeightedValue extends Value класс будет иметь как Value а также WeightedValue ярлыки (вы можете сделать так, чтобы в нем не было суперкласса, если бы вы хотели). Итак, пока ВСЕ WeightedValue узлы Value узлы, то вы можете MATCH на Value узлы.

Кроме того, в вашем вопросе вы спрашиваете, если Cypher MATCH запрос будет работать, но я хотел убедиться, что вы не принимаете закулисный запрос, в который SDN может превратить ваш запрос к хранилищу (т.е. findAll()). Я совсем не уверен, но вполне возможно, что SDN может преобразовать что-то вроде weightedValueRepo.findAll() в нечто вроде: MATCH (n:Value:WeightedValue) return n; В Cypher это возвращает узел, таким образом, все его свойства. Однако, если в Java вы использовали List<Value> values = valueRepo.findAll() имейте в виду, что объект Value может не иметь всех тех же свойств Java/ класса, что и WeightedValue объекты.

Таким образом, в Cypher сопоставление / запрос по метке Value может дать вам доступ ко всему узлу (включая свойства, определенные только в объектах WeightedValue, поиск / сопоставление через SDN может быть невозможен, поскольку OGM должен сопоставить свойства узла с классом (и этот суперкласс обычно не обладает такими же свойствами, как его подклассы).

Для второй части, один RelationshipЯ считаю, что имеет только один тип и не работает как метки, где сущность может иметь несколько. Вы можете создать несколько связей разных типов между одними и теми же узлами. Я не уверен, если один @RelationshipEntity расширяет другой, если SDN создаст оба rel или нет. Может быть, вы можете попробовать это и дайте мне знать.: Slightly_smiling_face:

Другие вопросы по тегам