Совет
Так как некоторые части зависят от других и на первом этапе могут быть не очень понятными, то рекомендую прочитать этот раздел от начала до конца, а потом вернуться уже с пониманием некоторых моментов.
Основные принципы
Cypher представляет собой удобочитаемый и мощный декларативный язык запросов, и главное – понять логику их составления. У нас есть начальный узел и конечный, которые соединены между собой связью. Этот граф является шаблоном, по которому будет выполняться выборка из базы данных.
Рис. 3.1. Простой граф
Каждый узел в neo4j обладает определенными параметрами:
● Идентификатор (ID) – это обязательный параметр порядкового номера узла.
● Метка (Label) – необязательный, но важный параметр, позволяет объединять узлы по определенному признаку. Например, User или Computer.
● Свойства (Properties) – необязательный параметр, например objectid или distingueshedname. Данный параметр придает каждому узлу индивидуальность. На основании свойств можно сужать выборку данных или получать узлы, имеющие общие свойства.
Связь также имеет свои параметры:
● Идентификатор (ID) – обязательный параметр порядкового номера связи.
● Название (Type) – не обязательный, но важный параметр, позволяет объединять узлы по определенному признаку. Например, MemberOf или GenericAll.
● Свойства (Properties) – необязательный параметр. Данный параметр придает каждой связи индивидуальность. В BloodHound связи обладают разными свойствами, например isacl и isinherited. В дальнейшем мы тоже будем добавлять различные свойства связям.
Общий вид запроса выглядит следующим образом:
Рис. 3.2. Общий вид запроса
В качестве операторов могут выступать:
● CREATE и MERGE – создание нового элемента;
● MATCH – выполнение выборки;
● RETURN – возврат результата (может быть как в начале, так и в конце запроса);
● DELETE – удаление узла или связи (может быть как в начале, так и в конце запроса).
Другие операторы:
● SET и REMOVE – добавление или удаление свойств;
● WHERE – добавление условия к шаблону.
Внимание
Необходимо запомнить, что Cypher чувствителен к регистру. Это важно для названий меток и связей, названий и значений свойств, но операторов это правило не касается.
Возвращаясь к рисунку 3.2, получаем следующий формат: на первом месте идет оператор MATCH, MERGE и др., следующим – начальный узел, затем название связи (опционально), конечный узел, условия (опционально), и завершается запрос оператором RETURN. В некоторых случаях оператор RETURN может опускаться, например при добавлении свойства узлу, или заменяться оператором WITH, если необходимо изменить область видимости.
Стрелки определяют направление и могут быть направлены как слева направо, так и в обратную сторону. Изменение направления стрелок может быть полезно при составлении запроса. Например, мы хотим узнать, на каких компьютерах у пользователя есть сессия. По правилам BloodHound связь HasSession устанавливается от компьютера к пользователю.
Рис. 3.3. Стрелка слева направо
Этот запрос можно прочитать как «есть ли на компьютерах сессия пользователя User», в нашем случае вопрос был задан как «на каких компьютерах есть сессия пользователя User», поэтому изменим направление и получим следующий шаблон.
Рис. 3.4. Стрелка справа налево
Два шаблона абсолютно идентичны, разница только в интерпретации вопроса и удобстве чтения.
Внимание
В Cypher нет двунаправленных стрелок, но могут быть запросы, где направление не указано.
В браузере neo4j есть справочник по командам и операторам. Получить справку по операторам можно с помощью команды :help:
:help <Оператор>
:help MATCH
Рис. 3.5. Справка по оператору MATCH
Оператор MATCH
Для поиска по базе в neo4j используется оператор MATCH, следом идет шаблон поиска, условия выборки с помощью оператора WHERE, и завершается запрос выводом результатов RETURN.