![精通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=1739367428-yJ4B31flYE7q82OI0RaOYMA87251g52x-0-7a62ef790c8099db26e56f2ee6450884)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_102658.jpg?sign=1739367428-Xh2EaS2arAFiNoniw7zrEggrmcBtBDol-0-673da835b5bfc91900bdcd08c9a06151)
CSV文件中的每一行都创建一个标签为Artist的节点。CSV文件中的另外两列分别设置为节点的属性。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_101704.jpg?sign=1739367428-poqGlYCea3ZFE89mtBXJ1ZN75ix2sD1B-0-67ca6cc603435159e9477a8ca551c477)
3.3.6.4 导入包含文件头的CSV文件
当导入的CSV文件包含文件头时,可以把每一行看作一个map,而不是字符串数组。
比如artists.csv文件内容如下:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_102659.jpg?sign=1739367428-2XOQEKvU63KPiHTd1x5Kt7sNKIgdg76b-0-5e2e616a2ac1791201b5ff8956face13)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_102660.jpg?sign=1739367428-lpJBm0FOrW0eLp6GgvoXtljzSQ5j09he-0-a131054dd84bb895f9199c03aca76bfc)
这时,文件的开始行包含列的名称。指定WITH HEADERS后,可以通过对应的列名来访问指定的字段。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P160_101707.jpg?sign=1739367428-fkzGMjPV9fPqYeX7gPRyXYmddLhL0Lo9-0-9a87d105d7d61807791ca43c2d55d830)
3.3.6.5 导入自定义分隔符的CSV文件
CSV文件的分隔符有时候不是逗号,而是其他分隔符。这时可以使用FIELDTERMINATOR来指定分隔符。
比如artists-fieldterminator.csv文件内容如下:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_102661.jpg?sign=1739367428-Y2WbIvWoiki3yBw6OmYDYsMj4Yc6mlMI-0-ce287b132afb0f726a629a76fc1498a7)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_102662.jpg?sign=1739367428-5KRt7yiyo07ExOtdIrqMnNqUrHlpfhbj-0-841e22b411293f98c3b494c097d6a191)
本例中字段之间以分号分隔,因此,在LOAD CSV中使用了FIELDTERMINATOR自定义分隔符。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_101710.jpg?sign=1739367428-Yg8hMiS0GtdWpiI4Be3quUqk1cnZ2T5A-0-be953678ac24c821805d354cc3ec0d71)
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=1739367428-xY0WTLNuoCLp8GnSr45cH6lZkLgkzF6o-0-8320304430cd6174f649dfa3c35ae2f9)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_101713.jpg?sign=1739367428-0rs48XCjps0PSYn2nLXlCBWaluEfNcty-0-f90df60293d11de433c2a8f3b98ba873)
3.3.6.7 设置提交频率
可以设置提交的频率,如本例中设置为500行。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P161_102664.jpg?sign=1739367428-IFSbipayjbNTBrev0wlnjp6k1s1xQsDA-0-c4dfd6bbd0ad301298083953801fd1e6)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_101716.jpg?sign=1739367428-GxH8wslvYBlibCl8aKKkjGSL8aVVHquD-0-220247940fe764e1eba28aa87c2019c5)
3.3.6.8 导入包含转义字符的数据
本例中同时包含了引用字符和转义字符。
比如artists-with-escaped-char.csv文件内容如下:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_90208.jpg?sign=1739367428-4kCayDLSfIzfYnZt0cD9s7REchOkXMmC-0-5c54f7a7c4c0022a9af864a62e5b2c7d)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_102666.jpg?sign=1739367428-0JWHVrGgHxmvawt05DJ8yiw2jcFATNFz-0-5d19bff5c147c45a1300763f09edea5b)
提示:提示:这里的字符串用双引号括起来。同时,关注本例中字符串的长度。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P162_101718.jpg?sign=1739367428-ret3Zfkhqn27RLATdFW1Uz36Mmkn5FPA-0-7c09cd796382fc9de454df8833eeba1e)