我将以下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?
答案 0 :(得分:2)
在Cypher查询中,您尝试返回具有单个值(RESULT_ID,HSHLD_ID,CLUSTER_ID)及其集合的行,但由于您同时返回两者,因此您的集合将仅重复相同的值结果中出现的次数(例如,RESULT_ID = 1,result = [1,1,1,1])。我不认为这对你有用。
此外,原始查询中的任何内容似乎都不建议您需要聚合。您的GROUP BY列是唯一返回的列,没有聚合列,因此您似乎只需要不同的行。尝试从Cypher查询中删除收集列,并使用WITH DISTINCT
而不是WITH
。
如果这不起作用,那么我认为您需要进一步解释您试图获得的结果。