跳转到主要内容

RedisGraph批量导入工具

项目描述

license CircleCI Release PyPI version Codecov

redisgraph-bulk-loader

Forum Discord

一个Python工具,用于从CSV输入构建RedisGraph数据库

需求

批量加载工具需要Python 3解释器。

必须运行带有RedisGraph模块的Redis服务器。安装说明可在此找到: https://oss.redis.com/redisgraph/

安装

可以使用pip安装批量加载器

pip install redisgraph-bulk-loader

pip install git+https://github.com/RedisGraph/redisgraph-bulk-loader.git@master

使用方法

pip安装将redisgraph-bulk-insert作为可调用的命令暴露出来

redisgraph-bulk-insert GRAPHNAME [OPTIONS]

通过克隆仓库进行安装允许通过Python调用脚本,如下所示

python3 redisgraph_bulk_loader/bulk_insert.py GRAPHNAME [OPTIONS]
标志 扩展标志 参数
-u --redis-url TEXT Redis网址(默认:redis://127.0.0.1:6379)
-n --nodes TEXT 节点CSV文件的路径,文件名作为节点标签
-N --nodes-with-label TEXT 节点标签后跟节点CSV文件的路径
-r --relations TEXT 关系CSV文件的路径,文件名作为关系类型
-R --relations-with-type TEXT 关系类型后跟关系CSV文件的路径
-o --separator CHAR CSV文件中的字段分隔符(默认:逗号)
-d --enforce-schema 要求每个单元格都遵守CSV标题中定义的模式
-j --id-type TEXT 唯一节点ID属性的 数据类型(STRING或INTEGER)
-s --skip-invalid-nodes 跳过使用之前定义过的ID的节点,而不是出错退出
-e --skip-invalid-edges 跳过使用无效ID作为端点的边,而不是出错退出
-q --quote INT CSV文件中使用的引号格式。QUOTE_MINIMAL=0,QUOTE_ALL=1,QUOTE_NONNUMERIC=2,QUOTE_NONE=3
-t --max-token-count INT (调试参数) 每个Redis查询中发送的最大标记数(默认1024)
-b --max-buffer-size INT (调试参数) 每个Redis查询的最大批大小(MBs)(默认64)
-c --max-token-size INT (调试参数) 每个发送到Redis的标记的最大大小(MBs)(默认64)
-i --index 标签:属性 在批量导入后,在提供的标签:属性对上创建索引(可选)
-f --full-text-index 标签:属性 在批量导入后,在提供的标签:属性对上创建全文索引(可选)

唯一必需的参数是新创建的图的名称(可以在任何地方出现)以及至少一个节点CSV文件。节点和关系标志应每个输入文件指定一次。

redisgraph-bulk-insert GRAPH_DEMO -n example/Person.csv -n example/Country.csv -r example/KNOWS.csv -r example/VISITED.csv

标签(对于节点)或关系类型(对于关系)来自输入CSV文件的基准名称。在这个例子中,我们将构建两组节点,分别标记为PersonCountry,以及两种类型的关系 - KNOWSVISITED

RedisGraph不对属性施加模式,因此同一个属性键可以有不同的类型值,例如字符串和整数。因此,批量加载器的默认行为是独立地为每个字段的每个值推断类型。例如,当预期属性始终具有字符串值时,有一个可以转换为整数或双精度的字段时,这可能导致意外的行为。为了避免这种情况,请使用--enforce-schema标志并按输入模式中所述更新CSV标题。

扩展参数说明

max-token-countmax-buffer-sizemax-token-size的标志通常不是必需的。只有在图创建的内存开销过高或Redis调用量过高时才应指定它们。批量加载器通过将二进制标记(每个标记包含多个节点或关系)批量发送到Redis来构建大型图。

--quote保留用于向后兼容,并允许在默认模式下对Python的类型推断进行一些控制。--enforce-schema-type更受青睐。

--enforce-schema-type表示输入CSV标题将遵循输入模式中所述的形式。

--nodes-with-label--relations-with-type允许显式写出节点标签或关系类型,而不是从文件名中推断它们。例如,--relations-with-type HAS_TAG post_hasTag_tag.csv将添加由指定的CSV文件描述的所有类型为HAS_TAG的关系。要指定多个标签,请使用':'分隔。例如,--nodes-with-label Actor:Director actors.csv将添加由指定的CSV文件描述的所有带有标签ActorDirector的节点。

输入约束

节点标识符

  • 如果正在创建节点和关系,则每个节点都必须与一个唯一标识符相关联。
  • 如果不使用--enforce-schema,则标识符是每个标签CSV文件的第一列。如果此列的名称以下划线(_)开头,则标识符是批量加载器操作内的内部标识符,不会出现在结果图中。否则,它被视为节点属性。
  • 每个标识符必须在所有标签文件中完全唯一。可以使用ID命名空间来编写更细粒度的标识符。
  • 在关系CSV文件中,源节点和目标节点应该通过其标识符来引用。
  • 如果只创建节点,则取消唯一性限制。

实体属性

  • 不需要显式提供属性类型。
  • 属性不需要仅由任何一种类型组成。
  • 批量加载器目前支持以下类型
    • bool:可以是truefalse(不区分大小写,不使用引号进行插值)。
    • integer:一个未引用的值,可以被读取为整数类型。
    • double:一个未引用的值,可以被读取为浮点数类型。
    • string:任何既可以通过引号插值或不能被转换为数值或布尔类型的字段。
    • array:由方括号插值的任何类型元素的数组。数组中的字符串必须显式进行引号插值。数组属性需要使用非逗号分隔符进行CSV(-o)。
  • Cypher不允许将NULL值分配给属性。
  • 默认行为是推断属性类型,尝试将其转换为整数、浮点数、布尔值或字符串,顺序如下。
  • 如果不需要类型推断,应使用--enforce-schema标志和输入模式

标签文件格式

  • 每一行必须有相同数量的字段。
  • 忽略前导和尾随空白。
  • 如果不使用输入模式,则标签文件的第一列将是节点标识符,如节点标识符中所述。
  • 所有字段都是与每个节点关联的属性键。

关系文件

  • 每一行必须有相同数量的字段。
  • 忽略前导和尾随空白。
  • 如果不使用输入模式,则每一行的前两列是源节点标识符和目标节点标识符。这些字段在标题中的名称无关紧要。
  • 如果文件有超过两列,则所有后续列都是遵循与节点属性相同规则的关系属性。
  • 描述的关系始终被视为有向的(源节点->目标节点)。

输入CSV示例

Store.csv

storeNum | Location | daysOpen |
118 | 123 Main St | ['Mon', 'Wed', 'Fri']
136 | 55 Elm St | ['Sat', 'Sun']

此CSV将使用以下命令插入:redisgraph-bulk-insert StoreGraph --separator \| --nodes Store.csv

(由于管道字符在终端中具有意义,因此必须使用反斜杠转义。)

所有storeNum属性都将作为整数插入,Location将作为字符串插入,而daysOpen将作为字符串数组插入。

输入模式

如果指定了--enforce-schema标志,则所有输入CSV都应指定每个列的数据类型在标题中。

此格式取消了默认CSV格式的一些约束,例如ID字段是第一列。

大多数标题字段应为一个冒号分隔的属性名及其数据类型的对,例如Name:STRING。某些数据类型不需要名称字符串,如下所示。

接受的数据类型如下

类型字符串 描述 需要名称字符串
ID 仅标签文件 - 节点的唯一标识符 可选
START_ID 仅关系文件 - 此关系的源ID字段
END_ID 仅关系文件 - 此关系的目标ID字段
忽略 此列将不会被添加到图中 可选
DOUBLE / FLOAT 有符号64位浮点值
INT / INTEGER / LONG 有符号64位整数值
BOOL / BOOLEAN 由字符串'true'或'false'指示的布尔值
STRING 字符串值
ARRAY 数组值

如果有一个 ID 列具有名称字符串,该值将作为属性添加到每个节点。默认情况下,该属性将是字符串,但可以使用 --id-type 参数将其更改为整数。如果没有提供名称字符串,ID 是批量加载操作内部的,不会出现在图中。START_IDEND_ID 列永远不会作为属性添加。

ID 命名空间

通常,节点标识符需要在所有输入 CSV 中都是唯一的。当使用输入架构时,可以(可选地)创建 ID 命名空间,标识符只需要在其命名空间内是唯一的。当每个输入 CSV 具有与其他重叠的主键时,这特别有用。

要引入命名空间,请在 :ID 类型字符串后面跟一个括号内插的命名空间字符串,例如 :ID(User)。在关系文件的 :START_ID:END_ID 字段中应指定相同的命名空间,如 :START_ID(User)

输入架构 CSV 示例

User.csv

:ID(User), name:STRING, rank:INT
0, "Jeffrey", 5
1, "Filipe", 8

FOLLOWS.csv

:START_ID(User), :END_ID(User), reaction_count:INT
0, 1, 25
1, 0, 10

使用以下命令插入这些 CSV 文件:redisgraph-bulk-insert SocialGraph --enforce-schema --nodes User.csv --relations FOLLOWS.csv

将生成一个名为 SocialGraph 的图,其中包含 2 个用户,Jeffrey 和 Filipe。Jeffrey 关注 Filipe,该关系的 reaction_count 为 25。Filipe 也关注 Jeffrey,reaction_count 为 10。

执行批量更新

Pip 安装还公开了 redisgraph-bulk-update 命令

redisgraph-bulk-update GRAPHNAME [OPTIONS]

通过克隆存储库进行安装允许通过 Python 调用批量更新器

python3 redisgraph_bulk_loader/bulk_update.py GRAPHNAME [OPTIONS]
标志 扩展标志 参数
-h --host TEXT Redis 服务器主机(默认:127.0.0.1)
-p --port INTEGER Redis 服务器端口(默认:6379)
-a --password TEXT Redis 服务器密码(默认:无)
-u --unix-socket-path TEXT Redis Unix 套接字路径(默认:无)
-q --query TEXT 在服务器上运行的查询
-v --variable-name TEXT 查询中行数组变量的名称(默认:row)
-c --csv TEXT CSV 输入文件的路径
-o --separator TEXT CSV 文件中的字段令牌分隔符
-n --no-header 如果设置,则 CSV 文件没有标题
-t --max-token-size INTEGER 每个令牌的最大大小(以兆字节为单位)(默认 500,最大 512)

批量更新器允许以批处理方式读取 CSV 文件并将更改提交到 RedisGraph。

例如,给定 输入架构 CSV 示例 中描述的 CSV 文件,批量加载器可以使用以下命令创建相同的节点和关系

redisgraph-bulk-update SocialGraph --csv User.csv --query "MERGE (:User {id: row[0], name: row[1], rank: row[2]})"
redisgraph-bulk-update SocialGraph --csv FOLLOWS.csv --query "MATCH (start {id: row[0]}), (end {id: row[1]}) MERGE (start)-[f:FOLLOWS]->(end) SET f.reaction_count = row[2]"

当使用批量更新器时,在之前对 CSV 输入进行清理至关重要,因为 RedisGraph 增量地提交更改。因此,格式错误的输入可能会使图处于部分更新状态。

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源代码分发

redisgraph_bulk_loader-0.12.3.tar.gz (23.2 kB 查看哈希值)

上传时间: 源代码

构建分发

redisgraph_bulk_loader-0.12.3-py3-none-any.whl (22.5 kB 查看哈希值)

上传时间: Python 3

由支持