Groovy Gremlin中select遍历外用法及Node.js Gremlin转译疑问
Groovy Gremlin到Node.js Gremlin的转译说明
问题根源:Groovy的语法糖差异
你看到的Groovy代码里select('source').label()是Groovy的语法糖——在Groovy中,嵌套遍历步骤允许省略匿名遍历的起始符__,看起来像是直接调用select函数,但实际等价于__.select('source').label(),这是一个嵌入在property参数中的匿名遍历。
而Node.js的Gremlin API不支持这种隐式写法,必须显式使用__来标识嵌套遍历,同时所有TinkerPop的关键字(比如label)都需要从gremlin包中导入,不能直接作为字符串或全局函数使用。
转译后的Node.js代码
以你给出的片段为例,转译后代码如下:
const { traversal, __, label } = require('gremlin'); // 假设已初始化g遍历器 g.V(4).as('source') .addV() .property(label, __.select('source').label());
完整克隆节点+边的转译示例
如果要实现原QA中完整的克隆节点及其所有边的逻辑,完整Node.js代码大致如下:
const { __, label, outE, inV, inE, outV, addE, properties } = require('gremlin'); g.V(4).as('source') // 克隆节点属性 .addV() .property(label, __.select('source').label()) .as('clone') .select('source') .properties() .as('p') .select('clone') .property(__.select('p').key(), __.select('p').value()) // 克隆出边 .select('source') .outE() .as('e') .inV() .as('target') .select('clone') .addE(__.select('e').label()) .to(__.select('target')) .select('e') .properties() .as('ep') .select('clone') .outE(__.select('e').label()) .to(__.select('target')) .property(__.select('ep').key(), __.select('ep').value()) // 克隆入边 .select('source') .inE() .as('ie') .outV() .as('isource') .select('clone') .addE(__.select('ie').label()) .from(__.select('isource')) .select('ie') .properties() .as('iep') .select('clone') .inE(__.select('ie').label()) .from(__.select('isource')) .property(__.select('iep').key(), __.select('iep').value()) .iterate();
关键注意点
- 所有嵌套遍历必须用
__开头,比如__.select('source'),不能直接写select('source') - TinkerPop的内置常量(如
label、outE等)需要从gremlin包中导入,不能直接使用字符串(比如不能用'label'代替label) - Node.js中Gremlin的链式调用语法和Groovy一致,但要注意JavaScript的分号和换行规范
内容的提问来源于stack exchange,提问作者Joseph Summerhays
相关产品推荐
相关产品推荐

