如何在加载csv和合并Neo4j中的数据时使用提示
问题描述:
假设数据库中已经存在5800万个节点和1亿个关系。如何在加载csv和合并Neo4j中的数据时使用提示
然后我想要加载含有130万个节点和经由LOAD CSV方法百万关系象下面的增量批量数据:
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;
此外,有一个唯一的约束:人(cstid),我不想使用它。于是,我就使用扫描提示如下图所示:
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
答
没有,Neo4j的目前不支持与MERGE
子句USING
条款。
然而,这在逻辑上等效的查询应该工作:
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
财产,我们只是这样做。
什么是[1]代表什么? –
它是一个包含单个值(被忽略)的集合,它导致执行'|'后的操作(在本例中为一次)。如果要求迭代“NULL”值或空集合,“FOREACH”不执行任何操作。 – cybersam