2016-12-14 6 views
0

以下のSQLクエリをcypherに翻訳しました。 cypher内のgroup byは暗黙的であり、混乱とより多くのクエリ実行時間が発生します。私のSQLクエリは次のとおりです。サイファーで効率的にグループ化するにはどうすればいいですか?

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; 

同等CYPHERクエリは次のとおりです。

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

関連する問題