Запрос свойств узла в списки, связанных свойств узла в список списков, отслеживание иерархии

#neo4j

#neo4j

Вопрос:

Учитывая следующую схему / набор данных:

 (a:A1)-[ONE]->(b:B1)-[TWO]->(c:C1)
(a:A1)-[ONE]->(b:B1)-[TWO]->(c:C2)
(a:A1)-[ONE]->(b:B2)-[TWO]->(c:C3)
(a:A2)-[ONE]->(b:B3)
(a:A2)-[ONE]->(b:B4)-[TWO]->(c:C4)
(a:A2)
 

Я пытаюсь собрать запрос для некоторых a свойств, список b свойств (список строк) и, наконец, список списков c свойств (список списка строк). Я довольно близок к использованию collect() , но сталкиваюсь с проблемой отслеживания c того, какие из них принадлежат к каким b .

Запрос, который я ищу, выдаст одну строку на a (2 строки для данного набора данных), обратите внимание, что данные могут быть разреженными, поэтому в результатах отображается пустой массив с указанием иерархии:

  1. "A1" , ["B1", "B2"] , [["C1","C2"],["C3"]]
  2. "A2" , ["B3", "B4"] , [[],["C4"]]

Ответ №1:

При агрегировании с использованием COLLECT [или любого другого агрегирования] другой, не собрано [неагрегированные] значения в строке служат ключом агрегации, поэтому совпадают только строки, которые разделяют все остальные значения. Для вашего запроса вам в основном нужно сложить COLLECT s в два отдельных шага, например, так, чтобы сначала получить списки c с ключом a и b , а затем собрать все b s и все списки c s с ключом a , например, так:

 MATCH (a) - [:ONE] -> (b)
OPTIONAL MATCH (b) - [:TWO] -> (c)
WITH a, b, COLLECT(c.property) AS cs
WITH a, COLLECT(b.property) AS bs, COLLECT(cs) AS cs_per_b
RETURN a.property, bs, cs_per_b
 

Вы можете property заменить любым свойством, которое хотите получить от узла, и если это не свойство узла, а метка или другое значение, просто замените все выражение внутри COLLECT( ) . Вы также получите пустые списки внутри cs_per_b таким образом, если cs нет, по желанию.

Ответ №2:

Хотя в вашем вопросе указано, что вы хотите перечислить «свойства» узла, в результатах выборки вместо этого перечислены метки узлов.

Для отображения меток узлов должен работать следующий запрос:

 MATCH (a)-[:ONE]->(b)
OPTIONAL MATCH (b)-[:TWO]->(c)
WITH a, b, COLLECT(DISTINCT LABELS(c)[0]) AS lcs
RETURN LABELS(a)[0] AS la, COLLECT(LABELS(b)[0]) AS lb, COLLECT(lcs) AS lc;
 

Запрос предполагает, что достаточно использовать ONE TWO типы отношений и, чтобы различать Ax Bx Cx метки узлов и, и что у этих узлов есть только одна метка. Он использует OPTIONAL MATCH для TWO отношения, поскольку ваши результаты выборки подразумевают, что это необязательно.

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

1. Спасибо за ответ! Это были collect результаты предыдущего collect , которые мне были нужны. Ответ Торе объяснил, что мне было нужно и как достичь; ваш ответ также верен 🙂