如何编写与给定SQL子查询等效的CypherQL查询语句?
现有写法正误判断
你给出的初步写法是不正确的。
符合你需求的正确写法
你需要先把第一个MATCH查询得到的所有字符串值聚合为一个列表,再用这个列表做IN条件筛选,写法如下:
MATCH (e)--(m) // 收集e节点的otherfield属性值,加DISTINCT可以去重避免冗余 WITH collect(DISTINCT e.otherfield) AS target_str_list MATCH (a) WHERE a.field IN target_str_list RETURN a
如果你只需要返回a节点的name属性,将最后一行改为RETURN a.name即可。
原写法的问题说明
Cypher默认采用逐行流式处理逻辑,你原来的写法没有对第一个MATCH返回的e节点属性做聚合,会逐行拿单个e的otherfield值去匹配a节点,最终会产生大量重复返回结果,也不符合你「基于第一组查询的全部结果做筛选」的需求。
对应你给出的SQL语句的通用等效写法
如果是完全匹配SQL逻辑的通用场景,假设:
- SQL中的
othertable对应图数据库中标签为OtherTable的节点 - SQL中的
table对应图数据库中标签为Table的节点 - 子查询返回的
othertable字段对应OtherTable节点的target_col属性
等效Cypher写法如下:
MATCH (ot:OtherTable) WITH collect(DISTINCT ot.target_col) AS ot_value_list MATCH (t:Table) WHERE t.field IN ot_value_list RETURN t.name
内容的提问来源于stack exchange,提问作者Hysii
相关产品推荐
相关产品推荐

