Operators

String-Specific Comparison Operators

Data Preparation

SELECT * FROM cypher('graph_name', $$
CREATE (:Person {name: 'John'}),
       (:Person {name: 'Jeff'}),
       (:Person {name: 'Joan'}),
       (:Person {name: 'Bill'})
$$) AS (result agtype);

STARTS WITH

Performs a case-sensitive prefix search on strings.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name STARTS WITH "J"
        RETURN v.name
$$) AS (names agtype);

Result

names
"John"

Специфические для строк операторы сравнения

Подготовка данных

SELECT * FROM cypher('graph_name', $$
CREATE (:Person {name: 'John'}),
       (:Person {name: 'Jeff'}),
       (:Person {name: 'Joan'}),
       (:Person {name: 'Bill'})
$$) AS (result agtype);

STARTS WITH

Выполняет регистрозависимый поиск по префиксу строки.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name STARTS WITH "J"
        RETURN v.name
$$) AS (names agtype);

Результат

names
"John"
"Jeff"
"Joan"
3 строки

CONTAINS

Выполняет регистрозависимый поиск подстроки в строке.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name CONTAINS "o"
        RETURN v.name
$$) AS (names agtype);

Результат

names
"John"
"Joan"
2 строки

ENDS WITH

Выполняет регистрозависимый поиск по суффиксу строки.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name ENDS WITH "n"
        RETURN v.name
$$) AS (names agtype);

Результат

names
"John"
"Joan"
2 строки

Регулярные выражения

AGE поддерживает регулярные выражения POSIX с использованием оператора =~, как описано в документации PostgreSQL по регулярным выражениям POSIX. По умолчанию оператор =~ регистрозависим.

Точное совпадение строки без спецсимволов

Если в шаблоне отсутствуют специальные символы регулярных выражений, оператор =~ ведёт себя идентично оператору =.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ 'John'
        RETURN v.name
$$) AS (names agtype);

Результат

names
"John"
1 строка

Регистронезависимый поиск

Добавьте префикс (?i) к шаблону для выполнения регистронезависимого поиска.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ '(?i)JoHn'
        RETURN v.name
$$) AS (names agtype);

Результат

names
"John"
1 строка

Символ-шаблон .

Символ . соответствует любому одиночному символу.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ 'Jo.n'
        RETURN v.name
$$) AS (names agtype);

Результат

names
"John"
"Joan"
2 строки

Квантификатор *

Квантификатор * соответствует нулю или более вхождений предшествующего символа.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ 'Johz*n'
        RETURN v.name
$$) AS (names agtype);

Результат

names
"John"
1 строка

Квантификатор +

Квантификатор + соответствует одному или более вхождениям предшествующего символа.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ 'Bil+'
        RETURN v.name
$$) AS (names agtype);

Результат

names
"Bill"
1 строка

Комбинация . и *

Символы . и * можно комбинировать для соответствия остатку строки.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ 'J.*'
        RETURN v.name
$$) AS (names agtype);

Результат

names
"John"
"Jeff"
"Joan"
3 строки

Приоритет операторов

В следующей таблице приведён приоритет операторов в AGE от самого высокого до самого низкого:

Приоритет Оператор Описание
1 . Доступ к свойству
2 [] Индексация карт и списков
() Вызов функции
3 STARTS WITH Регистрозависимое сравнение по префиксу строки
ENDS WITH Регистрозависимое сравнение по суффиксу строки
CONTAINS Регистрозависимое сравнение по подстроке строки
=~ Сравнение с регулярным выражением
4 - Унарный минус
5 IN Проверка наличия элемента в списке
IS NULL Проверка значения на NULL
IS NOT NULL Проверка значения на ненулевое значение
6 ^ Возведение в степень
7 * / % Умножение, деление, остаток от деления
8 + - Сложение и вычитание
9 = <> Равенство и неравенство ()
< <= Меньше и меньше или равно
> >= Больше и больше или равно
10 NOT Логическое отрицание
11 AND Логическая конъюнкция
12 OR Логическая дизъюнкция
"Jeff"
"Joan"
3 rows

CONTAINS

Performs a case-sensitive substring search on strings.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name CONTAINS "o"
        RETURN v.name
$$) AS (names agtype);

Result

names
"John"
"Joan"
2 rows

ENDS WITH

Performs a case-sensitive suffix search on strings.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name ENDS WITH "n"
        RETURN v.name
$$) AS (names agtype);

Result

names
"John"
"Joan"
2 rows

Regular Expressions

AGE supports POSIX regular expressions using the =~ operator, as documented in the PostgreSQL POSIX Regular Expression documentation. By default, =~ is case-sensitive.

Basic Exact String Match

When no special regex characters are present, =~ behaves identically to =.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ 'John'
        RETURN v.name
$$) AS (names agtype);

Result

names
"John"
1 row

Case-Insensitive Search

Prepend (?i) to the pattern to perform a case-insensitive match.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ '(?i)JoHn'
        RETURN v.name
$$) AS (names agtype);

Result

names
"John"
1 row

. Wildcard

The . matches any single character.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ 'Jo.n'
        RETURN v.name
$$) AS (names agtype);

Result

names
"John"
"Joan"
2 rows

* Quantifier

The * quantifier matches zero or more occurrences of the preceding character.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ 'Johz*n'
        RETURN v.name
$$) AS (names agtype);

Result

names
"John"
1 row

+ Quantifier

The + quantifier matches one or more occurrences of the preceding character.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ 'Bil+'
        RETURN v.name
$$) AS (names agtype);

Result

names
"Bill"
1 row

Combining . and *

The . and * can be combined to match the remainder of a string.

SELECT * FROM cypher('graph_name', $$
        MATCH (v:Person)
        WHERE v.name =~ 'J.*'
        RETURN v.name
$$) AS (names agtype);

Result

names
"John"
"Jeff"
"Joan"
3 rows

Operator Precedence

The following table lists operator precedence in AGE, from highest to lowest:

Precedence Operator Description
1 . Property access
2 [] Map and list subscripting
() Function invocation
3 STARTS WITH Case-sensitive string prefix match
ENDS WITH Case-sensitive string suffix match
CONTAINS Case-sensitive string substring match
=~ Regular expression match
4 - Unary minus
5 IN Checks whether an element exists in a list
IS NULL Tests whether a value is NULL
IS NOT NULL Tests whether a value is not NULL
6 ^ Exponentiation
7 * / % Multiplication, division, modulo
8 + - Addition and subtraction
9 = <> Equality and inequality ()
< <= Less-than and less-than-or-equal
> >= Greater-than and greater-than-or-equal
10 NOT Logical negation
11 AND Logical conjunction
12 OR Logical disjunction