Neo4j Cypher 减少 UNWIND 调用

问题描述 投票:0回答:2

我有以下密码查询:

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

我的错误在哪里?

neo4j cypher
2个回答
0
投票

如果您可以显示剩余的查询(可能是演示图)以及您想要实现的目标,那将会有所帮助。

您当前的密码查询不包含针对数据库的实际读取子句,仅引用一些变量。因此,您不限于在数据库内运行这些查询,并且可以在应用程序内执行逻辑。尽管取决于可变大小,但这可能不实用或不高性能。

需要更多详细信息才能得到更好的答案:)


0
投票

您的第二个片段没有与

size(cGroups) >= size(childD.detailedCriterionIds)
测试等效的内容,因此它不会总是产生相同的结果。

为了进行该测试,您需要计算

cGroups
的数量。因此,可能没有比您在第一个片段中已经执行的方法更好的方法了。

小问题:

WITH childD, childDStat, cGroup
子句是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.