我正在尝试使用 LOAD CSV 创建节点,并将标签设置为 CSV 中的值。那可能吗?我正在尝试类似的东西:
LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS line
CREATE (x:line.label)
...但我得到一个无效的语法错误。有没有办法做到这一点?
二分之一,
首先,使用 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
将此粘贴到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
我环顾了几个这样的问题,得出的结论是,一种很好的简洁方法来处理无法通过“LOAD CSV”轻松添加动态标签的这些复杂挫败感,只需使用您最喜欢的编程语言读取 CSV 行,并生成 Cypher 语句的文本输出文件,该文件将生成所需的 Neo4j 节点/边缘结构。然后,您还可以直接编辑文本文件,以更改您想要进一步自定义命令的任何内容。
鉴于我对 Java 最熟悉,我个人使用 Java。我将 CSV 的每一行读入一个自定义对象,该对象代表我的 CSV 文件中的一行。然后,我将反映我想要的 Cypher 语句的行打印到文件中。然后我所要做的就是将这些命令剪切并粘贴到 Neo4j 浏览器命令行中。
这样,您可以根据需要构建命令,并且可以完全避免使用 Cypher 的“LOAD CSV”命令的限制