在 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()
在优化以 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()