gpt4 book ai didi

java - 向 Neo4J 中插入大量节点

转载 作者:行者123 更新时间:2023-11-29 05:48:21 28 4
gpt4 key购买 nike

我有一个存储在典型 MySQL 数据库中的表,我使用 java 构建了一个小型解析器工具,用于解析并构建一个 neo4j 数据库。这个数据库将有大约 4000 万个节点,每个节点有一条或多条边(最多可能有 10 条边)。问题来 self 必须创建某些节点的方式。有一个用户节点、评论节点和主题标签节点。用户节点和标签节点都必须是唯一的。我使用以下示例中的代码来确保唯一性:

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 个节点,而无需使用批处理加载器。感谢大家的帮助。

关于java - 向 Neo4J 中插入大量节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14970513/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com