Memgraph子查询使用咨询:我的子查询语句无法运行,Memgraph是否支持子查询?
Memgraph子查询支持说明及查询修正
一、Memgraph支持子查询吗?
当然支持,你用的CALL {}匿名子查询就是Memgraph支持的子查询语法之一,只是你的写法有几个问题导致跑不起来。
二、原查询的问题
- 没必要重复MATCH节点:你已经通过
MERGE拿到了element节点,子查询里又重新MATCH一模一样的节点,纯纯浪费性能还容易出问题。 - WITH语句丢了变量:子查询里
WITH element, rowData之后又写WITH rowData WHERE ...,直接把element的引用丢了,后续根本没法操作这个节点。 - 子查询没声明返回:Memgraph要求
CALL {}子查询要么返回结果,要么明确写RETURN VOID,不然会报错。 - 逻辑重复:两个子查询的判断条件可以合并,不用拆成两个单独的CALL块。
三、修正后的可用查询
UNWIND $data as rowData MERGE (element:Element {item_id: rowData.item_id, revision: rowData.revision, identifier: rowData.element_id}) WITH element, rowData CALL { WITH element, rowData WHERE rowData.has_superior = True IF rowData.superior <> '' THEN SET element.sub_index = rowData.sub_index ELSE REMOVE element.sub_index END } RETURN VOID
四、优化点说明
- 直接用之前
MERGE出来的element节点,省掉重复查询的步骤。 - 用
IF...ELSE把两个分支逻辑合并,代码更简洁,逻辑更清晰。 - 子查询最后加
RETURN VOID,满足Memgraph的语法要求,避免报错。 - 简化WITH语句,保证子查询里一直能拿到
element和rowData,不会丢变量。
内容的提问来源于stack exchange,提问作者Juliette Gia
相关产品推荐
相关产品推荐

