使用Cypher查询RedisGraph时能否自动忽略无关联边的Country节点?
这个需求可以通过Cypher实现,核心逻辑是先对传入的国家列表做过滤,自动剔除无关联的国家后,再校验当前电影是否匹配所有剩余有效国家即可。
原查询&尝试版本问题说明
- 原始查询用多个AND强制要求匹配所有传入国家,只要其中一个国家无关联边就会返回空结果
- 你尝试的版本存在语法错误:
AND IN relevant_countries是非法写法,元素在列表中的判断格式应为element IN list,同时重复匹配关联边的逻辑完全冗余
正确实现方案
根据你说的「无关联边的Country节点」的两种定义,对应两种实现:
场景1:忽略和当前目标电影无关联边的国家
如果只要传入国家和当前查询的电影没有关联边就自动忽略,仅要求电影匹配所有和它有关联的传入国家,用以下写法:
MATCH (m:Movie)<-[:ACTED_IN]-(a:Actor) WHERE m.title = 'Matrix' WITH m, collect(a) AS actors, ['Italy', 'Spain', 'Greece'] AS target_countries // 筛选出传入列表中与当前电影有关联的国家 MATCH (m)<-[:AVAILABLE_IN]-(c:Country) WHERE c.value IN target_countries WITH m, actors, collect(DISTINCT c.value) AS matched_countries // 可根据业务调整,比如要求至少匹配1个国家才返回 WHERE size(matched_countries) > 0 RETURN actors, m
场景2:忽略本身没有任何AVAILABLE_IN边的国家
如果只要Country节点本身没有任何AVAILABLE_IN边(不管和哪个电影关联)就自动忽略,要求当前电影必须匹配所有本身有边的传入国家,用以下写法:
MATCH (m:Movie)<-[:ACTED_IN]-(a:Actor) WHERE m.title = 'Matrix' WITH m, collect(a) AS actors, ['Italy', 'Spain', 'Greece'] AS target_countries // 筛选传入列表中本身存在AVAILABLE_IN边的有效国家 MATCH (c:Country) WHERE c.value IN target_countries AND exists((c)-[:AVAILABLE_IN]->()) WITH m, actors, collect(DISTINCT c.value) AS valid_countries // 要求当前电影和所有有效国家都有关联 WHERE all(country IN valid_countries WHERE exists((m)<-[:AVAILABLE_IN]-(:Country {value: country}))) RETURN actors, m
DSL生成适配说明
你可以把['Italy', 'Spain', 'Greece']和'Matrix'替换成参数化变量,你的DSL生成的时候不需要再拼接多个AND条件,直接用上面的模板传入目标值即可。
内容的提问来源于stack exchange,提问作者lukasm
相关产品推荐
相关产品推荐

