RedisGraph利用redisgraph-bulk-loader批量导入数据

目录

 

前言

一、redisgraph-bulk-loader介绍

二、使用步骤

1.要求

2.创建docker network

3.创建docker redisgraph

4.安装python3解释器

5.生成csv文件 

实体属性

标签文件格式:

关系文件

         输入模式

ID命名空间

 


前言

作者使用的是docker版本的redisgraph

一、redisgraph-bulk-loader介绍

用于从CSV输入构建RedisGraph数据库的Python实用程序

二、使用步骤

1.要求

批量加载器实用程序需要Python 3解释器。

2.创建docker network

代码如下(示例):

docker network create data-import

3.创建docker redisgraph

docker run -p 6379:6379 -d  --network data-import --network-alias redisgraph --name redisgraph redislabs/redisgraph

4.安装python3解释器

docker run -it  --network data-import --network-alias python --name python python


1).docker run -it --name python python bash
2).退出
3).docker start python
4).docker run -it python bash
5)  .安装 pip install redisgraph-bulk-loader 

5.生成csv文件 

假设已经有数据

List<DeviceFolderCacheDto> pointsList = new ArrayList<>();
CSVUtils.assetsToCsvFile(topic.getFolderId()+"",deviceFolderCacheDtoList);
/**
     * 生成csv文件
     * @param pointsList
     * @return
     */
    public static void assetsToCsvFile(String graphName, List<DeviceFolderCacheDto> pointsList){
        log.info("assetsToCsvFile-inCnt:"+pointsList.size());
        // 表格头,按照redisgraph-bulk-loader格式要求创建
        String[] headArr = new String[]{":ID(Assets)","system_folderId:STRING","system_folderName:STRING","system_tenantId:STRING","system_folderMark:STRING","system_nodeType:STRING","system_code:STRING","system_parentId:STRING","system_folderDesc:STRING"};
        //CSV文件路径及名称
        String filePath = mainFilePath+graphName; //CSV文件路径
        String fileName = "Assets.csv";//CSV文件名称
        File csvFile = null;
        BufferedWriter csvWriter = null;
        try {
            csvFile = new File(filePath + File.separator + fileName);
            log.info("assetsToCsvFile-csvFile:{}",csvFile.getAbsolutePath()+ csvFile.getName());
            File parent = csvFile.getParentFile();
            log.info("assetsToCsvFile-parent:{}",parent.getAbsolutePath()+parent.getName());
            if (parent != null && !parent.exists()) {
                boolean flag = parent.mkdirs();
                log.info("assetsToCsvFile-parent.mkdirs():{}",flag);
            }
            boolean flag = csvFile.createNewFile();
            log.info("assetsToCsvFile-csvFile.createNewFile():{}",flag);
            csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "UTF-8"), 1024);

            // 写入文件头部标题行
            csvWriter.write(String.join("|", headArr));
            csvWriter.newLine();

            // 写入文件内容
            int cnt = 0;
            int totalCnt = 0;
            if(pointsList!=null && pointsList.size() > 0){
                for (DeviceFolderCacheDto points : pointsList) {
                    csvWriter.write(points.toRow());
                    cnt ++;
                    if(cnt>=1000){
                        csvWriter.flush();
                        cnt = 0;
                    }
                    totalCnt++;
                    csvWriter.newLine();
                }
            }
            csvWriter.flush();
            log.info("assetsToCsvFile-outCnt:"+totalCnt);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                csvWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 

python3 redisgraph_bulk_loader/bulk_insert.py GRAPHNAME [OPTIONS]
FlagsExtended flagsParameter
-h--host TEXTRedis server host (default: 127.0.0.1)           redisgraph地址:docker版本地址为容器名
-p--port INTEGERRedis server port (default: 6379)
-a--password TEXTRedis server password (default: none)
-n--nodes TEXTPath to Node CSV file with the filename as the Node Label    指定节点,如果有多个节点,可这么写  --node xxx.csv  --node xxx2.csv ,文件名则为node名称
-N--nodes-with-label TEXTNode Label followed by path to Node CSV file
-r--relations TEXTPath to Relationship CSV file with the filename as the Relationship Type  同节点写法
-R--relations-with-type TEXTRelationship Type followed by path to relationship CSV file
-o--separator CHARField token separator in CSV files (default: comma)     CSV文件分隔符,建议使用一个| 或者多个|,因为逗号经常容易出错
“”“”-d--enforce-schemaRequires each cell to adhere to the schema defined in the CSV header     强行按照自定义表头的类型进行录入,不过不指定则按照默认推断
-s--skip-invalid-nodesSkip nodes that reuse previously defined IDs instead of exiting with an error  跳过错误node而不是退出
-e--skip-invalid-edgesSkip edges that use invalid IDs for endpoints instead of exiting with an error  跳过错误边而不是退出
-q--quote INTThe quoting format used in the CSV file. QUOTE_MINIMAL=0,QUOTE_ALL=1,QUOTE_NONNUMERIC=2,QUOTE_NONE=3
-t--max-token-count INT(Debug argument) Max number of tokens sent in each Redis query (default 1024)
-b--max-buffer-size INT(Debug argument) Max batch size (MBs) of each Redis query (default 4096)
-c--max-token-size INT(Debug argument) Max size (MBs) of each token sent to Redis (default 500)
-i--index Label:PropertyAfter bulk import, create an Index on provided Label:Property pair (optional)
-f--full-text-index Label:PropertyAfter bulk import, create an full text index on provided Label:Property pair (optional)

实体属性

  • 无需明确提供属性类型。
  • 属性不需要专门由任何类型组成。
  • 批量加载器当前支持的类型为:
    • booleantruefalse(不区分大小写,不加引号)。
    • integer:一个无引号的值,可以将其读取为整数类型。
    • double:一个无引号的值,可以将其读取为浮点类型。
    • string:任何用引号插入或不能转换为数字或布尔类型的字段。
    • array:任何类型的元素的括号内插数组。数组中的字符串必须明确地用引号插入。数组属性要求对CSV(-o)使用非逗号分隔符。
  • Cypher不允许将NULL值分配给属性。
  • 默认行为是推断属性类型,尝试按该顺序将其强制转换为整数,浮点数,布尔值或字符串。
  • --enforce-schema标志和一个输入模式,如果类型推断不期望应使用。

标签文件格式:

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

关系文件

  • 每行必须具有相同数量的字段。
  • 前导和尾随空格将被忽略。
  • 如果不使用Input Schema,则每行的前两个字段是源节点标识符和目标节点标识符。标头中这些字段的名称无关紧要。
  • 如果文件具有两个以上的字段,则所有后续字段都是关系属性,它们遵循与节点属性相同的规则。
  • 所描述的关系始终被认为是定向的(源->目标)。

输入模式

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

此格式取消了默认CSV格式的一些限制,例如ID字段为第一列。

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

可接受的数据类型为:

Type StringDescriptionRequires name string
IDLabel files only - Unique identifier for a nodeOptional
START_IDRelation files only - The ID field of this relation's sourceNo
END_IDRelation files only - The ID field of this relation's destinationNo
IGNOREThis column will not be added to the graphOptional
DOUBLE / FLOATA signed 64-bit floating-point valueYes
INT / INTEGER / LONGA signed 64-bit integer valueYes
BOOLEANA boolean value indicated by the string 'true' or 'false'Yes
STRINGA string valueYes
ARRAYAn array value

ID命名空间

通常,节点标识符在所有输入CSV中必须唯一。使用输入模式时,(可选)可以创建ID名称空间,并且标识符仅需要在其名称空间中是唯一的。当每个输入CSV的主键相互重叠时,这特别有用。

要引入名称空间,请在:ID类型字符串后加上括号内插的名称空间字符串,例如:ID(User)。应该在关系文件的:START_ID:END_ID字段中指定相同的名称空间,如中所述:START_ID(User)

 引用连接:https://github.com/redisgraph/redisgraph-bulk-loader

最终生成的命令示例:

python3 redisgraph-bulk-loader 3661091848455168 --host redisgraph --port 6379 --enforce-schema --separator '|' --skip-invalid-edges --nodes /data/redisgraph-data/3661091848455168/Point.csv --nodes /data/redisgraph-data/3661091848455168/Assets.csv  --relations /data/redisgraph-data/3661091848455168/assets_assets.csv --relations /data/redisgraph-data/3661091848455168/assets_point.csv 

在python3容易的/usr/local/bin 下面执行该命令则可以导入数据 

注:一个图只能一次性生成,如果已经存在该图名称则报错

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值