我有以下密码查询:
UNWIND childD.detailedCriterionIds as dCId
WITH childD, childDStat, dCId + coalesce(childDStat['replaceableCriterionIds.' + dCId],[]) as cGroup
WITH childD, childDStat, cGroup
WHERE NOT AlL(x IN cGroup WHERE x IN $zeroCriterionIds )
WITH childD, childDStat, collect(cGroup) as cGroups
WHERE size(cGroups) >= size(childD.detailedCriterionIds)
WITH childD, childDStat, cGroups
UNWIND cGroups as cGroup
WITH childD, childDStat, cGroup
WHERE ANY(x IN cGroup WHERE x IN $detailedCriterionIds)
WITH childD, childDStat, collect(cGroup) as cGroups
WHERE size(cGroups) > 0
如您所见,我在那里使用了 2 个 UNWIND。是否可以优化此查询以避免第二次 UNWIND?如果是这样,你能告诉我怎么做吗?
我尝试了以下方法,但产生了不同的结果:
UNWIND childD.detailedCriterionIds as dCId
WITH childD, childDStat, dCId + coalesce(childDStat['replaceableCriterionIds.' + dCId],[]) as cGroup
WITH childD, childDStat, cGroup
WHERE NOT AlL(x IN cGroup WHERE x IN $zeroCriterionIds )
AND ANY(x IN cGroup WHERE x IN $detailedCriterionIds)
WITH childD, childDStat, collect(cGroup) as cGroups
WHERE size(cGroups) > 0
我的错误在哪里?
如果您可以显示剩余的查询(可能是演示图)以及您想要实现的目标,那将会有所帮助。
您当前的密码查询不包含针对数据库的实际读取子句,仅引用一些变量。因此,您不限于在数据库内运行这些查询,并且可以在应用程序内执行逻辑。尽管取决于可变大小,但这可能不实用或不高性能。
需要更多详细信息才能得到更好的答案:)
您的第二个片段没有与
size(cGroups) >= size(childD.detailedCriterionIds)
测试等效的内容,因此它不会总是产生相同的结果。
为了进行该测试,您需要计算
cGroups
的数量。因此,可能没有比您在第一个片段中已经执行的方法更好的方法了。
小问题:
WITH childD, childDStat, cGroup
子句是多余的。