Neo4j - Родитель - Дочерняя иерархия + Весна

У нас есть структура, в которой у Parent может быть несколько дочерних элементов с вложенной структурой.

1: Parent p1
    child c1
          c1.1       
          c1.2
   child  c2
          c2.1
          c2.3

Теперь, используя один шифрованный запрос, мне нужно получить всю структуру с помощью Spring + Neo 4j.

Модель:

Человек:

@Relationship( direction = Relationship.OUTGOING, type = "PARENT")
private Person parent;

@Relationship( direction = Relationship.INCOMING, type = "PARENT")
private List<Person> child;

Cypher Query: -

MATCH (p:Person {name:"john"})<-[pr:PARENT*..2]-(p1:Person) return c1

Дает мне только ребенка, но не ребенка следующего уровня

MATCH (p:Person {name:"john"})<-[pr:PARENT*..2]-(p1:Person) return pr

Дает мне вложенную структуру, которая является рекурсивной и бесполезной.

Подход: - repository.findOne (personId, 2);

У меня та же проблема, что и при расширении дочерней структуры, в которой есть одна ссылка на родительский объект.

Например: -

Родитель p1, потомок c1 -> три объекта

  1: child-p1 --- it would have a reference to Parent Object p1
  2: c1.1 ---  
       child --it would reference to Child C1 since its parent    

  3: c1.2
       child --it would reference to Child C1 since its parent

В идеале он не должен содержать никаких ссылок на родительский элемент в дочернем списке и, как следствие, проблемы с переполнением стека.

Я использую SDN 4.0.release


person user2945318    schedule 02.03.2016    source источник


Ответы (1)


Один из способов сделать это - загрузить объект с настраиваемой глубиной, например:

repository.findOne(personId, 2);

где 2 - глубина.

Если вы используете SDN 4.0, ваши запросы Cypher не будут иметь большого смысла в этом случае, сущности не отображаются на основе результатов запроса.

Если вы используете SDN 4.1, вы можете вернуть все узлы и отношения из пути, и объекты вашего домена будут правильно сопоставлены. Пример:

MATCH path=(p:Person {name:"john"})<-[pr:PARENT*..2]-(p1:Person) return p as person, nodes(path),rels(path)

Если вы выполните это с помощью Neo4jTemplate.query, вы получите org.neo4j.ogm.model.Result, который будет содержать человека, насыщенного отношениями из пути, который вы сопоставили.

person Luanne    schedule 03.03.2016