基于属性条件的Gremlin边合并操作报错求助
问题原因
报错的核心有两点:
mergeE()的第一个参数是用于精确匹配现有边的键值对集合,你错误地在这里使用了lte()/gt()这类范围判断条件,违反了mergeE的参数规则。Merge.onCreate选项里重复定义了active、inactive、边标签以及方向属性,和mergeE()的初始参数产生属性覆盖冲突,触发了Gremlin的非法输入校验。
修正后的遍历代码
要实现“若不存在输入日期落在active与inactive区间内的边则新增”的逻辑,需用coalesce()结合查询与创建操作(mergeE()仅支持精确属性匹配,无法处理范围条件):
写法一:基于between与where的精简版
g.V(select("v2")).as("outV") .V(select("v1")).as("inV") .coalesce( // 先查找符合区间条件的目标边 E().hasLabel("ben") .between("active", "inactive", 1695658399064) .where(outV().as("outV")) .where(inV().as("inV")), // 找不到则创建新边 addE("ben") .from("outV") .to("inV") .property("active", 1695658399064) .property("inactive", 1995658399064) )
写法二:基于match的清晰版
g.match( __.as("outV").V(select("v2")), __.as("inV").V(select("v1")), __.optional( __.E().hasLabel("ben") .has("active", lte(1695658399064)) .has("inactive", gt(1695658399064)) .from("outV") .to("inV") .as("edge") ) ).coalesce( select("edge"), addE("ben").from("outV").to("inV") .property("active", 1695658399064) .property("inactive", 1995658399064) )
关键说明
coalesce()会按顺序执行遍历分支,找到第一个返回结果的分支就停止,完美适配“存在则返回、不存在则创建”的需求。- 范围条件必须放在边的查询分支里,不能直接写入
mergeE的匹配参数——mergeE的匹配逻辑是精确键值对匹配,不支持比较运算符。
内容的提问来源于stack exchange,提问作者Ravi Agarwal
相关产品推荐
相关产品推荐

