加载DEA药品交易CSV数据时出现Neo4j语法错误求助
问题诊断与修正
你的Cypher查询语法错误的核心原因是:apoc.periodic.iterate的第一个参数需要是字符串格式的Cypher查询语句,但你直接写了LOAD CSV代码,没有用引号包裹,导致Neo4j解析时识别错误。
另外还有两个小问题需要修正:
- 第二个参数里的箭头符号是HTML转义的
->,要替换成Cypher原生的-> - 第一个参数的
LOAD CSV语句结尾多了一个逗号,需要删除
修正后的完整查询语句
CALL apoc.periodic.iterate( 'LOAD CSV WITH HEADERS FROM "file:///TruncatedDEA.csv" AS line', 'MERGE (buyer:Buyer {BUYER_DEA_NO: line.BUYER_DEA_NO}) ON CREATE SET buyer.BUYER_BUS_ACT = line.BUYER_BUS_ACT, buyer.BUYER_NAME = line.BUYER_NAME, buyer.BUYER_ADDL_CO_INFO = line.BUYER_ADDL_CO_INFO, buyer.BUYER_ADDRESS1 = line.BUYER_ADDRESS1, buyer.BUYER_ADDRESS2 = line.BUYER_ADDRESS2, buyer.BUYER_CITY = line.BUYER_CITY, buyer.BUYER_STATE = line.BUYER_STATE, buyer.BUYER_ZIP = line.BUYER_ZIP, buyer.BUYER_COUNTY = line.BUYER_COUNTY; MERGE (reporter:Reporter {REPORTER_DEA_NO: line.REPORTER_DEA_NO}) ON CREATE SET reporter.REPORTER_BUS_ACT = line.REPORTER_BUS_ACT, reporter.REPORTER_NAME = line.REPORTER_NAME, reporter.REPORTER_ADDL_CO_INFO = line.REPORTER_ADDL_CO_INFO, reporter.REPORTER_ADDRESS1 = line.REPORTER_ADDRESS1, reporter.REPORTER_ADDRESS2 = line.REPORTER_ADDRESS2, reporter.REPORTER_CITY = line.REPORTER_CITY, reporter.REPORTER_STATE = line.REPORTER_STATE, reporter.REPORTER_ZIP = line.REPORTER_ZIP, reporter.REPORTER_COUNTY = line.REPORTER_COUNTY, reporter.Reporter_family = line.Reporter_family; MERGE (drug:Drug {DRUG_CODE: line.DRUG_CODE}) ON CREATE SET drug.DRUG_NAME = line.DRUG_NAME, drug.Product_Name = line.Product_Name, drug.Ingredient_Name = line.Ingredient_Name, drug.Measure = line.Measure, drug.MME_Conversion_Factor = line.MME_Conversion_Factor, drug.Combined_Labeler_Name = line.Combined_Labeler_Name, drug.dos_str = line.dos_str, drug.MME = line.MME; MATCH (buyer:Buyer {BUYER_DEA_NO: line.BUYER_DEA_NO}) MATCH (reporter:Reporter {REPORTER_DEA_NO: line.REPORTER_DEA_NO}) MATCH (drug:Drug {DRUG_CODE: line.DRUG_CODE}) MERGE (transaction:Transaction {TRANSACTION_ID: line.TRANSACTION_ID}) ON CREATE SET transaction.TRANSACTION_CODE = line.TRANSACTION_CODE, transaction.QUANTITY = line.QUANTITY, transaction.UNIT = line.UNIT, transaction.ACTION_INDICATOR = line.ACTION_INDICATOR, transaction.ORDER_FORM_NO = line.ORDER_FORM_NO, transaction.CORRECTION_NO = line.CORRECTION_NO, transaction.TRANSACTION_DATE = line.TRANSACTION_DATE; MERGE (buyer)-[:BOUGHT]->(transaction) MERGE (reporter)-[:REPORTED]->(transaction) MERGE (drug)-[:CONTAINS]->(transaction);', {batchSize:1000, parallel:false} );
关键修正点说明
- 给第一个参数的
LOAD CSV语句加上单引号包裹,同时将路径里的单引号改为双引号,避免字符串嵌套冲突 - 删除第一个参数末尾多余的逗号
- 将所有
->替换为Cypher标准的->箭头符号
内容的提问来源于stack exchange,提问作者Daniël Scheeper
相关产品推荐
相关产品推荐

