#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 строки для данного набора данных), обратите внимание, что данные могут быть разреженными, поэтому в результатах отображается пустой массив с указанием иерархии:
"A1"
,["B1", "B2"]
,[["C1","C2"],["C3"]]
"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
, которые мне были нужны. Ответ Торе объяснил, что мне было нужно и как достичь; ваш ответ также верен 🙂