9

我正在尝试使用 LOAD CSV 创建节点,并将标签设置为 CSV 中的值。那可能吗?我正在尝试类似的东西:

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

...但我得到一个无效的语法错误。有没有办法做到这一点?

4

4 回答 4

7

二分之一,

首先,使用 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;

恩典与平安,

吉姆

于 2014-07-28T15:53:35.310 回答
3

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

克里斯

于 2014-07-28T10:17:58.080 回答
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
于 2014-07-28T11:39:14.613 回答
0

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

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

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

于 2019-07-23T18:56:55.370 回答