Вы близки к решению, но в Neo4j-OGM есть техническое ограничение (библиотека, используемая в Spring Data Neo4j для отображения графа объектов): при использовании аннотации @Properties
она сохраняется только с префиксом загрузки (по умолчанию)имя атрибута) с правым разделителем (по умолчанию .
).Так что в основном в вашем случае он будет загружать только свойства с префиксом properties.
, а не все, которые возвращаются.
В Spring Data Neo4j также есть возможность предоставить @QueryResult
, который можно рассматривать какDTO.Вы можете отметить промежуточный класс с аннотацией.Убедитесь, что этот класс также является частью вашего сканирования сущностей.
@QueryResult
public class ConfigDto {
private String name;
private Map<String, String> properties;
}
, если вы также измените тип возвращаемого значения вашего метода хранилища SDN на этот тип
@Query("MATCH p = SHORTESTPATH((c2:Config)<-[:OVERRIDES*]-(c1:Config))"
+ " WHERE c1.name = 'Child' and not (c2)-[:OVERRIDES]->()"
+ " UNWIND NODES(p) as props return props.name as name, PROPERTIES(props) as properties")
List<ConfigDto> configs();
И чем при использованииэтот метод вернет:
ConfigDto{name='Child', properties={a.exclusive=1, name=parentConfig, a.override=parent value}}
ConfigDto{name='Child', properties={a.exclusiveChild=my value, name=Child, a.override=child value}}
Обратите внимание, что я написал тест с постоянством «оригинального» * 1016 * объекта, свойства которого сопоставлены, как вы выше, и я просто добавил их в префикс a.
,Вы также можете видеть, что это имя находится в карте свойств, возвращенной из запроса, поэтому карта содержит все свойства узла.
Редактировать (сохранить часть из комментариев) С решением вышевозможно загрузить существующие данные из Neo4j.
Невозможно сохранить произвольные свойства, кроме решения @Properties
, но это создаст «префиксные», «разделенные» свойства в вашем графике.Например, с вашим кодом в вопросе вы получите properties.docker_tag
.
Вы можете написать собственный конвертер свойств, например, для Map
, сориентироваться и взять некоторые идеи из https://github.com/neo4j/neo4j-ogm/blob/master/core/src/main/java/org/neo4j/ogm/typeconversion/MapCompositeConverter.java Здесьэто ссылка на документацию для конвертеров, и вы должны реализовать CompositeAttributeConverter
.
Neo4j-OGM не предназначен для постоянной работы с изменением имени свойства, и это также будет сложнорешить, что сохранить, если свойство с nameA
существует в самом классе домена и также определено в такой карте свойств.