首页 > 解决方案 > 在gremlin控制台上,为什么谓词'eq'在'is'内返回false而直接比较返回true?

问题描述

在带有 step 的 gremlin 版本 3.4.0 上is,谓词未按预期工作。

如果我执行以下操作,它将返回真实

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

我在这里做错了什么?

标签: groovygremlin

解决方案


您正在混合 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。后面没有任何内容代表 Gremlin 步骤,它只是 Groovy 代码。您正在调用该String.length()方法,然后调用 Groovyis()运算符并比较int返回的 from length()to lte(20)which 是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

推荐阅读