Neo4j导入数据的方式有:
具体选择哪种导入方法取决于:
CSV格式的数据是文本数据,数据之间用英文逗号隔开。
支持的数据类型:仅CSV
好处:操作简单。
坏处:运行时间长
关键步骤就是:先生成CSV文件,然后用Cypher语句“LOAD CSV”将数据导入到Neo4j数据库中。
这种方式是最简单的导入数据到neo4j的方式,也是广泛使用来导入原始数据。
使用LOAD CSV导入数据的要求:
用Cypher加载数据的步骤:
(1)CSV文件结构
CSV文件包括header和data两部分,当数据量较大且有多个files时,建议将header与data分离开。
(2)规范化数据
people.csv表示演员表,movies1.csv表示电影表,roles.csv表示演员参演电影表,这时候可以将roles在图数据库中的关系规范化为*:ACTED_IN*
(3)ID必须唯一
(4)数据干净吗?
LOAD CSV WITH HEADERS
FROM 'https://data.neo4j.com/v4.0-intro-neo4j/people.csv'
AS line
WITH line WHERE line.birthYear > "1999"
RETURN line LIMIT 10
(6)确定是否需要转化
无论什么数据,导入到neo4j中都视为字符串,因此导入时可以预先进行转换。
(7)确定数据约束
一般主键id需要有唯一性约束。下面例子是为Movie和Person分别为id建立唯一性约束。
CREATE CONSTRAINT UniqueMovieIdConstraint ON (m:Movie) ASSERT m.id IS UNIQUE;
CREATE CONSTRAINT UniquePersonIdConstraint ON (p:Person) ASSERT p.id IS UNIQUE
创建结点有MERGE和CREATE两种方式,MERGE比CREATE多了检查唯一性。
(8)确定加载数据量的大小
LOAD CSV这种方式只能加载100K的数据量。
若超出100K的csv文件,有两种方式解决:
: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,":")
b. 导入演员结点
:auto USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM
'https://data.neo4j.com/v4.0-intro-neo4j/people.csv' as row
MERGE (p:Person {id:toInteger(row.personId)})
ON CREATE SET
p.name=row.name,
p.birthYear=toInteger(row.birthYear),
p.deathYear=toInteger(row.deathYear)
c. 导入“导演”关系
LOAD CSV WITH HEADERS FROM
'https://data.neo4j.com/v4.0-intro-neo4j/directors.csv' AS row
MATCH (movie:Movie {id:toInteger(row.movieId)})
MATCH (person:Person {id: toInteger(row.personId)})
MERGE (person)-[:DIRECTED]->(movie)
ON CREATE SET person:Director
(10)为图数据添加索引
CREATE INDEX MovieTitleIndex FOR (m:Movie) ON (m.title);
CREATE INDEX PersonNameIndex FOR (p:Person) ON (p.name)
支持数据格式:CSV,XML,GraphXML,JSON
使用APOC导入数据的要求:
编程语言-驱动-Neo4j的方式来导入数据。
使用驱动导入数据的要求:
<dependency>
<groupId>org.neo4j.drivergroupId>
<artifactId>neo4j-java-driverartifactId>
<version>4.2.0version>
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();
}
}
}
-2- Python语言
pip install neo4j
from neo4j import GraphDatabase
class HelloWorldExample:
def __init__(self, uri, user, password):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def close(self):
self.driver.close()
def print_greeting(self, message):
with self.driver.session() as session:
greeting = session.write_transaction(self._create_and_return_greeting, message)
print(greeting)
@staticmethod
def _create_and_return_greeting(tx, message):
result = tx.run("CREATE (a:Greeting) "
"SET a.message = $message "
"RETURN a.message + ', from node ' + id(a)", message=message)
return result.single()[0]
if __name__ == "__main__":
greeter = HelloWorldExample("bolt://localhost:7687", "neo4j", "password")
greeter.print_greeting("hello, world")
greeter.close()
支持的数据格式:仅CSV,只能在Desktop端使用,Sandbox和Aura不支持使用该工具。
好处:导入时间少,效率高,支持导入数据很大(如超过10M),一次性导入多个CSV文件
缺点:neo4j数据库必须在导入完成后才能使用
使用neo4j-admin工具导入数据的要求:
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
能够实现DBMS和neo4j之间的实时连接来导入数据。
使用ETL工具导入数据的要求:
导入步骤: