如何拆分JSON中src字段元素并在Neo4j中创建带属性的节点?
解决方案
直接说重点:
- 处理大型JSON选
apoc.load.json准没错,它是流式加载,不会把整个大文件塞进内存,性能拉满 - 别用嵌套的
apoc.cypher.run了,不仅容易触发安全限制,逻辑还绕,直接在主查询里拆分、展开字段就行 - 拆分
src的时候记得把每个条目的前后空格去掉,不然节点属性会带多余空格,看着闹心
修正后的Cypher代码
CALL apoc.load.json("file:/Users/user/.Neo4jDesktop/relate-data/dbmss/dbms-969/import/example.json") YIELD value WITH value.transaction AS transaction, value.action AS action, value.dest.name AS dest_name, value.dest.address AS dest_address, value.dest.phone AS dest_phone, // 拆分src并去除每个条目的前后空格 [s IN split(value.src, ',') | trim(s)] AS src_list UNWIND src_list AS src_item CREATE (:Source { src: src_item, transaction: transaction, action: action, dest_name: dest_name, dest_address: dest_address, dest_phone: dest_phone }) RETURN src_item, transaction, action
关键说明
- 加载方式选哪个?
- 大文件就用
apoc.load.json,流式处理不占内存;如果是小JSON片段,用WITH {json} AS value也可以,但大文件别碰这个
- 大文件就用
- 原代码为啥报错?
- 嵌套
apoc.cypher.run需要额外开安全权限,默认是限制的,而且完全没必要用这个,绕远路 - 原代码拆分
src后没处理空格,会导致属性值带前缀,比如dummy834,这显然不是你想要的
- 嵌套
- 进阶玩法:关联Dest节点
如果想给每个Src节点关联对应的Dest节点,而不是把Dest属性塞进去,可这么写:CALL apoc.load.json("file:/Users/user/.Neo4jDesktop/relate-data/dbmss/dbms-969/import/example.json") YIELD value WITH value.transaction AS transaction, value.action AS action, value.dest AS dest, [s IN split(value.src, ',') | trim(s)] AS src_list // 先创建Dest节点(用MERGE避免重复) MERGE (:Dest { name: dest.name, address: dest.address, phone: dest.phone }) AS dest_node UNWIND src_list AS src_item // 创建Src节点 MERGE (:Source {src: src_item}) AS src_node // 给Src节点加其他属性 SET src_node.transaction = transaction, src_node.action = action // 建立Src和Dest的关联关系 MERGE (src_node)-[:BELONGS_TO_TRANSACTION]->(dest_node) RETURN src_node, dest_node
内容的提问来源于stack exchange,提问作者chickenleg
相关产品推荐
相关产品推荐

