Neo4j Cypher - 使用LOAD CSV创建节点和设置标签

时间:2014-07-28 10:12:08

标签: csv neo4j cypher load-csv

我正在尝试使用LOAD CSV创建节点,并将标签设置为CSV中的值。那可能吗?我正在尝试这样的事情:

LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS line
CREATE (x:line.label)

...但是语法错误无效。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:6)

bicpence,

首先,使用Java批量导入应用程序非常容易,而且编写起来并不困难。见this batch inserter example。您可以使用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;

恩典与和平,

吉姆

答案 1 :(得分:2)

不幸的是,不支持参数化标签

克里斯

答案 2 :(得分:2)

你可以做一个解决方法 - 创建所有节点,然后过滤它们并创建所需的节点,而不是删除那些旧节点

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

将其粘贴到http://console.neo4j.org中以查看示例:

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

答案 3 :(得分:0)

我环顾了这样的几个问题,得出的结论是,处理无法通过'LOAD CSV'轻松添加动态标签的这类复杂挫折的一种简洁明了的方法就是简单地使用您喜欢的方法编程语言来读取CSV行,并生成Cypher语句的文本输出文件,该文件将生成所需的Neo4j节点/边缘结构。然后,您还可以直接编辑文本文件,以更改您想要进一步自定义命令的内容。

我个人使用Java是因为我最熟悉Java。我将CSV的每一行读入一个自定义对象,该对象代表CSV文件中的一行。然后,我将反映我想要的Cypher语句的行打印到文件中。然后,我要做的就是将这些命令剪切并粘贴到Neo4j浏览器命令行中。

这样,您可以根据需要构建命令,并且可以完全避免使用Cypher的'LOAD CSV'命令的局限性