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: