![精通Neo4j](https://wfqqreader-1252317822.image.myqcloud.com/cover/113/47216113/b_47216113.jpg)
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文件内容如下:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_102657.jpg?sign=1739359528-TJwWdVy1OWdiSW0NIc6ZtMkah9AzvWL4-0-9299be420f7b7ace0a1ba3eb55b1305a)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_102658.jpg?sign=1739359528-0sAqKPyMISe49JgDpXVEoHBr95wbFxHr-0-105cc686f6c280c4e8592ce8df6ade64)
CSV文件中的每一行都创建一个标签为Artist的节点。CSV文件中的另外两列分别设置为节点的属性。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_101704.jpg?sign=1739359528-R6N8BkAIHsz93WAlMqSnwJzfyWZIjy79-0-187abb5dbe18161d968d8b7b4ff1bd5b)
3.3.6.4 导入包含文件头的CSV文件
当导入的CSV文件包含文件头时,可以把每一行看作一个map,而不是字符串数组。
比如artists.csv文件内容如下:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_102659.jpg?sign=1739359528-Rj8l6fwIawrKNYQjZN9vHtgCI1qRbn1a-0-cd89fb0cf79f3f1e4e1b5d03b2ddc124)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_102660.jpg?sign=1739359528-t4G7Uwqv7uitJP9xQfDUQArDWknPJEEt-0-2f5b2b3a31a64de410fa9bc92274b7e6)
这时,文件的开始行包含列的名称。指定WITH HEADERS后,可以通过对应的列名来访问指定的字段。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_101707.jpg?sign=1739359528-t7VdOStLUM7r3XN5Wi94P7H8ViKvpnP3-0-a37369c4a91b93f8b60076d15b6ccb68)
3.3.6.5 导入自定义分隔符的CSV文件
CSV文件的分隔符有时候不是逗号,而是其他分隔符。这时可以使用FIELDTERMINATOR来指定分隔符。
比如artists-fieldterminator.csv文件内容如下:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_102661.jpg?sign=1739359528-uOQA6rWN948qrJ7c2Y3cMkIffjUkJ8Vz-0-3a9c41d706ff0d8484cde8e73734628c)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_102662.jpg?sign=1739359528-3v7xCKzUGpOAcDdmcuBzINAWuSdOpwLa-0-0b8c9ed3b28aec7858619a4e9c61b939)
本例中字段之间以分号分隔,因此,在LOAD CSV中使用了FIELDTERMINATOR自定义分隔符。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_101710.jpg?sign=1739359528-cOIV8kbO2ShkweBoQ4i9hE09uWui6Q04-0-24e386bc985a9b69fb2c440630f48ed9)
3.3.6.6 导入海量数据
如果导入的CSV文件包含百万数量级的行,可以使用USING PERIODIC COMMIT来告诉Neo4j每导入一定数量行之后就提交(Commit)一次。这样可避免在事务过程中耗费大量的内存。默认情况下,每1000行会提交一次。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_102663.jpg?sign=1739359528-MhuRkBKXKA0EvRbAqXp6cBtFI70urdAt-0-509a974ff3d6640b3c708e714e0d1eb7)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_101713.jpg?sign=1739359528-ggQlIzFGQWhjFjAVcqG8AgHK1Ir2WLkX-0-742aaec4f4eab429ed92b9721754a557)
3.3.6.7 设置提交频率
可以设置提交的频率,如本例中设置为500行。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_102664.jpg?sign=1739359528-c1xDfD8QBCZyUCvno0LNKL55WldPaL4P-0-65f2225def09d260834dde5a3709335a)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_101716.jpg?sign=1739359528-NguwXQXJHaxNhQKwTvUpSbwHMguZgu3F-0-a9a3c93bc85db4faeb1dfa219723ed00)
3.3.6.8 导入包含转义字符的数据
本例中同时包含了引用字符和转义字符。
比如artists-with-escaped-char.csv文件内容如下:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_90208.jpg?sign=1739359528-FyCLIo3XSLnj142llTxrqftYiWad7aQE-0-9be92d1e66f4bc4da4b9be244ae5926f)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_102666.jpg?sign=1739359528-VYikmXRbVmNWQLT6mRyH9uTnQROtzO0D-0-1f129429325bbfc6876334b5b3b41415)
提示:提示:这里的字符串用双引号括起来。同时,关注本例中字符串的长度。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_101718.jpg?sign=1739359528-UNJSeCnVZ838bqhoNxlMT8VoARxh9349-0-e149c0c074c3bd1b34e9ee83bbf7016a)