OrientDB:如何使用MATCH语句结合遍历实现删除操作?
解决OrientDB中带遍历的MATCH语句删除顶点问题
我来帮你搞定这个问题!在OrientDB里,用带遍历的MATCH语句删除目标顶点其实有更简洁可靠的方式,你之前那种多层嵌套子查询的写法确实容易导致解析异常,没法正常工作。
正确的两种写法
写法一:直接将MATCH结果传入DELETE VERTEX
DELETE VERTEX ( MATCH { class: classroom, where: (id = 999) }.in(){ class: student, as: targetStudent } RETURN targetStudent )
这里要注意遍历方向:你原来用的是student.in()关联到classroom,所以对应的反向就是classroom.in()找到关联它的学生,如果你实际的边方向是教室指向学生,那把.in()改成.out()就好。
写法二:MATCH后直接执行DELETE
OrientDB支持在MATCH语句后直接绑定DELETE操作,写法更直观:
MATCH { class: classroom, where: (id = 999) }.in(){ class: student, as: studentToDelete } DELETE VERTEX studentToDelete
为什么你的原语句失效?
你之前的语句嵌套了两层SELECT,OrientDB的DELETE VERTEX对这种嵌套子查询的支持并不友好,解析器无法正确识别要删除的目标顶点集合。而上面两种写法都是直接将MATCH遍历得到的顶点集合作为删除目标,逻辑更清晰,也能被数据库正确解析。
额外注意事项
- 确认遍历方向和边的关系匹配,避免误删其他顶点;
- 确保执行语句的账号有足够的删除权限;
- 可以先把DELETE换成RETURN,执行一遍确认返回的顶点是你要删除的目标,再执行删除操作更安全。
内容的提问来源于stack exchange,提问作者jnc
相关产品推荐
相关产品推荐

