将大量节点插入 Neo4J

2023-12-02

我有一个表存储在一个典型的 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(使用前将#替换为@)

将大量节点插入 Neo4J 的相关文章

随机推荐

  • WPF 中的用户控件位置

    我是 WPF 新手 我创建了一个新的 UserControl MyUserControl 现在我很惊讶 UserContol 没有位置 我如何读取 通过代码 myUserControl1 Location在父容器中 我解释 我有一些点 用户
  • Docusign 代表发送 (SOBO)

    如果有人有 我欢迎提供有关如何使用 Docusign 的代表发送 SOBO 功能的示例 我正在使用带有 XML 的 SOAP API 甚至 Docusign 的 III 级支持也无法提供示例 Thanks 2021 年 4 月更新 新的 R
  • java.rmi.ConnectException:连接拒绝主机:127.0.1.1;

    java rmi ConnectException Connection refused to host 127 0 1 1 nested exception is java net ConnectException Connection
  • 如何将 JPA 字段持久化为 clob?

    我有一个类不能很好地序列化为关系实体 因此 我想使用 JPA 作为 CLOB 来持久化它 我可以将它序列化为字符串 我该如何使用 JPA 来做到这一点 示例实体 Entity Table name MY TABLE public class
  • 如何使用 const getter 对 std::set 进行排序

    我有一个 std set 容器 其元素是以下类的对象 class LaneConnector public const Lane getLaneFrom const return From const Lane getLaneTo cons
  • 上午 12 点和下午 12 点的时间正则表达式

    我做了这个正则表达式 00 0 0 9 1 012 0 5 0 9 a p m A P M 但问题是它正在接受 00 00 am 我不想这样 如何忽略 我希望时间采用这种格式 上午 12 12 它不应该在这个 上午 00 21 我正在使用此
  • Spring Boot 触发完全重启,而不是在静态文件发生更改时重新加载

    In my Spring Boot项目我有以下结构 src main java resources static css js img webapp WEB INF views 根据文档排除资源 里面的资源static 应该触发一个relo
  • Woocommerce 产品自定义字段:检查输入是否已存在

    我安装了这个 WC Fields Factory 插件来向产品添加新字段 但我需要检查这个新文本框的值是否已存在于数据库中 举个例子 比如在注册时您不能使用已在使用的电子邮件 我必须像屏幕上一样添加文本字段 Update 2 处理字段验证
  • 在视频中跳转到数组中的时间

    沿着以下路线控制 HTML5 视频中的开始位置和播放时长 我试图在每个片段播放完毕后自动从一个片段跳转到下一个片段 每个分段将具有相同的持续时间 并且每个分段的开始时间将位于一个数组中 我似乎无法弄清楚如何在 addEventListene
  • 读取访问冲突 0xCDCCDCCD

    我不断遇到读取访问冲突 这是我的代码 class List public List List const List copy List List operator const List rhs Record headPtr const vo
  • 活动更改的翻转动画

    我想在两个活动之间切换 就像 iPhone 一样 我尝试使用 overridePendingTransition int EnterAnim int exitAnim 方法 但没有成功 有人实现过这样的动画吗 fesp 当您必须更改 Act
  • Java 原生数组长度

    我在 Java 中有一个二维双精度数组 它基本上是一个值表 我想知道它有多少行 它在其他地方声明 并分配 如下 double table 然后传递给一个函数 private void doSomething double table 在我的
  • Java 和 SQL:返回 null 还是抛出异常?

    这是另一个有争议的主题 但这次我只寻找简单且有记录的答案 场景 我们假设以下方法 我会避免以下情况 sql append SELECT FROM append dogs table sql append WHERE append colNa
  • 将 C++20 模板化 Lambda 传递给函数然后调用它

    我试图将模板化 lambda 传递给函数 然后使用模板参数调用它 以启用该函数针对自定义类型的专门化 但是当我尝试调用 lambda 时 出现此错误 error invalid operands to binary expression 对
  • 使用“or”的基本 Python If 语句

    我正在遵循一个学习 python 的初学者计划 我正在努力寻找一种更好的方法来使用具有多种可能性的 if 语句 我正在编写一个基于文本的基本游戏 用户可以选择三种不同的难度级别 简单 中等 困难 我只是想编写接受 1 2 或 3 的代码来告
  • 不允许我将编辑保存到 appsscript.json

    我想访问与用户 Google 帐户关联的名称来解决GoogleJsonResponseException API call to people people get failed with error The caller does not
  • 发送 GuzzleHttp\Psr7\Request 时 Guzzle6 错误资源类型无效:数组

    我试图使用 GuzzleHttp Psr7 Request 发送代码 不知何故我收到错误 Invalid resources type array 以下是我的代码 params name gt myName id gt myId clien
  • 为什么 JavaScript 中的“假”是真的?

    我知道在 javascript 中空字符串是假的 非空字符串在 javascript 中是真的 然而 为什么是 false javascript中的真相 规范中有什么明确的内容吗 这是性能问题还是在某些情况下您需要字符串 false 代表t
  • Aeson 合并对象编码

    我想解析和编写具有一些共同基本属性和一些附加单独属性的 JSON 对象 例如 假设我们有两种类型的对象User and Email 两种类型共享相同的基本属性foo and bar 但它们具有特定于其类型的附加属性 User foo foo
  • 将大量节点插入 Neo4J

    我有一个表存储在一个典型的 MySQL 数据库中 并且我使用 java 构建了一个小型解析器工具 用于解析并构建 neo4j 数据库 该数据库将有约 4000 万个节点 每个节点都有一个或多个边 最多可能有 10 个边 问题来自我必须创建某