如何有效地在密码中分组?

时间:2016-12-14 11:02:03

标签: postgresql neo4j cypher

我将以下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; 

等效的密码查询是:

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(),此查询运行缓慢。没有收集功能不是按结果给我的组。有没有办法优化它?或者更好地在cypher中实现group?

1 个答案:

答案 0 :(得分:2)

在Cypher查询中,您尝试返回具有单个值(RESULT_ID,HSHLD_ID,CLUSTER_ID)及其集合的行,但由于您同时返回两者,因此您的集合将仅重复相同的值结果中出现的次数(例如,RESULT_ID = 1,result = [1,1,1,1])。我不认为这对你有用。

此外,原始查询中的任何内容似乎都不建议您需要聚合。您的GROUP BY列是唯一返回的列,没有聚合列,因此您似乎只需要不同的行。尝试从Cypher查询中删除收集列,并使用WITH DISTINCT而不是WITH

如果这不起作用,那么我认为您需要进一步解释您试图获得的结果。