在 Gremlin + Neptune 中,Inject() 要插入的字符串列表作为顶点需要很长时间

Inject() list of strings to be upsert as vertices takes a very long time in Gremlin + Neptune

在优化以 AWS Neptune 作为后端的服务时,我偶然发现 要使用 inject(),因此我决定对一组查询进行批处理以避免往返 Neptune :

g.inject(Array.from(attributes))
        .unfold()
        .as(SELECTOR_NAME)
        .coalesce(
            __.V()
                .hasLabel(NodeType.Attribute)
                .has(NodeType.propName.tenantId, this.tenantId)
                .has(NodeType.propName.code, __.where(Predicate.eq(SELECTOR_NAME))),
            __.addV(NodeType.Attribute)
                .property(NodeType.propName.created, new Date())
                .property(NodeType.propName.tenantId, this.tenantId)
                .property(NodeType.propName.updated, new Date())
                .property(NodeType.propName.code, __.identity())
                .property(NodeType.propName.title, __.identity()) // TODO capitalize or get from source
        )
        .project(NodeType.propName.code, NodeType.propName.id)
            .by(__.values(NodeType.propName.code))
            .by(__.id())
        .toList();

但是,对于仅 27 个项目,这需要 90 到 100 秒,这比单独 upserts 慢。我知道这里可能有很多问题,但我想排除查询本身效率低下的可能性。

使用的堆栈是 Typescript + Node.js + gremlin + AWS Neptune,而且通过 Sagemaker notebook 查询大约需要 90 秒。

下面是一个应该适用于任何地方的示例查询:

    g.inject(["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", '24', '25']).
    unfold().
    as('a')
.coalesce(
  __.V()
  .hasLabel('attribute')
  .has('tenantId', 'spm')
  .has('code', __.where(eq('a'))),
  __.addV('attribute').
  property('created', 'new Date()').
  property('tenantId', 'spm').
  property('updated', 'new Date()').
  property('code', __.identity()).
  property('title', __.identity())
)
.project("code", "id").by(__.values("code")).by(__.id())
.toList()

这个的响应时间是 72 毫秒 这是很多试验和错误,但主要的解决方案是使用 withSideEffect(), 而不是 inject():

g.withSideEffect("aList", ["a", "b", "c", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "x", 'y', 'z'])
.V()
.hasLabel('test_attribute')
.has('tenantId', 'spm')
.fold()
.as('v')
.select('aList')
.unfold()
.as('a')
.map(
__.coalesce(
      __.select('v').unfold().has("code", where(eq('a'))),
      __.addV('test_attribute').
      property('created', 'new Date()').
      property('tenantId', 'spm').
      property('updated', 'new Date()').
      property('code', __.identity()).
      property('title', __.identity())
)
)
.project("code", "id").by(__.values("code")).by(__.id())
.toList()