如何在Gremlin JavaScript的mergeV中正确使用Cardinality?
报错原因及mergeV中基数的正确用法
报错原因
你遇到的Unsupported property value type错误,核心原因是CardinalityValue.single()返回的是一个Gremlin遍历对象(DefaultGraphTraversal),但mergeV的option()方法在接收Map类型参数时,要求Map的值必须是直接的属性值,而非遍历步骤。直接把CardinalityValue包装后的值放进Map,相当于给属性赋值了一个遍历对象,不符合图数据库对属性值的要求,因此触发类型不支持错误。
正确用法
在mergeV的option中指定基数,不能用Map包装CardinalityValue,而是要通过**匿名遍历器(__)**构建包含property()步骤的遍历逻辑,把基数指定在property()方法里,和你在addV中的用法逻辑对齐。
示例代码
await g .mergeV(new Map([ [t.label, 'test'], [t.id, 'testid'] ])) // onCreate时直接设置属性(无特殊基数需求,默认即为single) .option(onCreate, __.property('prop1', 'prop1value3').property('prop2', 'prop2value')) // onMatch时明确指定single基数设置属性 .option(onMatch, __.property(single, 'prop1', 'prop1value3').property(single, 'prop2', 'prop2value3')) .iterate();
说明
__是Gremlin的匿名遍历器,用来构建独立的遍历步骤,作为option的参数传入,告诉图数据库在匹配/创建节点时执行对应的属性操作。- 在
onMatch中,通过property(single, key, value)明确指定基数,和你在addV中使用的方式完全一致,能正确触发基数约束逻辑。 CardinalityValue一般用于with()等特殊场景,不适合直接作为mergeV的option Map值传入。
内容的提问来源于stack exchange,提问作者kyl
相关产品推荐
相关产品推荐

