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=1738944191-I1HCyskspXCPYcMWXvziYmt9k3Zacy72-0-09eccf169a9263b8ec33eee02749b248)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_102658.jpg?sign=1738944191-F6jbZNflJuB2akFpMRulA5SvRFfmXeY0-0-df7900290676b6f9a74d58e12d6ce28c)
CSV文件中的每一行都创建一个标签为Artist的节点。CSV文件中的另外两列分别设置为节点的属性。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_101704.jpg?sign=1738944191-lL0byDo5V7LXrONRSqLyo8KtIyNhfVZE-0-c910f72875389c6522690521c7f58955)
3.3.6.4 导入包含文件头的CSV文件
当导入的CSV文件包含文件头时,可以把每一行看作一个map,而不是字符串数组。
比如artists.csv文件内容如下:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_102659.jpg?sign=1738944191-fXyVknfQeHx9nq6qu6s8QK3W5JJQZyVv-0-fa75ee7dece986b7ced6ba731855068c)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_102660.jpg?sign=1738944191-ttc4SF84iV0jP8ckuvZcSoZLaioAfT2d-0-15a38d654b4a634d7dba8f836cfd99d0)
这时,文件的开始行包含列的名称。指定WITH HEADERS后,可以通过对应的列名来访问指定的字段。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_101707.jpg?sign=1738944191-eRjD6sR9ESUEomT4gavoPhTTAmG3caYV-0-e0775e2685c0c2b69fa2da836d128783)
3.3.6.5 导入自定义分隔符的CSV文件
CSV文件的分隔符有时候不是逗号,而是其他分隔符。这时可以使用FIELDTERMINATOR来指定分隔符。
比如artists-fieldterminator.csv文件内容如下:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_102661.jpg?sign=1738944191-SkmLBZXgktFOHEjFQfcInoEqYczkExge-0-437fc9764f2232f0188bcde607363446)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_102662.jpg?sign=1738944191-CbnWLZFBu9EmkHpBcO2WbAU6VBYBFC9X-0-e9f357d304077ae2eadc6bef184b9256)
本例中字段之间以分号分隔,因此,在LOAD CSV中使用了FIELDTERMINATOR自定义分隔符。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_101710.jpg?sign=1738944191-TaxRmuakiigE7Ndl8roY6Q7KQYJxGZG1-0-4e37692af65b0c7715933cebb54071c4)
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=1738944191-vXqaVZnAir3J92xiIkGEASjOISTt5vLf-0-f8a5e21fb72996c9777db2a8b88abab3)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_101713.jpg?sign=1738944191-jN7AOvAw8zYzi63vqvRFeHSMX0Pbxmh0-0-126c8300c3cb30cbaea99712a8696491)
3.3.6.7 设置提交频率
可以设置提交的频率,如本例中设置为500行。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_102664.jpg?sign=1738944191-WBx5ieeAjYIwOZhUWpEFxwIlSKAFYNwz-0-504928f76733b429ef6813839e12b88c)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_101716.jpg?sign=1738944191-9kSQZMsHtrH8EhyHMcs0Cp4BFWZnb6HO-0-fba67a30a7a40451346a15d98bb0aa42)
3.3.6.8 导入包含转义字符的数据
本例中同时包含了引用字符和转义字符。
比如artists-with-escaped-char.csv文件内容如下:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_90208.jpg?sign=1738944191-hEDOP6CLiaXOKTfcmc0dLgy6nZ8SqUlz-0-ab98fc32bdf0e0c569eaeb0c49d91390)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_102666.jpg?sign=1738944191-9O11E9HFgWlPncOj1K5D7HV6SQfdLMVf-0-ff3e635c00a0d9bf0daf61a2e675a2a1)
提示:提示:这里的字符串用双引号括起来。同时,关注本例中字符串的长度。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_101718.jpg?sign=1738944191-4Vs2aVDln7BSb0uqginNkvynS6i2KtlO-0-5e97c225f2eb6c1c6f4776cd4f56e6e9)