【问题标题】:Inserting large number of nodes into Neo4J在 Neo4J 中插入大量节点
【发布时间】:2013-02-20 00:58:33
【问题描述】:

我有一个存储在典型 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 );

}

我曾考虑过使用批量插入器,但我还没有看到在执行批量插入时检查节点是否唯一的方法。所以我的问题是插入所有这些节点同时仍确保它们保持其唯一性的最快方法是什么。我们将一如既往地为您提供任何帮助。

【问题讨论】:

    标签: java neo4j bigdata


    【解决方案1】:

    如果这里的其他人遇到这个问题,我想记录下我自己和同事能够弄清楚的内容,以提高速度。首先是关于数据的一两个注释:

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

    【讨论】:

    • “所以他发现可以在节点属性上创建 Lucene 索引,我们可以在 Unique Node 工厂中引用这些索引。”你能再解释一下吗?我有一个带有索引节点属性的索引,例如'name' 并将其用于唯一节点工厂。你是这个意思吗?
    • 是的,请!我也想知道这个提高neo4j插入速度的魔法咒语是什么! :-)
    【解决方案2】:

    为什么不在批量插入期间创建本地缓存?您可以使用带有键 name 和值 NodeId(来自批处理插入器)的 java Map

    【讨论】:

      【解决方案3】:

      通常最简单的方法是将它们保存在HashMap 中。毕竟你不会有那么多用户和标签

      您也可以使用LuceneBatchInserterIndexsetCapacity

      见:http://docs.neo4j.org/chunked/milestone/batchinsert.html#indexing-batchinsert

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        相关资源
        最近更新 更多