2013-12-11 3 views
1

지도와 같은 쿼리 기능을 수행 할 Cypher 쿼리가 있는지 확인하려고합니다. 주어진 예제 데이터.중첩 된 관계에 대한 Cypher 쿼리

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

여기까지는 node과 일치하는 쿼리가 있습니다.

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

(이 쿼리에 representation 난 그냥 쓰는 표현을 유지하기 위해 위의 그림에서 공간이 충분하지 않은 node에 해당합니다).

예상대로이 쿼리는 모든 item 노드와 관련된 표현의 단순 목록 만 반환합니다. 예 :

[ representation, representation, representation.... ] 

는 내가 정말 원하는 것은 자신의 관련 representation의 예와 items의 중첩 된 구조를 반환하는 쿼리입니다

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

return의 정확한 구조는 중요하지 않습니다. 각 itemrepresentations에 대한 쿼리를 보내지 않고 itemrepresentations에 쉽게 매핑 할 수 있습니다.

이것은 사소한 질문처럼 보일 수 있지만 Cypher 치트 시트를보고 동영상 및 인터넷 검색 Cypher 자습서를보고 난 후에 볼 수 있습니다. Cypher를 사용하여 이러한 쿼리 (또는 대부분의 쿼리)를 수행하는 방법에 대한 간단한 설명을 아직 찾지 못했습니다.

(사람이 또한 "인형에 대한 사이퍼"는의 내가 더 감사하겠습니다 튜토리얼을 알고 있다면 보조 노트에.)

+0

'반환 항목, 표현 ', 아니요? –

+0

@ JamesR 나는 단서가 없다. 단락의 목적을 결코 이해하지 못했다.'items'의 편평한 목록과'표현의 편평한 목록 '을 반환하는 것을 의미한다고 생각했습니다. 나는 그것을 시도 할 것이다 :) – AshHeskes

+0

@JamesR \t 그냥 시도하고'items'과'representation'의 편평한 목록을 참으로 반환합니다. – AshHeskes

답변

6

비결은 aggregation를 사용하는 것입니다.

RETURN item, collect(representation) as representations 

group by없이 집계가 작동합니다. 당신이 당신의 return 절에 적어도 하나의 집계 함수 (count, collect, avg, min, max 등)를 사용하는 경우

는 모든 비 집계 열이 키를 그룹화로 처리됩니다. 다만 반복적 인 선언입니다

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

:

SQL에서 당신은 다음처럼 작성할 수 있습니다.

+0

그건 트릭을 고수 한 것 같습니다. 'RETURN item, representation'이 플랫리스트를 반환 할 때 이것이 왜 작동 하는지를 설명 할 수 있습니까? 'collect()'가 어떻게 작동하는지 이해하는 것은 다소 직관적이지 않은 것처럼 보입니다. – AshHeskes

+0

명확하게 작동하므로 답을 모르는 척하지 마십시오. 그러나 나는 그것이 지역 사회에 도움이 될 것이라고 생각합니다. 당신이 무슨 일이 벌어지고 왜 이것이 효과가 있는지에 대한 대답에 대해 좀 더 설명을 해줄 수 있다면 요. – AshHeskes

+0

설명이 추가되었습니다. –