Groovy 在gremlin控制台上,为什么要断言';等式';内部返回false';是';而直接比较返回true?

Groovy 在gremlin控制台上,为什么要断言';等式';内部返回false';是';而直接比较返回true?,groovy,gremlin,Groovy,Gremlin,在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版本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
如果名称等于
test\u name
(长度为9),则上述代码始终返回false。而如果进行直接比较(如下图所示),则返回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
gremlin>g=TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[顶点:6条边:6],标准]
gremlin>g.V().values('name').filter{it.get().length()lop
=>乔希

谢谢你,我非常感谢你的澄清。这对我很有用。