我正在尝试使用LOAD CSV创建节点,将标签设置为来自CSV的值。这是可能的吗?我正在尝试类似以下的东西:
LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS line
CREATE (x:line.label)
...但我得到了一个无效语法错误。有没有什么方法可以解决这个问题?
bicpence,
首先,使用Java批量导入应用程序很容易实现,编写起来也不难。请参考此批量插入示例。您可以使用opencsv读取您的CSV文件。
如果您更愿意使用Cypher,并且您有一个有限的标签集合要处理,那么您可以尝试这样做:
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS LINE
CREATE (n:load {lab:line.label, prop:line.prop});
CREATE INDEX ON :load(lab);
MATCH (n:load {lab:'label1'})
SET n:label1
REMOVE n:load
REMOVE n.lab;
MATCH (n:load {lab:'label2'})
SET n:label2
REMOVE n:load
REMOVE n.lab;
恩惠与平安,
吉姆
LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS line
CREATE (tmp:line[1])
WITH tmp
CREATE (x:Person {name: labels(tmp)[0]})
WITH tmp
REMOVE tmp
LOAD CSV
WITH HEADERS FROM "http://docs.neo4j.org/chunked/2.1.2/csv/import/persons.csv" AS csvLine
CREATE (p:tmp { id: toInt(csvLine.id), name: csvLine.name })
WITH p
CREATE (pp:Person { name: labels(p)[0]})
WITH p, pp
DELETE p
RETURN pp
Jim Biard的回答 可以正常运行,但使用了PERIODIC COMMIT
,虽然有用但已过时。
我能够编写一个查询:
:auto LOAD CSV WITH HEADERS FROM 'file:///nodes_build_ont_small.csv' AS row
CALL {
with row
call apoc.create.node([row.label], {id: row.id})
yield node
return null
} IN TRANSACTIONS of 100 rows
return null
看起来apoc过程比命令本身更有用,因为使用CREATE
命令无法实现这一点(至少在我的尝试中是如此)。