Вы можете использовать filter
с небольшим количеством регулярных выражений:
gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.V.filter{it.name.matches(".*ark.*")}.name
==>marko
или с большим количеством синтаксического сахара Groovy:
gremlin> g.V.filter{it.name==~/.*ark.*/}.name
==>marko
Приведенный выше ответ (и принятый ответ) относится к TinkerPop 2.x, а следующее относится к 3.x, которая в настоящее время широко используется:
В настоящее время TinkerPop 3.x не поддерживает регулярное выражение как часть основного языка Gremlin, однако регулярное выражение может быть доступно для конкретной используемой вами системы графов (DSE Graph, JanusGraph и т. д.), и эти графы будут предоставлять свои собственные библиотеки для расширения. Gremlin с предикатом регулярного выражения (и/или другими параметрами поиска, такими как нечеткие и токенизации). Обратитесь к документации вашего графа, чтобы узнать, что доступно.
Расширение для конкретного графа будет наиболее эффективным способом выполнения поиска на основе регулярных выражений, поскольку оно будет полагаться на внутренние функции индексации, которые оптимизированы для обработки таких вещей, но существуют методы для выполнения поиска регулярных выражений в памяти с помощью замыканий, которые аналогичны к ответу TinkerPop 2.x выше.
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().filter{it.get().value('name').matches(".*ark.*")}
==>v[1]
Поскольку мы используем замыкание, мы можем поместить в эту функцию любой код Java (в данном случае Groovy). Обратите внимание, что для it.get().value('name')
it
— это нотация Groovy, которая обращается к текущему Traverser
в потоке V()
и содержит объект Vertex
, который извлекается через get()
.
Этот подход будет работать везде, где допустимо замыкание, но он работает не везде, так как не все графы его поддерживают. Если вы не используете JVM (например, python), то вы, вероятно, отправляете скрипты Gremlin на сервер или используете запросы на основе байт-кода. Если вы отправляете скрипты, вы сможете отправить запрос, как показано выше. Если вы используете байт-код, вы должны явно объявить лямбду как строку в вашем обходе, как показано здесь для Python.
В конечном счете, использование замыканий/лямбда-выражений не рекомендуется, поскольку они снижают переносимость вашего кода, обнажают дыры в безопасности и т. д. Если вам нужны регулярные выражения, лучше всего использовать граф, который имеет встроенную поддержку для них, и библиотеку кода, содержащую настраиваемые предикаты, специфичные для вашего языка программирования.
person
stephen mallette
schedule
30.09.2013