在带有步骤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
我在这里做什么错了?
答案 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