3.3.6 LOAD CSV语句
LOAD CSV语句用于从CSV文件中导入数据。
● CSV文件的URL可以由FROM后面紧跟的任意表达式来指定。
● 需要使用AS来为CSV数据指定一个变量。
● LOAD CSV支持以gzip、Deflate和ZIP压缩的资源。
● CSV文件可以存在数据库服务器上,通过file:///URL来访问。LOAD CSV也支持通过HTTPS、HTTP和FTP来访问CSV文件。
● LOAD CSV支持HTTP重定向,但基于安全考虑,重定向时不能改变协议类型,比如从HTTPS重定向到HTTP。
3.3.6.1 文件URL的配置项
(1)dbms.security.allow_csv_import_from_file_urls(6)
这个选项决定Cypher在使用LOAD CSV时是否支持使用fille:/// URL来加载数据。该URL唯一标识了数据库服务器文件系统上的文件。dbms.security.allow_csv_import_from_file_urls=false将完全禁止LOAD CSV访问文件系统。
(2)dbms.directories.import(7)
设置LOAD CSV中file:/// URL中的根路径。这必须设置为数据库服务器上的文件系统的单个目录,它让所有的请求从file:///URL加载时都使用根路径的相对路径(类似UNIX下的chroot操作)。默认值是import,这是基于安全考虑阻止数据库访问标准的import之外的目录下的文件。将dbms.directories.import设置为空可以消除这个安全隐患,允许访问系统上的任何文件,但是不推荐这么做。
文件URLs将相对于dbms.directories.import来解析。例如,一个典型的URL类似file:///myfile.csv或者file:///myproject/myfile.csv。
● 如果dbms.directories.import设置的是默认值import,那么在LOAD CSV语句将分别从<NEO4J_HOME>/import/myfile.csv和<NEO4J_HOME>/import/myproject/myfile.csv中读取数据。
● 如果设置为/data/csv,上面的LOAD CSV中的URL将分别从/data/csv/myfile.csv和/data/csv/myproject/myfile.csv中读取数据。
详情参见下面小节的例子。
3.3.6.2 CSV文件格式
使用LOAD CSV导入的CSV文件必须满足如下要求:
● 字符编码为UTF-8。
● 行结束符取决于具体的操作系统,如unix上为\n,windows上为\r\n。
● 默认的字段终止符为“,”。
● 字段终止符可以使用LOAD CSV中的FIELDTERMINATOR选项来修改。
● CSV文件允许引号字符串,但读取数据的时候引号字符会被丢弃。
● 字符串的引号字符为双引号“"”。
● 转义字符为“\”。
3.3.6.3 从CSV文件导入数据
从CSV文件导入数据到Neo4j,可以用LOAD CSV把数据加载到查询语句中。然后使用正常的Cypher更新语句将数据写入到数据库中。
比如artists.csv文件内容如下:
查询:
CSV文件中的每一行都创建一个标签为Artist的节点。CSV文件中的另外两列分别设置为节点的属性。
结果:
3.3.6.4 导入包含文件头的CSV文件
当导入的CSV文件包含文件头时,可以把每一行看作一个map,而不是字符串数组。
比如artists.csv文件内容如下:
查询:
这时,文件的开始行包含列的名称。指定WITH HEADERS后,可以通过对应的列名来访问指定的字段。
结果:
3.3.6.5 导入自定义分隔符的CSV文件
CSV文件的分隔符有时候不是逗号,而是其他分隔符。这时可以使用FIELDTERMINATOR来指定分隔符。
比如artists-fieldterminator.csv文件内容如下:
查询:
本例中字段之间以分号分隔,因此,在LOAD CSV中使用了FIELDTERMINATOR自定义分隔符。
结果:
3.3.6.6 导入海量数据
如果导入的CSV文件包含百万数量级的行,可以使用USING PERIODIC COMMIT来告诉Neo4j每导入一定数量行之后就提交(Commit)一次。这样可避免在事务过程中耗费大量的内存。默认情况下,每1000行会提交一次。
查询:
结果:
3.3.6.7 设置提交频率
可以设置提交的频率,如本例中设置为500行。
查询:
结果:
3.3.6.8 导入包含转义字符的数据
本例中同时包含了引用字符和转义字符。
比如artists-with-escaped-char.csv文件内容如下:
查询:
提示:提示:这里的字符串用双引号括起来。同时,关注本例中字符串的长度。
结果: