neo4j - 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
解决方案
您希望在最后一个块中具有什么值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
推荐阅读
- sql - 多个表 - 基于 Where 子句的最低值
- amazon-web-services - GlacierSelectNotAvailable:Glacier 选择检索当前不可用,请稍后再试
- image - 有没有办法在喜欢按钮上使用共享偏好
- python - 使用 dateutil 从 PST 转换为 UTC 的问题
- c# - 如何使用 ASP.Net MVC 发送带有 OAuth 2.0 访问令牌的 HTTP 请求?
- graphviz - Graphviz - 有没有办法避免属性中的长字符串?
- python - 如何使用 django-allauth 查找用户的 patreon 质押层进行身份验证
- python - Django CharField 在不应该接受空值时接受
- r - 闪亮的股票图表错误:chartSeries 需要一个 xtsible 对象
- ios - 我在 mapView 中添加多个标记时遇到问题