【问题标题】:Gremlin is slow to insert vertexGremlin 插入顶点很慢
【发布时间】:2021-05-28 00:51:42
【问题描述】:

我在 python 中使用 Gremlin,我创建了一个函数来添加一个新的顶点以避免创建重复:

def add_vertex(label, properties):
    first_attribute = list(properties.keys())[0]
    check_vertex = g.V().has(first_attribute, properties[first_attribute]).toList()
    if check_vertex:
        return check_vertex[0]
    v = g.addV(label)
    for attribute in properties:
        v.property(attribute, properties[attribute])
    return v.next()

'label' 是顶点的名称,'properties' 是一个带有属性的字典。

为了提高添加新顶点的性能,我还根据属性的第一个属性添加了一个索引。

使用包含 284.000 个元素的字典,时间为:

  • 12 分钟不检查顶点(仅限顶点插入)
  • 25 分钟完成整个功能

Gremlin 有可能这么慢吗?难道不能提高性能吗? 我觉得这个时机太过分了,不是吗?

还有另一种添加顶点而不重复的方法吗?

谢谢。

【问题讨论】:

  • 澄清一下,您想添加 284K 顶点,并且您想在添加之前检查每个顶点是否已经存在?
  • @KelvinLawrence 完全正确,因为我不想重复。但是检查再添加一个新的顶点,作为一个新的边,很慢。

标签: python performance indexing gremlin vertex


【解决方案1】:

您似乎正在尝试插入 284K 顶点检查是否已经存在。您可以采取一些措施来加快这些操作。

首先,您可以在 Gremlin 查询中使用 coalesce 步骤检查是否存在并根据需要进行更新

g.V().has(first_attribute, properties[first_attribute]).
  fold().
  coalesce(unfold(),<add whatever needs adding>)

为了进一步提高 Python 客户端的吞吐量,您还可以做两件事

  1. 通过将上面显示的 20 到 50 个步骤批处理在一起,每次插入发送多个请求。
  2. 在多个 Python 线程或进程之间划分工作。

您连接到的 Neptune 实例处理查询的工作线程数量是该实例上 vCPU 数量的两倍。使用这些技术将显着提高吞吐量,并显着减少您与 Neptune 之间的往返调用次数。

【讨论】:

  • 谢谢。现在我找到了使用 json 文件改进顶点导入的方法。导入 284K 顶点仅需 1 分钟。但是现在我尝试使用相同的技术只导入边,但是如果我传递了 @type: g:Edge 元素,导入会给我一个错误
猜你喜欢
  • 1970-01-01
  • 2017-01-07
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
相关资源
最近更新 更多