Гремлин: Есть ли способ найти персонажа на основе индекса строки? - PullRequest
0 голосов
/ 13 мая 2019

У меня есть вершина "офис" и свойство "имя" на OrientDB. Я хочу найти офисы по имени, где в имени нет «-» в качестве третьего символа строки. Я полагаю, что для этого потребуется некоторый Java-код в запросе gremlin. Это моя лучшая попытка, но это приводит к тому, что в служебных именах на самом деле третий знак "-".

g.V().hasLabel('office') .where(values('name').map{it.get().charAt(2)}.is(neq('-'))) .project('Office Name') .by(values('name'))

1 Ответ

0 голосов
/ 13 мая 2019

Поскольку Gremlin не поддерживает строковые операции (например, split, charAt и т. Д.), Ваш единственный шанс - лямбда.Похоже, вы уже поняли это, но ваше решение выглядит слишком сложным для меня.Вы можете использовать что-то гораздо более простое, например:

g.V().hasLabel('office').
  has('name', filter {it.get()[2] != '-'}).
  project('Office Name').
    by('name')

Однако обратите внимание, что этот фильтр будет генерировать исключение, если имя офисного имени содержит менее 3 символов.Таким образом, вам лучше проверить, что String достаточно длинный:

g.V().hasLabel('office').
  has('name', filter {it.get().length() > 2 && it.get()[2] != '-'}).
  project('Office Name').
    by('name')

... или использовать сопоставление с шаблоном RegEx (что довольно хорошо и просто в Groovy):

g.V().hasLabel('office').
  has('name', filter {it.get() ==~ /.{2}-.*/}).
  project('Office Name').
    by('name')

Основная причина, по которой ваш обход не сработал, заключается в том, что charAt возвращает Character, который затем сравнивается с String -, следовательно, каждое название офиса будет проходить через фильтр neq.

...