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
语句的性能。
我已经在 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
语句的性能。