apoc.cypher.doit 有哪些使用示例?覆盖全参数的应用场景有哪些?
apoc.cypher.doit 全参数使用示例
函数基础参数说明
apoc.cypher.doit是APOC扩展库中用于执行动态Cypher语句的核心过程,支持参数化原生Cypher无法动态传入的标签、属性名、关系类型等内容,完整参数定义如下:
- 第一个参数
cypher:必填,字符串类型,需要执行的动态Cypher语句 - 第二个参数
params:必填,Map类型,传递给动态Cypher的参数集合,无参数时传空Map{}即可 - 第三个参数
readOnly:可选,布尔类型,默认值为false,设为true时仅允许执行只读查询,避免意外修改数据
场景1:只读查询(开启readOnly安全模式)
适合仅做数据查询、不需要修改图数据的场景,开启readOnly=true可以避免动态语句拼接错误导致的意外写入:
// 动态查询指定标签的节点总数 CALL apoc.cypher.doit( 'MATCH (n:$label) RETURN count(n) AS total', {label: 'User'}, true ) YIELD value RETURN value.total AS userCount;
场景2:执行写入操作(默认readOnly=false)
不需要传第三个参数即可执行数据创建、更新、删除等写入类操作:
// 批量创建商品节点 CALL apoc.cypher.doit( 'UNWIND $productList AS p CREATE (prod:Product {id: p.id, name: p.name, price: p.price}) RETURN collect(prod.id) AS createdIds', { productList: [ {id: 1, name: '无线耳机', price: 299}, {id: 2, name: '机械键盘', price: 499}, {id: 3, name: '显示器', price: 1299} ] } ) YIELD value RETURN value.createdIds AS newProductIds;
场景3:动态条件更新
可以灵活参数化查询条件、更新字段等内容,适配多维度的动态业务需求:
// 动态给满足指定价格阈值的商品打折扣标记 CALL apoc.cypher.doit( 'MATCH (n:$label) WHERE n.$prop < $threshold SET n.isDiscount = true RETURN count(n) AS updatedCount', { label: 'Product', prop: 'price', threshold: 300 } ) YIELD value RETURN value.updatedCount AS discountProductCount;
场景4:无外部参数的动态执行
如果动态Cypher不需要传入外部参数,第二个参数传空Map即可:
// 统计所有已支付订单的总金额,无需传参 CALL apoc.cypher.doit( 'MATCH (n:Order) WHERE n.status = "paid" RETURN sum(n.amount) AS totalPaidAmount', {} ) YIELD value RETURN value.totalPaidAmount AS totalTradeAmount;
注意事项
- 该过程支持参数化原生Cypher不支持的标签、关系类型、属性名,不需要手动拼接字符串,可以有效避免Cypher注入风险
- 所有查询返回的结果都封装在
valueMap中,直接通过value.字段名即可获取对应结果 - 纯查询场景建议始终开启
readOnly=true,提升执行安全性
内容的提问来源于stack exchange,提问作者KReddy
相关产品推荐
相关产品推荐

