2016-10-16 1 views
0

:쿼리 노드 속성 목록의 목록에 관련된 노드 속성, 다음 스키마/데이터 집합을 감안할 때 추적 계층

(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이야. ,

  1. "A1" :

    내가 a 당 하나의 행 (주어진 데이터 세트에 대한 2 행)를 생성 할 탐색 질의, 따라서 결과의 빈 어레이 계층을 나타내는 데이터가 희소 수 있다는 것을 알 ["B1", "B2"], [["C1","C2"],["C3"]]

  2. "A2", ["B3", "B4"],

답변

1

당신이 COLLECT [또는 기타 집계, 다른, 행에 징수 [집계되지 않은] 값을 사용하여 집계 집계 키로 다른 모든 값이 일치 공유 그래서 행만을 제공 . 쿼리의 경우, 기본적으로 bc의의 모든 목록을 모두 첫번째 ab에 의해 키가 c의 목록을 얻을, 그래서 같은 두 개의 별도의 단계로 COLLECT의 스택, 다음 수집해야 과 같이, 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가 없으면 cs_per_b 안에 빈 목록이 생깁니다.

0

질문은 당신이 노드를 나열 할 상태이지만 [[],["C4"]] "홍보 operties "를 사용하면 예제 결과에 노드 레이블이 대신 나열됩니다.

노드의 레이블을 표시하려면 다음 쿼리 작업을해야합니다 :

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; 

쿼리는이 Ax, BxCx 노드 레이블을 구별하기 위해 ONETWO 관계 유형을 사용하기에 충분하다고 가정, 그 노드에는 단일 레이블 만 있습니다. 샘플 결과가 선택 사항임을 암시하기 때문에 TWO 관계에 OPTIONAL MATCH을 사용합니다.

+0

답변 해 주셔서 감사합니다. 내가 필요로했던 이전의'collect'의'collect' 결과였습니다. Tore의 대답은 내가 무엇을했는지 & 달성하는 방법을 설명했다; 당신의 대답은 정확합니다 :-) – Merrick