neo4j 数据插入需要时间

neo4j data insertion taking time

我已经在 linux 本地服务器上的 Ubuntu 14.04 上安装了 Neo4j 社区版 3.0.3,并已成功安装。现在我通过我的 windows 浏览器通过该服务器上的端口 7474 访问它。

现在我有一个包含以下格式的销售订单数据的 csv 文件:

Customer_id, Item_id, Order_Date

它有90000行,customer_id和item_id都是节点。一共(30000customer_ids + 30000item_ids)个节点和90000个关系(order_date为距离属性名)。我 运行 下面的查询将数据从 csv 插入到我的图形数据库中:

LOAD CSV WITH HEADERS FROM "file:///test.csv" AS line
MERGE (n:MyNode {Name:line.Customer})
MERGE (m:MyNode {Name:line.Item})
MERGE (n) -[:TO {dist:line.OrderDate}]-> (m)

我把它留给了运行,大约7到8个小时后,它仍然是运行ning。我的问题是,我做错了什么吗?我的查询没有优化吗?还是这件事很平常?我是 Neo4j 和 Cypher 的新手。请帮我解决这个问题。

创建唯一性约束

您应该在 MyNode.Name:

上创建唯一性约束
CREATE CONSTRAINT ON (m:MyNode) ASSERT m.Name IS UNIQUE;

除了强制 MyNode 的数据完整性/唯一性之外,这将在 MyNode.Name 上创建一个索引,这将加快对 MERGE 语句的查找。 indexes and performance section here.

中有更多信息

使用定期提交

由于 Neo4j 是一个事务性数据库,您的查询结果是在内存中建立的,整个查询是一次性提交的。根据您机器上可用的数据/资源的大小,您可能希望使用 periodic commit functionality in LOAD CSV 来避免在内存中构建整个语句。只需使用 USING PERIODIC COMMIT 开始您的查询。这将定期提交结果,在遍历 CSV 文件时释放内存资源。

避免急切

您的查询有一个问题是它包含 eager operation。这将阻碍定期提交功能,并且无论如何事务都将被构建到内存中。为避免急切的操作,您可以两次通过 csv 文件:

创建节点一次:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///test.csv" AS line
MERGE (n:MyNode {Name:line.Customer})
MERGE (m:MyNode {Name:line.Item})

然后再次创建关系:

LOAD CSV WITH HEADERS FROM "file:///test.csv" AS line
MATCH (n:MyNode {Name:line.Customer})
MATCH (m:MyNode {Name:line.Item})
MERGE (n) -[:TO {dist:line.OrderDate}]-> (m)

查看这些 two posts 以了解有关 eager 操作的更多信息。

您至少需要创建唯一性约束 - 这应该足以提高 LOAD CSV 语句的性能。