基于not in过滤关联关系的Gremlin转正确Cypher语句咨询
正确Cypher实现及错误说明
原Cypher错误原因
- 逻辑位置错误:将Entity4的name过滤条件写在了NOT判断外部,NOT子句内匹配的
oEntity4变量在外部未定义,会触发语法错误,同时也没有把name筛选纳入要否定的逻辑范围内 - 属性引用错误:直接判断节点对象
oEntity4属于字符串列表,实际需要判断节点的name属性 - 遗漏逻辑对齐:原Gremlin中Entity1的name是匹配BB、CC两个值,不是单个
$name参数,同时遗漏了原Gremlin中Entity4后面的in('Entity5')路径逻辑
正确Cypher语句
如果仅需要筛选符合要求的Entity3节点:
MATCH (e1:Entity1)<-[:Entity2]-()-[:Entity3]->(oEntity3:Entity3) WHERE e1.name IN ['BB', 'CC'] AND NOT EXISTS { MATCH (oEntity3)-[:Entity4]->(oEntity4:Entity4)<-[:Entity5]-() WHERE oEntity4.name IN ['ABC', 'XYZ'] } RETURN oEntity3
如果需要完全对齐原Gremlin的全链路逻辑,包含最后的in('Entity6')路径:
MATCH (e1:Entity1)<-[:Entity2]-()-[:Entity3]->(oEntity3:Entity3) WHERE e1.name IN ['BB', 'CC'] AND NOT EXISTS { MATCH (oEntity3)-[:Entity4]->(oEntity4:Entity4)<-[:Entity5]-() WHERE oEntity4.name IN ['ABC', 'XYZ'] } MATCH (oEntity3)<-[:Entity6]-(finalNode) RETURN finalNode
逻辑说明
- 用
EXISTS子查询包裹所有需要否定的路径逻辑,完全对应原Gremlin中not()函数的作用 - 所有节点标签、边方向、过滤条件都和原Gremlin逻辑一一对应
- 支持参数化改造,将
['BB', 'CC']替换为$entity1NameList、['ABC', 'XYZ']替换为$entity4NameList即可适配参数调用场景
内容的提问来源于stack exchange,提问作者HashDhi
相关产品推荐
相关产品推荐

