当前位置: 首页 > 面试题库 >

在Neo4J中插入大量节点

柯波峻
2023-03-14
问题内容

我有一个存储在典型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索引,并且我们可以在唯一节点工厂中引用这些索引。这给了我们另一个明显的提速。如此之多,以至于我们可以在10秒钟之内插入1,000,000个节点,而无需使用批处理加载器。感谢大家的帮助。



 类似资料:
  • 问题内容: 我需要通过REST API的Batch端点将大量节点及其之间的关系插入到Neo4j中,大约每秒5k记录(仍在增加)。 这将是24x7连续插入。每条记录可能只需要创建一个节点,而其他记录可能需要两个节点并创建一个关系。 是否可以通过更改程序或修改Neo4j的设置来提高插入件的性能? 到目前为止,我的进度: 1.我已经使用Neo4j进行了一段时间的测试,但无法获得所需的性能 测试服务器盒:

  • 我正在构建一个应用程序,我的用户可以在其中管理字典。一个功能是上传一个文件来初始化或更新字典的内容。 我首先关注的结构部分是

  • 问题内容: 我正在考虑使用Redis的协议进行批量插入,如下所述:http : //redis.io/topics/mass-insert 在我忙于编写代码来处理此问题之前,我只是想确保自己清楚什么是Redis要求进行此工作。 上面的链接建议使用大容量插入调用SET操作[SET myKey Value myValue],我需要创建一个命令,该命令可以在文件的多行或单个引号字符串中完成。 假设我不想

  • 问题内容: MongoDB支持批量插入http://docs.mongodb.org/manual/core/bulk- inserts/ 我已经在流星收藏中尝试过: 但是它创造了 我需要它来进行性能测试。我需要用数千个测试项目填充和测试数据库。我确实在foreach中进行了插入,但是填充数据库所需的时间太长。 这里有什么解决方法吗?还是可以期望Meteor在下一个版本中支持此功能? 问题答案:

  • 就像有人说的第二种方式更慢,但我不确定,那么哪种方式更好呢?不能使数据库崩溃。

  • 我在做一个程序,没有使用Java的内置链表类;我在从头开始做。除了编写一个将节点插入链表的特定位置的方法外,我在所有方面都取得了成功。 我有一个方法将一个特定的节点设置为“当前”节点。所以,例如,我有一个链表,看起来是这样的:猫-->狗-->使-->好-->宠物,“当前”等于2;这意味着“当前”节点是“狗”。 从这里开始,假设我想在“current”的位置插入一个新节点,它的info字段为AND。