加载 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

该过程支持以下配置参数

表 1. 配置参数
名称 (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 文件

test.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)
表 2. 结果

Rana,11 Selina,

或者,在不设置限制的情况下

CALL apoc.load.stringPartial("path/to/localfile/test.csv", 17)
表 3. 结果

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
表 4. 结果

testFooBar

© . This site is unofficial and not affiliated with Neo4j, Inc.