• neo4j-导入CSV数据


    官方文档 https://neo4j.com/developer/guide-import-csv/#_converting_data_values_with_load_csv

    一、前提

            在进行导入CSV数据前,需要熟悉图数据库(graph database)的概念,会构建一个属性图性数据模型,和Cypher的基本语法。

    二、导入CSV文件的方式

     主要的两种方式如下:

      1、使用 Cypher 命令  LOAD CSV ,这种方式可以处理中小型数据(可达10 million条记录)

      2、使用批量导入工具   neo4j-admin  ,用来直接导入大数据集

    三、上述方式具体导入过程

      1、Cypher 命令  LOAD CSV         

      (1)此命令可以处理本地或远程文件,导入本地文件,文件名前要加前缀  file:///     ,neo4j 有一个默认的安 全设置,只能从 Neo4j 的特定文件夹导入(Neo4j import directory,操作系统不同,目录不同);导入远程文件,直接用其URL

       exmples

    //Example 1 - file directly placed in import directory (import/data.csv)
    LOAD CSV FROM "file:///data.csv"
    ......
    //Example 2 - file placed in subdirectory within import directory (import/northwind/customers.csv)
    LOAD CSV with headers FROM "file:///northwind/customers.csv"
    ......

      (2)从CSV 中读取的所有数据都是字符串类型,可以通过 toInteger()toFloat()split() 或其他类似的函数进行转换

      (3)CSV文件首行是字段名,则要加上 ,with headers 具体如样例如下,且用 property.value 或 property[value]  的形式 ,没有with headers 使用  property[0] 下标形式。

      exmples

    文件 person.csv
    id,name,age
    1,zz,20
    2,ww,21
    3,qq,22
    
    LOAD CSV WITH HEADERS FROM 'file:///person.csv' AS line FIELDTERMINATOR ','  
    MERGE (:person { id:line.id ,name: line.name, Age: toInteger(line.Age)})
    ###fieldterminator表示每个值由 ' , ' 分隔开。 MERGE 是插入节点或关系 (不存在则插入,存在则更新)

      2、批量导入工具 neo4j-admin

           这个工具可以指定更大的节点文件和关系文件进行导入,它在neo4j的bin目录下,用法如下:

    bin/neo4j-admin import --id-type=STRING 
                           --nodes:Customer=customers.csv --nodes=products.csv  
                           --nodes="orders_header.csv,orders1.csv,orders2.csv" 
                           --relationships:CONTAINS=order_details.csv 
                           --relationships:ORDERED="customer_orders_header.csv,orders1.csv,orders2.csv"
    

      上述每个文件的前几行如下 : 

    Table 1. customers.csv
    customerId:ID(Customer)name

    23

    Delicatessen Inc

    42

    Delicous Bakery 

      

    Table 2. products.csv
    productId:ID(Product)nameprice:LABEL

    11

    Chocolate

    10

    Product;Food

    Table 3. orders_header.csv,orders1.csv,orders2.csv
    orderId:ID(Order)datetotalcustomerId:IGNORE

    1041

    2015-05-10

    130

    23

    1042

    2015-05-12

    20

    42

    Table 4. order_details.csv
    :START_ID(Order)amountprice:END_ID(Product)

    1041

    13

    130

    11

    1042

    2

    20

    11

    Table 5. customer_orders_header.csv,orders1.csv,orders2.csv
    :END_ID(Order)date:IGNOREtotal:IGNORE:START_ID(Customer)

    1041

    2015-05-10

    130

    23

    1042

    2015-05-12

    20

    42

     

             上述用法样例代码解释 --nodes  --relationships 参数是多个有相同结构(列名结构相同)的CSV文件。
       具有相同结构的文件叠加在一起,可看成一单个的大文件。每个文件都要有列字段,或者每个文件的列字段也可以单独放在一个新CSV文件里面(更方便更改信息)。
       * --id-type = STRING 表示所有:ID 列都是字母或数字的值。 
       * 文件customers.csv直接导入成带有 :Customer 标签的节点,每个节点的属性也之间从文件中导入
       * 文件Product.csv中的节点标签则来自文件中的:LABEL 列。
       * 节点Order数据来自三个文件,分别是一个头文件,和两个数据文件
       * 文件 Order_details.csv 中每行记录的两个item之间具有的:contain关系,其通过order的id属性和product的id属性关联起来。
       
       列名表示节点或关系的属性名,具体的列名有具体的markup,一下是上述一些markup的解释
       * name:ID 这是全局id列,用作查找重新连接后的节点
         --如果省略属性名,该列不会存储在库中,--id-type指的就是该列。
         --如果在不同实体中出现同一个ID,需要括号中告诉ID所属实体。比如:ID(Order).
         --如果ID是全局唯一,则第二条可以省略

       * :LABEL 这一列表示节点的标签,如果节点有多个标签,可以通过分隔符隔开

       * :START_ID , :END_ID 表示关系文件中指向节点的ID列,对于某个group的id,可以使用 :END_ID(Order)

       * :TYPE 该列说明了关系的类型

       * 所有其他属性列,如果为空,则跳过;或者标注为 :IGNORE

       * 通过在属性后面加 :INT, :BOOLEAN 等indicators来转换数据类型

  • 相关阅读:
    CVE-2017-10271
    [GKCTF2020]cve版签到
    [GXYCTF2019]禁止套娃 无参数RCE
    [护网杯 2018]easy_tornado
    记两道xctf上的web进阶区 反序列化
    msf卸载win defender
    Cron表达式详解
    Linux ifconfig只有lo没有别的网络的问题
    记一道文件上传
    【解决】手机安卓已经导入burp证书,但仍提示此证书并非来自被信任的机构
  • 原文地址:https://www.cnblogs.com/z-bear/p/12018450.html
Copyright © 2020-2023  润新知