Выбрать главу

Совет

Так как некоторые части зависят от других и на первом этапе могут быть не очень понятными, то рекомендую прочитать этот раздел от начала до конца, а потом вернуться уже с пониманием некоторых моментов.

Основные принципы

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.