批量事务同步到 Tinkerpop 图中的一种方式

One way bulk transactional sync into a Tinkerpop graph

我有一个系统 (Cassandra),其中包含我想与启用 Tinkerpop 的商店(我使用 AWS Neptune)单向“同步”的数据。通过单向同步,我的意思是数据仅通过从事实源到图形存储的同步过程进行更新,并且对于图形存储的用户来说是只读的。

事实来源拥有一个相对较小的数据集,当构建为图形时,它包含 <1MM 的顶点和边。

我正在研究以下两种方法:

A) 使用 Neptune Bulk Loader:

  1. 每当真实来源发生变化时,将所有数据作为快照转储到文件中(将来可能会使用变化事件作为增量)
  2. 从图形存储中读取所有感兴趣的数据并计算要更新插入的节点和顶点
  3. 将所有节点和顶点写入 csv 文件并将它们加载到 Neptune

优点

缺点

B) 与 Tinkerpop 进行会话 SessionedClient

  1. 每当真实来源发生变化时,将所有数据作为快照转储到文件中(将来可能会使用变化事件作为增量)
  2. 从图存储中读取所有感兴趣的数据并计算要更新插入的节点和顶点。
  3. 使用单个会话发送批量 Gremlin 查询以更新和删除节点和顶点

优点

缺点

我用小数据集尝试了这两个选项。我也尝试过使用常规的每个请求一个事务 java 客户端,但在单个请求中发送所有更改并不符合未来的要求。我说得对吗?

我即将开始产品化方法 B,我想知道是否有任何我应该注意的陷阱或我没有考虑过的其他选择?

一些想法 - 你已经很好地思考了一些利弊。

  1. 对于 Neptune,如果您经常进行大量写入以以非更新插入方式添加数据,则批量加载程序是一个不错的选择。但是,正如您所注意到的,批量加载器的语义是“尽你所能”,要么加载每个有效的 CSV 行,要么在发现一行无效时立即失败。如果您可以通过筛选保证您的数据提前干净,批量加载器可能仍然是一个不错的选择。

  2. Gremlin 会话使您可以更好地控制交易,但正如您所指出的,目前查询必须以文本形式发送。但是,在 TinkerPop 3.5.0 版本中,添加了对 ByteCode 事务的支持。最初是为了 Java 客户,其他人很快就会跟进。 Node 已经在开发中了,希望 Python 之后很快。一旦 Amazon Neptune 升级到 TinkerPop 3.5.x 级别,您将能够利用新的 ByteCode 交易 syntax/semantics。请注意,会话的 10 分钟限制适用于会话空闲时。任何 activity 都会将计时器再次重置为 10 分钟。