Neo4j Cypher - возвращающие узлы и их вложенные узлы одного типа - PullRequest
1 голос
/ 14 июня 2019

Я хочу иметь возможность вернуть список Item узлов с их списком вложенных Item узлов, содержащихся в Box.Поскольку отношения между узлами Item и их вложенными узлами Item могут быть разными (например, WHEELS, WINDOWS, LIGHTS), я хотел бы написать запрос, который пропускает связи и возвращает любые вложенныеУзел Item и их Item дочерние элементы, потому что Item будет иметь по крайней мере один дочерний элемент Item или его нет (что приведет к пустому списку дочерних элементов)

Я хочу быть в состоянии сделать это с помощью всего лишь переданного Box идентификатора (например, boxID).

enter image description here

ПРИМЕЧАНИЕ: Я новичок в Neo4j и Cypher, поэтому, пожалуйста, ответьте (довольно) подробным ответом о том, какзапрос работает.Я хочу быть в состоянии понять, как это работает.Спасибо!

Например

MATCH (iA: Item)-[r]->(iB: Item)-[r]->(b: Box) 
WHERE b.boxID = $boxID
RETURN COLLECT(iB.itemID AS ItemID, ib.name as ItemName, COLLECT(iA.itemID as ItemID, iA.name as ItemName, COLLECT(...) ) AS ItemChildren)

Часть COLLECT(..) смущает меня.Как вернуть Item узел и все его Item дочерние элементы и все эти дочерние элементы Item дочерние элементы и т. Д. До пустых дочерних элементов?Есть ли лучший способ MATCH всех узлов?

1 Ответ

1 голос
/ 14 июня 2019

Это очень легко, используя отношение переменной длины шаблон:

MATCH (b:Box)-[:CONTAINS]->(:ItemInstance)-[*]-(i:Item)
WHERE b.boxID = $boxID
RETURN COLLECT(DISTINCT i) AS ItemChildren

Опция DISTINCT необходима, потому что результат отношения переменной длины может возвращать один и тот же элемент несколько раз.

Этот запрос также подтверждает направленность отношений, показанную на вашей диаграмме. Шаблон отношения CONTAINS задает соответствующую направленность, а отношение переменной длины (-[*]-) не указывает направленности, поскольку ваша модель данных не использует согласованное направление по всему дереву, начиная с ItemInstance.

Предостережение: неограниченные отношения переменной длины могут занимать очень много времени или даже исчерпывать память, в зависимости от того, насколько велика ваша БД и сколько связей имеет каждый узел. Это можно обойти, указав разумную верхнюю границу длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...