在带有步骤 is
的 gremlin 版本 3.4.0 上,谓词未按预期工作。
如果我执行以下操作,它将返回我的真实
gremlin>3.is(3)
==>true
gremlin>[3].getAt(0).is(3)
==>true
虽然与使用谓词相同的比较不起作用并返回 false
gremlin>3.is(eq(3))
==>false
gremlin>[3].getAt(0).is(eq(3))
==>false
确切地说,我想检查节点属性值的长度并根据最大长度进行验证。
gremlin>g.V(0).values('name').next().length().is(lte(20))
==>false
上面的代码总是返回 false 是名称等于 test_name
(长度为 9(。虽然如果我进行直接比较(如下所示(,它返回 true
gremlin>g.V(0).values('name').next().length().is(9)
==>true
我在这里做错了什么?
你正在混合Groovy和Gremlin。执行此操作时:
gremlin>3.is(3)
==>true
gremlin>[3].getAt(0).is(3)
==>true
您没有使用Gremlin,因此这不是is()
步骤。在这种情况下,您正在使用Groovy的is()
方法进行引用相等性检查。这进一步解释了您在问题中进一步向下的结果,例如:
gremlin>g.V(0).values('name').next().length().is(lte(20))
==>false
因为一旦你这样做next()
你就不再做小精灵了。接下来没有任何内容代表 Gremlin 步骤,它只是 Groovy 代码。您正在调用 String.length()
方法,然后调用 Groovy is()
运算符,并将从 length()
返回的int
与lte(20)
进行比较,这是P
的实例,如下所示:
gremlin> "xyz".length().is(lte(20))
==>false
如果你想使用 Gremlin 来检查字符串的长度,那么我不确定除了使用 lambda 之外是否有一种方法可以做到这一点:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().values('name').filter{it.get().length()<=4}
==>lop
==>josh