使用特定模型通过 Tinkerpop 将(数百万行)数据导入 Janusgraph 的最佳方式
Best way to get (millions of rows of) data into Janusgraph via Tinkerpop, with a specific model
刚开始使用 Tinkerpop 和 Janusgraph,我正在尝试根据文档解决这个问题。
- 我有三个数据集,每个数据集包含大约 2000 万行(csv 文件)
- 有一个特定的模型,其中的变量和行需要连接,例如什么是顶点,什么是标签,什么是边等等
- 在图表中包含所有内容后,我当然想使用一些基本的 Gremlin 来查看模型的工作情况。
但首先我需要一种将数据导入 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_id
和 target_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,它几乎总是取决于您的数据,因此它视具体情况而定,无法推荐您应该从哪里开始。
总而言之,真正开始吧,在我看来,批量加载是最困难的部分,这些努力是值得的,它为您的应用程序提供了新的维度。
祝一切顺利!
刚开始使用 Tinkerpop 和 Janusgraph,我正在尝试根据文档解决这个问题。
- 我有三个数据集,每个数据集包含大约 2000 万行(csv 文件)
- 有一个特定的模型,其中的变量和行需要连接,例如什么是顶点,什么是标签,什么是边等等
- 在图表中包含所有内容后,我当然想使用一些基本的 Gremlin 来查看模型的工作情况。
但首先我需要一种将数据导入 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_id
和target_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,它几乎总是取决于您的数据,因此它视具体情况而定,无法推荐您应该从哪里开始。
总而言之,真正开始吧,在我看来,批量加载是最困难的部分,这些努力是值得的,它为您的应用程序提供了新的维度。
祝一切顺利!