通过 Cypher-Shell 在 Neo4j 3.x 中导入 CSV 文件

Import CSV file in Neo4j 3.x via Cypher-Shell

我正在尝试通过 macOS 开发机器上的 Cypher Shell(而不是 Neo4j - Shell)将大型 CSV 文件导入 Neo4j 3.x。

导入语句在密码脚本文件中定义。

我已将 conf 文件中的正确导入目录设置为 "conf-path for import CSV files"。

当我按如下方式输入命令时:

1
cat <path to the Cypher script file> | $NEO4J_HOME/bin/cypher-shell -u user -p password --format auto

当 shell 尝试访问 CSV 文件时,会预先添加 Neo4j 应用程序的路径。这会导致这样的连接路径:

1
file:/<path to the Neo4j App/neo4j-community-3.x>/file:<path to the CSV file set within conf>/Import.CSV

这会引发"无法在...处加载外部资源"错误

Cypher 脚本已正确加载,因为前面的 CONSTRAINT 命令已按预期执行。 Cypher 脚本在尝试使用 "LOAD_CSV" 访问 CSV 文件时失败。

是否需要进行任何其他设置才能让 Cypher Shell 知道它不应该添加 Neo4j 应用程序目录?

我试图在文档中找到它,但运气不佳。

非常感谢任何帮助。

谢谢

克里德


开箱即用,可以导入 CSV 的唯一位置是 import 文件夹。

任何 LOAD CSV 语句都必须与该目录相关;即 LOAD CSV FROM"file:///mydata.csv" 加载位于导入文件夹中的文件

这是有充分理由的;文件系统的保护非常重要,能够从任何位置导入任意 CSV 文件会扩大恶意上传和/或执行的攻击向量。

但是,如果要更改被认为是导入目录的目录,那是完全可以的。

您可以更改被视为导入文件夹的目录。

这可以通过在配置中设置 dbms.directories.import 指向不同的文件夹来完成;即,将其设置为 /var/uploads 将允许从该目录加载 CSV,或将其设置为 /home/krid/my-neo-imports/ 之类的内容以使用该目录。然后,LOAD CSV 文件 URL 将相对于该位置。

如果需要,您甚至可以在导入目录中设置目录层次结构,以便组织导入的文件。例如,您可以在导入目录中放置一个 dataset1dataset2 目录,然后在 dataset1 中放置一个名为 members.csv 的文件,在 dataset2 中放置一个名为 events.csv 的文件。然后,您将分别通过执行 LOAD CSV FROM"file:///dataset1/members.csvLOAD CSV FROM"file:///dataset2/events.csv 来加载每个文件。

如果您希望能够从任何位置上传,请将其设置为 "/"。

如果您将 dbms.directories.import 设置为 root ("/"),则可以导入整个文件系统上的任何文件。但是,您需要在上传时指定相对于文件系统根目录的路径。

请注意,此选项将使潜在攻击者更容易上传恶意导入脚本。


要简单地加载 CSV,您必须:

  • 将其复制到 Neo4j 的 import 文件夹下
  • 在您的密码脚本中,路径文件将是 file:///MY_CSV_FILE.csv