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

时间:2019-06-11 10:32:08

标签: groovy gremlin

在带有步骤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

我在这里做什么错了?

1 个答案:

答案 0 :(得分:1)

您正在混合Groovy和Gremlin。当您这样做时:

gremlin>3.is(3)
==>true
gremlin>[3].getAt(0).is(3)
==>true

您没有使用Gremlin,因此不是is()步骤。在这种情况下,您正在使用Groovy的is()方法进行reference equality check。进一步解释问题时,这将进一步说明您的结果,例如:

gremlin>g.V(0).values('name').next().length().is(lte(20))
==>false

因为next()一经执行,您就不再在做Gremlin。接下来没有什么代表Gremlin的步骤,仅是Groovy代码。您要先调用String.length()方法,然后再调用Groovy is()运算符,然后将int返回的length()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