美文网首页
图数据库Neo4j搭建以及大批量数据导入

图数据库Neo4j搭建以及大批量数据导入

作者: 薛云龙 | 来源:发表于2018-09-13 16:30 被阅读809次

    最近在搞风控相关的事情,有幸参与了Neo4j的搭建以及数据导入的过程。

    构建容器

    docker环境下安装:这里说明下,默认将容器的/data,/var/lib/neo4j/import目录映射到宿主机。/data存储的是数据,/var/lib/neo4j/import存储的是你想要导入数据的

    docker run \
        --publish=7474:7474 --publish=7687:7687 \
        --volume=/data/neo4j/data:/data \
        --volume=/data/neo4j/import:/var/lib/neo4j/import \
        --env=NEO4J_dbms_memory_pagecache_size=2G \
        --env=NEO4J_dbms_memory_heap_max__size=8G \
        --name=neo4j \
        -d neo4j 
    

    数据导入

    初次进行大批量数据的导入有很多方式,但是每种方式都会有自己的局限性。这里是官网文档。另外,我大概分析了一下,

    cypher-shell load csv

    1. 通过cypher-shell命令行直接导入数据。这样的方式,可以不停用neo4j服务,直接导入到库中。
    #load node csv 
    USING PERIODIC COMMIT 1000
    LOAD CSV WITH HEADERS FROM "file:/nodes.csv" AS csvLine
    CREATE (c:Contact { mobile:csvLine.mobile, name:csvLine.name, updateTime:csvLine.updateTime, createTime:csvLine.createTime });
    

    USING PERIODIC COMMIT 1000,是满足1000条之后,提交一个事务,这样能够提高效率。
    2.导入节点之后,我们必然会导入关系。这里就有个坑,如果你在node节点的库里,没有创建index,那么导入关系的时候,将会慢的要死。

    创建索引之前,我们插入的节点数据有可能会有重复的情况,我们需要先清除一下重复数据。
    MATCH (n:Contact) 
    WITH n.mobile AS mobile, collect(n) AS nodes 
    WHERE size(nodes) > 1 
    FOREACH (n in tail(nodes) | DETACH DELETE n);
    
    #创建索引
    CREATE CONSTRAINT ON (c:Contact) ASSERT c.mobile IS UNIQUE;
    CREATE INDEX ON :Contact(mobile);
    

    3.接下来,我们开始导入关系数据

    USING PERIODIC COMMIT 1000
    LOAD CSV WITH HEADERS FROM "file:/rels.csv" AS csvLine
    MATCH (c:Contact {mobile:csvLine.mobile1}),(c1:Contact {mobile:csvLine.mobile2})
    CREATE (c)-[:hasContact]->(c1);
    

    neo4j-admin(neo4j-import)方式

    通过neo4j-admin方式导入的话,需要暂停服务,并且需要清除graph.db,这样才能导入进去数据。而且,只能在初始化数据时,导入一次之后,就不能再次导入了😂,很坑。。。
    所以这种方式,可以在初次建库的时候,导入大批量数据,等以后如果还需要导入数据时,可以采用上边的方法
    neo4j-import官方文档

    相关文章

      网友评论

          本文标题:图数据库Neo4j搭建以及大批量数据导入

          本文链接:https://www.haomeiwen.com/subject/phtbgftx.html