首页 > 解决方案 > Cypher 查询与多个匹配块的行为不符?

问题描述

我有以下查询:

MATCH (u:User) WHERE u.username = "ben"
OPTIONAL MATCH (u)-[:HAS]->(pl)

//MATCH (u)-[r1:IS_AT|PREFERS|DESIRES|VALUES]->()<-[]-(fp:FitnessProgram) WHERE NOT (fp)-[:LIMITED_BY]-(pl)
//WITH u,  pl, fp, coalesce(r1.importance, 0.5) AS importance
//WITH u,  pl, fp, collect({name: fp.name, importance: importance}) AS fpTraits
//WITH u,  pl, reduce(s = 0, t IN fpTraits | s + t.importance) AS fpScore order by fpScore

MATCH (u)-[r2:IS_AT|PREFERS|DESIRES|VALUES]->()<-[]-(ns:NutritionalSupplement) WHERE NOT (ns)-[:LIMITED_BY]-(pl)
WITH u,   ns, coalesce(r2.importance, 0.5) AS importance 
WITH u,   ns, collect({name: ns.name, importance: importance}) AS nsTraits
WITH u,   ns, reduce(s = 0, t IN nsTraits | s + t.importance) AS nsScore order by nsScore desc limit 5

return u, ns.name, nsScore

实际上,注释掉了 4 行后,它可以正常工作,并按预期为我提供了前 5 种营养补充剂。

如果我注释掉底部块并取消注释顶部块,则该块也可以按预期工作。

如果我都没有像下面这样评论,那么两个块都不起作用,我得到了一堆骗子而且分数都很疯狂......似乎这两场比赛以某种我还不理解的方式结合在一起(我是 Neo4j 的新手)?

MATCH (u:User) WHERE u.username = "ben"
OPTIONAL MATCH (u)-[:HAS]->(pl)

MATCH (u)-[r1:IS_AT|PREFERS|DESIRES|VALUES]->()<-[]-(fp:FitnessProgram) WHERE NOT (fp)-[:LIMITED_BY]-(pl)
WITH u,  pl, fp, coalesce(r1.importance, 0.5) AS importance
WITH u,  pl, fp, collect({name: fp.name, importance: importance}) AS fpTraits
WITH u,  pl, fp, reduce(s = 0, t IN fpTraits | s + t.importance) AS fpScore order by fpScore desc limit 5

MATCH (u)-[r2:IS_AT|PREFERS|DESIRES|VALUES]->()<-[]-(ns:NutritionalSupplement) WHERE NOT (ns)-[:LIMITED_BY]-(pl)
WITH u, fp, fpScore,  ns, coalesce(r2.importance, 0.5) AS importance 
WITH u, fp, fpScore,  ns, collect({name: ns.name, importance: importance}) AS nsTraits
WITH u, fp, fpScore,  ns, reduce(s = 0, t IN nsTraits | s + t.importance) AS nsScore order by nsScore desc limit 5

return u, fp.name, fpScore, ns.name, nsScore

标签: neo4jcypher

解决方案


您希望在最后一个块中具有什么值fp?它不是最后一个查询的一部分,所以我认为它不能出现在您的WITH陈述中

你不需要fp在你的陈述中不断声明WITH

MATCH (u)-[r2:IS_AT|PREFERS|DESIRES|VALUES]->()<-[]-(ns:NutritionalSupplement) 
WHERE NOT (ns)-[:LIMITED_BY]-(pl)
WITH u, ns, coalesce(r2.importance, 0.5) AS importance 
WITH u, ns, collect({name: ns.name, importance: importance}) AS nsTraits
WITH u  ns, reduce(s = 0, t IN nsTraits | s + t.importance) AS nsScore order by nsScore desc limit 5

return u, fp.name, fpScore, ns.name, nsScore

推荐阅读