加载 CSV
如果我们有存放在本地或 http(s)/s3/gcp 存储上的大文件需要导入 Neo4j,可以使用此过程。它允许通过 URL 提供偏移量(offset),从而直接读取文件(例如 CSV)中的字符串。我们还可以设置可选的限制参数作为第三个参数,否则(设置为 0 时)将读取到文件末尾。
apoc.load.stringPartial(urlOrBinary :: ANY?, offset :: LONG, limit :: LONG = 0, config = {} :: MAP?) :: (value :: STRING?)
要从文件读取,您必须启用配置选项
apoc.import.file.enabled=true
该过程支持以下配置参数
| 名称 (name) | type | 默认 | description(描述) |
|---|---|---|---|
headers |
Map<String, Object> |
空映射 |
要添加或替换默认值的附加标头 |
archiveLimit |
int |
1024*1024*10 (10MB) |
用于定位 ZIP 条目和缓冲区的尺寸限制 |
bufferLimit |
int |
1024*1024*10 (10MB) |
缓冲区读取限制 |
compression |
Enum[NONE, GZIP, BZIP2, DEFLATE, BLOCK_LZ4, FRAMED_SNAPPY] |
NONE |
在读取字节数组的情况下,设置所使用的压缩算法。 |
使用示例
我们可以从本地文件 URL、远程 URL(即 http(s)/gcp/S3/Azure/Hdfs)、放置在存档文件中的本地/远程文件,或字节数组中读取字符串的一部分。与其他加载过程相比,它非常有用,因为文件访问的处理效率更高,而不是简单的 openStream 和读取到指定位置。
也就是说
-
在本地文件的情况下,底层将创建一个 RandomAccessFile。
-
在 http(s) URL 的情况下,我们将添加一个额外的 HTTP 标头
Range: bytes=<offset>;如果设置了限制,则为Range: bytes=<offset>-<httpLimit>,其中 httpLimit 等于offset + limit - 1。 -
在 S3 位置的情况下,将使用 GetObjectRequest.range()。
-
在其他情况下,我们将执行 InputStream.skip()
如果我们有以下 CSV 文件
name,age,beverage Selma,9,Soda Rana,12,Tea;Milk Selina,19,Cola
我们可以执行
CALL apoc.load.stringPartial("path/to/localfile/test.csv", 17, 15)
| 值 |
|---|
Rana,11 Selina, |
或者,在不设置限制的情况下
CALL apoc.load.stringPartial("path/to/localfile/test.csv", 17)
| 值 |
|---|
Rana,11 Selina,18 |
我们可以以相同的方式从远程 URL 读取并获得类似的结果,例如
CALL apoc.load.stringPartial("https://raw.githubusercontent.com/neo4j-contrib/neo4j-apoc-procedures/refs/heads/dev/extended/src/test/resources/test.csv", 17)
我们还可以使用 <pathToArchive>!<fileToRead> 语法从存档文件中读取,例如
CALL apoc.load.stringPartial("https://www3.stats.govt.nz/2018census/Age-sex-by-ethnic-group-grouped-total-responses-census-usually-resident-population-counts-2006-2013-2018-Censuses-RC-TA-SA2-DHB.zip!Data8277.csv", 17)
或者从字节数组中读取,并可选择设置压缩类型(默认为 'NONE',即不压缩),例如使用 apoc.util.compress(位于 APOC Core 中)
WITH apoc.util.compress('testFooBar', {compression: 'DEFLATE'}) AS compressed
CALL apoc.load.stringPartial(compressed, 5, 17, {compression: 'DEFLATE'}) YIELD value RETURN value
| 值 |
|---|
testFooBar |