Gremlin遍历false分支错误执行求助(Gremlin JS + AWS Neptune)
问题根源
你犯的核心错误是混淆了客户端JavaScript代码的执行时机和Gremlin遍历的执行时机:
token !== undefined是客户端JS的判断逻辑,在构建Gremlin遍历结构时就会执行;- 但
token!.timestamp、token!.id这类写法也是客户端JS代码,会在构建遍历的阶段就直接求值——不管服务端后续会不会走对应的choose分支,客户端都会提前尝试访问token的属性,所以当token为undefined时必然报错。
Gremlin的执行逻辑是:客户端先把完整的遍历结构解析构建好,再发送到Neptune服务端执行。你写的token!.xxx属于客户端提前解析的变量,不是服务端执行时才会处理的遍历步骤。
修正方案
需要把所有依赖token的逻辑转移到Gremlin遍历步骤中,让服务端来处理条件判断和属性值的获取,避免客户端提前解析未定义的token。以下是两种可行的修正方式:
方式1:用SideEffect传递token
// 先把token传入遍历的SideEffect,让服务端处理判断逻辑 .withSideEffect('token', token) .choose( // 服务端判断token是否存在 __.coalesce(__.select('token'), __.constant(false)), // token存在时的分支 __.choose( __.select('v').has(`${engagementType}Token`), __.choose( __.select('v').values(`${engagementType}Timestamp`).is(p.lt(__.select('token').values('timestamp'))), __.select('v') .property(c.single, `${engagementType}Timestamp`, __.select('token').values('timestamp')) .property(c.single, `${engagementType}Token`, __.select('token').values('id')), // 补上原代码缺失的else分支,避免遍历中断 __.identity() ), __.select('v') .property(`${engagementType}Timestamp`, __.select('token').values('timestamp')) .property(`${engagementType}Token`, __.select('token').values('id')) ), // token不存在时的分支,这里示例为不做操作,可按需修改 __.identity() )
方式2:用参数绑定(更安全)
// 提前处理token的属性,用参数绑定传递给服务端 const traversal = g // ... 你的前置遍历步骤 .choose( // 判断token是否存在(通过绑定的参数) p.not(p.eq(null)), __.choose( __.select('v').has(`${engagementType}Token`), __.choose( __.select('v').values(`${engagementType}Timestamp`).is(p.lt(p('tokenTimestamp'))), __.select('v') .property(c.single, `${engagementType}Timestamp`, p('tokenTimestamp')) .property(c.single, `${engagementType}Token`, p('tokenId')), __.identity() ), __.select('v') .property(`${engagementType}Timestamp`, p('tokenTimestamp')) .property(`${engagementType}Token`, p('tokenId')) ), __.identity() ) .bindings({ tokenTimestamp: token?.timestamp ?? null, tokenId: token?.id ?? null })
额外注意点
原代码中内部的choose分支缺失了else逻辑,这会导致遍历在某些条件下中断,必须补上__.identity()或其他你需要的默认操作,保证遍历能正常执行到底。
内容的提问来源于stack exchange,提问作者Kyano
相关产品推荐
相关产品推荐

