我有一个表存储在一个典型的 MySQL 数据库中,并且我使用 java 构建了一个小型解析器工具,用于解析并构建 neo4j 数据库。该数据库将有约 4000 万个节点,每个节点都有一个或多个边(最多可能有 10 个边)。问题来自我必须创建某些节点的方式。有一个用户节点、评论节点和主题标签节点。用户节点和主题标签节点必须是唯一的。我使用以下示例中的代码来确保唯一性:
public Node getOrCreateUserWithUniqueFactory( String username, GraphDatabaseService graphDb )
{
UniqueFactory<Node> factory = new UniqueFactory.UniqueNodeFactory( graphDb, "users" )
{
@Override
protected void initialize( Node created, Map<String, Object> properties )
{
created.setProperty( "name", properties.get( "name" ) );
}
};
return factory.getOrCreate( "name", username );
}
我考虑过使用批量插入器,但我还没有找到一种方法来检查执行批量插入时节点是否唯一。所以我的问题是插入所有这些节点同时仍然确保它们保留其唯一性的最快方法是什么。任何帮助将一如既往地受到高度赞赏。
万一这里的其他人遇到这个问题,我想记录一下我自己和同事能够弄清楚的内容,以提高速度。首先,关于数据的一两个注释:
- 用户数量较多,约占节点的30%
- 还有大量的主题标签,因为人们倾向于散列任何东西
- 这两者都必须保证唯一
现在这已经不妨碍优化了。首先,您需要确保每次插入节点时插入循环都完成。没有真正的例子供我们查看,所以最初的代码看起来像这样(伪代码)
Transaction begin
While(record.next()){
parse record
create unique user
create unique hashtag
create comment
insert into graph
}
Transaction success
Transaction finish
虽然这对于小型数据集来说工作正常并且完成得相对较快,但它的扩展性不佳。因此,我们查看了每个函数的用途并将代码重构为如下所示:
While(record.next()){
Transaction begin
parse record
create unique user
create unique hashtag
create comment
insert into graph
Transaction success
Transaction finish
}
这极大地加快了速度,但对我的同事来说还不够。所以他发现Lucene索引可以在节点属性上创建,并且我们可以引用Unique Node工厂中的索引。这给我们带来了另一个显着的速度提升。以至于我们可以在大约 10 秒内插入 1,000,000 个节点,而无需使用批处理加载器。感谢大家的帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)