Neo4j数据导入方式

864 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

Neo4j数据导入方式

Neo4j 简介

Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
Neo4j的主要特点有:
1、界面友好: 前端D3.js
2、查询语言: Cypher
3、ACID事务

\

Neo4j导入数据的方式:
1 使用LOAD CSV导入数据。
这种方式是最简单的导入数据到neo4j的方式,也是广泛使用来导入原始数据。
使用LOAD CSV导入数据的要求:

  • CSV文件已经备好
  • Neo4j Browser或Cypher-shell已打开,Neo4j DBMS在本地运行,或Aura,或Sandbox
  • 可选(不是必须):在Neo4j集群上
  • 如果大于100K行数据,则需要特殊处理

例子代码

:auto USING PERIODIC COMMIT 500  #每次循环插入500个结点
LOAD CSV WITH HEADERS FROM
  'https://data.neo4j.com/v4.0-intro-neo4j/movies1.csv' as row
MERGE (m:Movie {id:toInteger(row.movieId)})
    ON CREATE SET
          m.title = row.title,
          m.avgVote = toFloat(row.avgVote),
          m.releaseYear = toInteger(row.releaseYear),
          m.genres = split(row.genres,":")

\

2 使用APOC导入数据

需要下载apoc包, apoc 包下载链接: github.com/neo4j-contr… 将对应jar包放在安装目录plugins文件目录里,然后conf目录里的neo4j.conf的后面加上
配置config文件

dbms.security.procedures.unrestricted=jwt.security.*,apoc.*
apoc.export.file.enabled=true
apoc.import.file.enabled=true

\

restart neo4j,运行return apoc.version(),若有版本号,则成功。
导入json数据

CALL apoc.import.json("export.json")

通过Cypher脚本导入数据

CALL apoc.cypher.runFile('export.cypher')

\

APOC-MySQL导数据(需要下载 mysql-connector-java-8.0.8-dmr.jar )

import org.neo4j.driver.v1.*;
public class Connect{
public static void main(String[] args){
 Driver driver = GraphDatabase.driver("bolt://localhost:7687",AuthTokens.basic("neo4j","neo4j"));
 Session session = driver.session();
 String cypher="create constraint on (n:ITEM) ASSERT n.itemid is unique"; //创建唯一索引,这样可以更快的导入数据
 Session.run(cypher);
 cypher="CALL apoc.periodic.iterate("CALL apoc.load.jdbc('jdbc:sqlserver://localhost;username=name;password=word;database=db;characterEncoding=utf-8',\"SELECT * FROM TABLE1\")","MERGE(n:ITEM{itemid:row.mitemid}) with * MERGE(m:ITEM{itemid:row.itemid}) with * create p=(n)-[r:rel{rels:row.rels}]->(m)",{batchSize:10000,iterateList:true})";  //连接sqlserve数据库和设计创建neo4j图数据库数据模型
 Session.run(cypher);
 session.close();
 driver.close();
   }
}

\

3 使用编程语言(Java,python,js,C#,Go)导入数据
支持Java、Python、Javascript、C#等,仅有Java和C#支持异步

以java 为例

首先增加依赖包

<dependency>
            <groupId>org.neo4j.driver</groupId>
            <artifactId>neo4j-java-driver</artifactId>
            <version>4.2.0</version>
 </dependency>
import org.neo4j.driver.*;

import static org.neo4j.driver.Values.parameters;

public class HelloWorldExample implements AutoCloseable {
    private final Driver driver;

    public HelloWorldExample(String uri, String user, String password) {
        driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password));
    }

    @Override
    public void close() throws Exception {
        driver.close();
    }

    public void printGreeting(final String message) {
        try (Session session = driver.session()) {
            String greeting = session.writeTransaction(new TransactionWork<String>() {
                @Override
                public String execute(Transaction tx) {
                    Result result = tx.run("CREATE (a:Greeting) " +
                                    "SET a.message = $message " +
                                    "RETURN a.message + ', from node ' + id(a)",
                            parameters("message", message));

                    return result.single().get(0).asString();
                }
            });
            System.out.println(greeting);
        }
    }

    public void syn() {
        try (Session session = driver.session()) {
            session.readTransaction(new TransactionWork<String>() {
                @Override
                public String execute(Transaction tx) {
                    Result result=tx.run("MATCH (a:Person) RETURN a.name limit 10");
                    while(result.hasNext()) {
                        Record record = result.next();
                        System.out.println(record.get("a.name"));
                    }
                    return null;
                }
            });
        }


    }

    public static void main(String... args) throws Exception {
        try (HelloWorldExample greeter = new HelloWorldExample("bolt://localhost:11005", "neo4j", "123456")) {
//            greeter.printGreeting("你好,世界");
            greeter.syn();
        }
    }
}

\

4 使用neo4j-admin工具导入数据

支持的数据格式:仅CSV,只能在Desktop端使用,Sandbox和Aura不支持使用该工具。
好处:导入时间少,效率高,支持导入数据很大(如超过10M),一次性导入多个CSV文件
缺点:neo4j数据库必须在导入完成后才能使用

导入语法

neo4j-admin import
  database <database-name>
  nodes [<rheader-csv-file-1>,]<csv-file-1>
  nodes=<Label>=[<rheader-csv-file-2>,]<csv-file-2>
  relationships [<jheader-csv-file-1>,]<join-csv-file-1>
  relationships=<REL_TYPE>=[<jheader-csv-file-2>,]<join-csv-file-2>
  trim-strings=true
  > import.out