Neo4j Cypher:如何查询用户B可访问但用户A无权限的仓库
问题原因
你编写的Cypher出错的核心原因是没有将用户A的仓库名称聚合为列表:WITH r.name AS userARepositories会将匹配到的A的每个仓库名作为单独的变量值向下传递,而非整合成一个包含所有A有权限仓库名的集合,后续IN判断的逻辑自然无法正常生效。另外原有代码里使用无类型的关系匹配-[]->,如果User和Repository之间还有其他关联关系也会被误匹配,建议明确指定关系类型。
修正后的写法(兼容原有逻辑)
只需要在原有基础上用collect()函数将A的仓库名聚合为列表即可:
MATCH (:User{name:"A"})-[:HAS_ACCESS_TO]->(r:Repository) WITH collect(r.name) AS userARepositories MATCH (:User{name:"B"})-[:HAS_ACCESS_TO]->(r:Repository) WHERE NOT r.name IN userARepositories RETURN r.name
更优的实现写法
不需要提前聚合列表,直接通过存在性判断过滤结果,性能更优、逻辑更直观:
MATCH (:User{name:"B"})-[:HAS_ACCESS_TO]->(r:Repository) WHERE NOT EXISTS { MATCH (:User{name:"A"})-[:HAS_ACCESS_TO]->(r) } RETURN r.name
内容的提问来源于stack exchange,提问作者Juicy
相关产品推荐
相关产品推荐

