2016-12-14 1 views
0

SQL 쿼리를 cypher로 번역했습니다. cypher의 group by은 암시 적이며 혼란과 쿼리 실행 시간이 길어집니다. 내 SQL 쿼리는 다음과 같습니다cypher에서 효율적으로 그룹화하는 방법은 무엇입니까?

INSERT INTO tmp_build 
    (result_id, hshld_id, product_id) 
SELECT b.result_id, a.hshld_id, b.cluster_id 
    FROM fact a 
     INNER JOIN productdata b ON a.product_id = b.barcode 
WHERE b.result_id = 1 
GROUP BY b.result_id, a.hshld_id, b.cluster_id; 

등가 사이퍼 쿼리는 다음과 같습니다

MATCH (b:PRODUCTDATA {RESULT_ID: 1 }) 
WITH b 
MATCH (b)<-[:CREATES_PRODUCTDATA]-(a:FACT) 
WITH b.RESULT_ID as RESULT_ID , collect(b.RESULT_ID) as result, a.HSHLD_ID as HSHLD_ID, 
    collect(a.HSHLD_ID) as hshld, b.CLUSTER_ID as CLUSTER_ID, collect(b.CLUSTER_ID) as cluster 
CREATE (:TMP_BUILD { RESULT_ID:RESULT_ID , HSHLD_ID:HSHLD_ID , PRODUCT_ID:CLUSTER_ID }); 

이 쿼리 때문에 collect()의 느린 실행 중입니다. 수집 기능을 사용하지 않으면 결과별로 그룹을 제공하지 않습니다. 최적화 할 방법이 있습니까? 또는 사이퍼에 그룹 바이어를 더 잘 구현할 수 있습니까?

+0

결론적 인 답변을 원한다면 약간의 대표 데이터를 추가 할 것입니다. 입력과 예상 출력 모두 도움이 될 것입니다. –

답변

2

Cypher 쿼리에서 단일 값 (RESULT_ID, HSHLD_ID, CLUSTER_ID)과 해당 컬렉션을 모두 반환하려고 시도하지만 둘 다 반환하기 때문에 컬렉션의 숫자가 같은 값만 반복됩니다 (예 : RESULT_ID = 1, result = [1,1,1,1]). 나는 그것이 당신에게 유용하다고 생각하지 않습니다.

또한 원래 쿼리에서 집계가 필요하다고 제안하는 항목이 없습니다. GROUP BY 열만 반환되는 열이며 집계 열이 없으므로 고유 한 행이 필요합니다. Cypher 쿼리에서 컬렉션 열을 제거하고 WITH 대신 WITH DISTINCT을 사용해보세요.

그래도 작동하지 않는다면 결과로 얻으려는 것이 무엇인지 정확하게 설명해야한다고 생각합니다.

+0

감사합니다. – Arezoo

관련 문제