【发布时间】:2018-03-16 11:01:21
【问题描述】:
我是 Neo4j 的新手,对基础知识肯定有一些我不了解的地方。
我有很多 Java 对象,我想使用 Java 驱动程序和 Cypher 使用它们来填充 Neo4j 图形。我的代码是这样工作的:
// nodes
for ( Person person: persons )
session.run ( String.format (
"CREATE ( :Person { id: '%s', name: \"%s\", surname: \"%s\" })",
person.getId(), person.getName(), person.getSurname ()
));
// relations
session.run ( "CREATE INDEX ON :Person(id)" );
for ( Friendship friendship: friendships )
session.run ( String.format (
"MATCH ( from:Person { id: '%s' } ), ( to:Person { id: '%s' } )\n" +
"CREATE (from)-:KNOWS->(to)\n",
friendship.getFrom().getId(),
friendship.getTo().getId()
));
(确实,它稍微复杂一些,因为我有十几种节点类型和大约相同数量的关系类型)。
现在,这非常慢,比如加载 300k 节点和 1M 关系需要 1 个多小时(在相当快的 MacBookPro 上,Neo4j 占用 12/16GB 的 RAM)。
我做错了吗?我应该改用batch inserter 吗? (我希望能够通过网络访问graphDB)。我会通过将更多插入分组到一个事务中来获得一些东西吗? (从文档看来,事务似乎只对回滚和隔离需求有用)。
【问题讨论】: