У меня есть такая модель местоположения (представляющая эквивалент макета проприетарной модели, опущенный автоматически сгенерированный идентификатор и некоторые другие поля):
@NodeEntity
class Space: Location() {
@field:Relationship(type = "SUBLOCATED_IN", direction = Relationship.OUTGOING) var subLocation: SubLocation? = null
}
@NodeEntity
abstract class SubLocation: Location() {
@field:Relationship(type = "LOCATED_IN", direction = Relationship.OUTGOING) var locatedIn: Building? = null
}
@NodeEntity
class Building: Location()
@NodeEntity
abstract class Location {
var name: String? = null
var city: String? = null
var country: String? = null
}
A SubLocation
- это аннотация для нескольких различных конкретных классов, таких как Office
, Desk
, Room
и т. Д., Реализация которых не имеет значения. Location
используется, например, в Person
классе:
@NodeEntity
class Person(
var name: String,
@JsonIgnore @Relationship(type = "WORKS_IN", direction = Relationship.OUTGOING)
var location: Location? = null
)
Когда у меня есть подграф типа Person
-> Room
(SubLocation
) -> Building
, все работает как шарм. Я запрашиваю через интерфейс Neo4jRepository
, и он выдает объект Person
с location
(Person
-> SubLocation
), а также locatedIn
(SubLocation
-> Building
) правильно установлено:
interface PersonRepository: Neo4jRepository<Person, Long> {
@Depth(5) // exaggerated for test purposes
fun findAllByName(name: String): List<Person>
}
Проблема проявляется, когда у меня есть такой подграф, как
Person
-> Space
-> Room
(SubLocation
) -> Building
и когда я делаю запрос с использованием того же метода хранилища, я получаю только первый уровень отношений, сопоставленных с объектами. Person
объект имеет location
для Space
, но Space
имеет subLocation
для null
.
Я использую новейшие версии: spring-data-neo4j -> 5.1.6.RELEASE
и neo4j-ogm-core -> 3.1.8
и neo4j:3.5.3
.
TL; DR:
spring-data-neo4j
не отображает автоматически @Relationship
аннотированное поле с абстрактным типом класса на конкретный объект, назначается null
.