假设数据库中已存在5800万个节点和1亿个关系。
然后我想通过LOAD CSV方法加载包含130万个节点和100万个关系的增量批处理数据,如下所示:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t'
MERGE (n:Person {cstid: row.cstid})
ON CREATE SET n.name = row.name
ON MATCH SET n.name = row.name;
此外,还有一个独特的限制:Person(cstid),我不想使用它。所以我尝试使用如下的SCAN提示:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t'
MERGE (n:Person {cstid: row.cstid})
USING SCAN n:Person
ON CREATE SET n.name = row.name
ON MATCH SET n.name = row.name;
但Neo4j只是发出警告,终止请求并直接退出:
WARNING: Invalid input 's': expected 'n/N' (line 3, column 2 (offset: 154))
"using scan n:Person"
^
如果我指定INDEX提示,这种现象也存在:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t'
MERGE (n:Person {cstid: row.cstid})
USING INDEX n:Person(cstid)
ON CREATE SET n.name = row.name
ON MATCH SET n.name = row.name;
那么...... Neo4j是否支持在MERGE子句中使用提示?
Neo4j:3.2.0 CE
答案 0 :(得分:1)
不,neo4j目前不支持带有USING
子句的MERGE
子句。
但是,这个逻辑上等效的查询应该有效:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t'
OPTIONAL MATCH (n:Person {cstid: row.cstid})
USING SCAN n:Person
FOREACH(ignored IN CASE WHEN n IS NULL THEN [1] END | CREATE (n:Person {cstid: row.cstid}))
SET n.name = row.name;
如果节点不存在,FOREACH
子句是用于创建节点的黑客。而且,由于您始终希望SET
name
属性,我们就是这样做的。