在 gremlin 控制台上,为什么谓词'eq'在 'is' 内部返回 false,而直接比较返回 true?



在带有步骤 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() 返回的intlte(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

最新更新