2013-12-11 8 views
1

Я пытаюсь выяснить, есть ли запрос Cypher для выполнения таких функций, как функции запросов. Учитывая данные примера.Запрос Cypher для вложенных отношений (например, как запрос)

     (stack) 
        / | \ 
        / | \ 
       (item) (item) (item) 
       /\  |  /\ 
       / \  | / \ 
      (node) (node) (node) (node)(node) 

До сих пор вопрос я для сопоставления node S есть.

START stack=node({stack}) 
MATCH (stack)-[:Item]-(item)-[:Representation]-(representation) 
RETURN representation 

(representation в этом запросе является эквивалентом node я просто не хватает места в диаграмме выше, чтобы сохранить пишущего представление).

Теперь, как и ожидалось, этот запрос возвращает только плоский список представлений, относящийся ко всем узлам item. например

[ representation, representation, representation.... ] 

То, что я действительно хочу запрос, чтобы вернуть вложенную структуру items с их связанной representation s, например,

[ 
    [ item, representations ], 
    [ item, representations ], 
    [ item, representations ] 
] 

Точная структура return не имеет значения. Это просто так, что я могу легко сопоставить item с его representations без отправки запроса для каждого item s representations.

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

(На стороне записки, если кто-нибудь знает о «Cypher для чайников» учебник я бы оценить его.)

+0

'возвращенный товар, представления', нет? –

+0

@JamesR У меня нет подсказки, я никогда не понимал цели ',' я решил, что это означает возврат плоского списка 'items' и плоский список' представлений'. Я попробую :) – AshHeskes

+0

@JamesR \t Просто попробовал, и он действительно возвращает плоский список 'предметов' и' представлений'. – AshHeskes

ответ

6

Хитрость заключается в том, чтобы использовать aggregation.

RETURN item, collect(representation) as representations 

Агрегация работает без group by вот так.

Если вы используете по крайней мере, одну функции агрегации (count, collect, avg, min, max и т.д.) в вашем предложении return, то все необобщенных столбцов рассматриваются как группирование ключа.

В SQL можно было бы написать что-то вроде:

SELECT item, collect(representation) as representations 
FROM ... 
GROUP BY item 

который является только повторяющееся объявление.

+0

Это похоже на трюк. Возможно ли, чтобы вы описали, почему это работает, когда элемент «RETURN, представление» возвращает плоский список? кажется немного противоречивым, чтобы понять, как работает 'collect()'. – AshHeskes

+0

Не должно быть неудовлетворительным в отношении вашего ответа, поскольку он явно работает. Однако я думаю, что это было бы полезно для сообщества, если бы вы могли дать немного больше объяснений в своем ответе о том, что происходит и почему это работает. – AshHeskes

+0

добавлено описание –

Смежные вопросы