使用特定模型通过 Tinkerpop 将(数百万行)数据导入 Janusgraph 的最佳方式

Best way to get (millions of rows of) data into Janusgraph via Tinkerpop, with a specific model

刚开始使用 Tinkerpop 和 Janusgraph,我正在尝试根据文档解决这个问题。

但首先我需要一种将数据导入 Janusgraph 的方法。

可能存在这方面的脚本。 但除此之外,是否可能需要在 python 中编写一些内容,以打开一个 csv 文件,获取变量 X 的每一行,并将其添加为 vertex/edge/etc。 ……? 还是我完全误解了 Janusgraph/Tinkerpop?

提前感谢您的帮助。

编辑:

假设我有几个文件,每个文件包含几百万行,代表人,还有几个变量,代表不同的指标。第一个示例可能如下所示:

             metric_1    metric_2    metric_3    ..

person_1        a           e           i
person_2        b           f           j
person_3        c           g           k
person_4        d           h           l
..        

我是否应该将其转换为节点首先由值 [a,..., l] 组成的文件? (以及稍后可能更详细的属性集)

[a,..., l] 是否已编入索引?

'Modern' 图 here 似乎有一个索引(所有节点和边的编号 1,...,12,独立于它们的重叠 label/category),例如是否应该为每个测量单独编制索引,然后链接到它们所属的给定 person_x?

对于这些可能直截了当的问题,我深表歉意,但我对此还很陌生。

JanusGraph 使用 pluggable storage backends and indexs。出于测试目的,一个名为 bin/janusgraph.sh 的脚本与发行版打包在一起。它允许通过启动 Cassandra 和 Elasticsearch 快速起床和 运行(它还会启动一个 gremlin-server 但我们不会使用它)

cd /path/to/janus
bin/janusgraph.sh start

那么我建议使用 Groovy 脚本加载数据。 Groovy 可以使用 Gremlin 控制台执行脚本

bin/gremlin.sh -e scripts/load_data.script 

加载数据的一种有效方法是将其拆分为两个文件:

  • nodes.csv:每个节点一行,所有属性
  • links.csv:每个 link 一行 source_idtarget_id 以及所有 links 属性

这可能需要一些数据准备步骤。

这是一个example script

加快该过程的技巧是在创建节点期间保持您的 ID 与 JanusGraph 创建的 ID 之间的映射。

即使不是强制性的,我也强烈建议您在加载任何数据之前为您的图形创建一个显式模式。这是一个 example script

好吧,事实是将真实用户数据批量加载到 JanusGraph 中真的很痛苦。我一直在使用 JanuGraph,因为它是大约 2 年前的第一个版本,批量加载数据仍然很痛苦。其中很多不一定归结为 JanusGraph,因为不同的用户有非常不同的数据、不同的格式、不同的图形模型(即一些人主要需要一个顶点和一条边(例如 child-mother )其他人处理一个顶点和许多边( ex user followers ) ) 最后但同样重要的是,该工具的本质是处理大型数据集,更不用说底层存储和索引数据库大多是预先配置为大规模复制的(即你可能认为 2000 万行,但你实际上最终插入 60m 或 80m 条目)

总而言之,我在适当的时间范围内批量加载数千万美元方面取得了一定的成功(这同样会很痛苦,但这是一般步骤)。

  • 创建图形元素时提供 ID。如果从 MySQL 导入,考虑将表名与 id 值组合起来创建唯一 ID,例如 users1、tweets2
  • 不要预先指定架构。这是因为 JanusGraph 需要确保数据符合每次插入
  • 不要预先指定索引。仅与上述相关,但确实值得拥有自己的条目。稍后批量插入第一个索引
  • 请,请,请注意批量插入的底层数据库功能并激活它们,即阅读有关 Cassandra、ScyllaDB、Big Table 的文档,尤其是关于复制和索引的文档
  • 完成上述所有操作后,为批量加载配置 JanusGraph,确保您的数据完整性正确(即没有重复的 ID)并考虑某种形式的并行化插入请求,例如某种 map reduce 系统

我想我已经涵盖了要点,同样,这里没有灵丹妙药,这个过程通常涉及相当多的试验和错误,例如批量插入率,太低是不好的,例如每秒 10 次,而太高同样糟糕,例如每秒 10k,它几乎总是取决于您的数据,因此它视具体情况而定,无法推荐您应该从哪里开始。

总而言之,真正开始吧,在我看来,批量加载是最困难的部分,这些努力是值得的,它为您的应用程序提供了新的维度。

祝一切顺利!