持续创作,加速成长!这是我参与「掘金日新计划 · 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