Почему на консоли gremlin предикат 'eq' возвращает false внутри 'равен', а прямое сравнение возвращает true? - PullRequest
0 голосов
/ 11 июня 2019

В версии 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

Что я здесь не так делаю?

1 Ответ

1 голос
/ 11 июня 2019

Вы смешиваете 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(), а затем оператор Groovy is() и сравниваете int, возвращаемое из length() с lte(20), который является экземпляром P, таким образом:

gremlin> "xyz".length().is(lte(20))
==>false

Если вы хотите использовать Gremlin для проверки длины строки, то я не уверен, что есть способ сделать это вне использования лямбды:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().values('name').filter{it.get().length()<=4}
==>lop
==>josh
...