Как я могу получить Spring Data Neo4j (SDN) для инициализации и сбора дополнительных связей с пустым списком в Kotlin?

#kotlin #neo4j #cypher #spring-data-neo4j

#kotlin #neo4j #шифр #spring-data-neo4j

Вопрос:

Доступ к Neo4j в Kotlin с использованием SDN, у меня есть объект с отношениями, который я использую только для чтения из БД. Выглядит примерно так:

 @NodeEntity
class Parent() {
    @Relationship(type = "CHILD_OF", direction = Relationship.INCOMING)
    lateinit var children: List<Child>
    ...
  

Я использую пользовательский запрос с необязательным совпадением для извлечения этих объектов. Это выглядит так (фактический запрос более сложный, но это проблемная часть):

 MATCH (parent:Parent) WHERE ID(parent) IN $parentIds
OPTIONAL MATCH (parent)<-[r1:CHILD_OF]-(child:Child)
RETURN DISTINCT parent, child, r1
  

Когда есть дочерние элементы, связанные с родительским элементом, возвращаемым запросом, он работает нормально. Однако, когда у родителя нет дочерних элементов, и я пытаюсь получить доступ parentObject.children , я получаю:

 kotlin.UninitializedPropertyAccessException: lateinit property children has not been initialized
  

Я бы хотел, чтобы, когда запрос не возвращает связанных Child объектов, children поле должно быть пустым списком, а не отключенным.

Есть ли у меня способ указать Cypher query или SDN для этого?

Ответ №1:

Это можно решить, установив значение для поля при построении следующим образом:

 var children: List<Child> = emptyList() // Default value used when there's no children
  

Однако я предпочитаю такой lateinit var подход, поэтому, если есть способ заставить его работать, я хотел бы знать, что это такое.

Комментарии:

1. Я считаю, что нет другого способа, кроме как написать свой собственный getter / setter и инициализировать его