Поиск каруселей в ArangoDB
Про ArangoDB было уже несколько статей на Хабре, так что подробно расписывать, что это такое тут не буду. Скажу только, что это мультимодельная база данных (графовая и документная). Может возникнуть вопрос — «зачем» и для «каких задач» надо использовать ArangoDB по сравнению с популярными и хорошо известными реляционными или документными базами данных. И сегодня мы посмотрим, как с использованием его графовых возможностей можно решать практические задачи.
Интерфейс ArabngoDB
ArangoDB часто используется в Финтехе — наверное, в первую очередь потому, что модель транзакций хорошо ложится на графы — ноды — это счета, транзакции — это ребра. Одна из задач, в которой используется эта база — это AntiFraud — отслеживание мошеннических действий.
Для быстрого освоения ArangoDB можно использовать сервис Arango Oasis — это SaaS решение с развернутой версией ArangoDB. Первые две недели этого сервиса даются бесплатно — этого достаточно чтобы понять базовые возможности базы и принять решение — надо вам это или нет, и если надо — то развертывать бесплатную Community версию самотоятельно (благо это достаточно легко) или дальше использовать сервис ArangoDB Oasis.
В рамках ArangoDB Oasis есть руководство с примерами — в частности как раз по поиску «каруселей». На самом деле, используя функции импорта-экспорта, базу этого руководства можно забрать к себе локально для дальнейшего изучения и тестирования. Что я в свое время и сделал.
Итак — что такое «карусель»? Это термин, обозначающий перевод денег «по кругу». Клиент банка переводит деньгу другому клиенту, тот третьему, этот четвертому, а тот в итоге обрантно первому. Зачем? Много причин, в основном это один из механизмов «отмывания денег» — например если потом к первому клиенту придут и спросят — «а откуда у вас данная сумма» она скажет «дэдушка подарил» «клиент 4 перевел — вот и запись о транзакции» (очень утрировано, на самом деле все сложнее).
С точки зрения графовов — это циклы.
Работа с графом в админке ArangoDB
Запускаем базу ArangoDB (например используя docker), ну или логинимся в базу, запущенную на ArangoDB Oasis. Открываем базу Fraud. В интерфейсе сразу видим, что у нас есть несколько вариантов работы с данными — через коллекции, через view и в виде графов. Нам конечно интересней последний вариант — открываем базу как граф.
При первом открытии нам откроется какая-то часть графа (потому что база может быть очень большой, и построение графа может занять много времени)
отображение графа в админке ArangoDB
но справа-сверху есть пункт меню
который позволяет открыть всю базу.
Еще один удобный момент — права же есть меню управления отображения графа — там можно указать, например, текст, который выводится для ребер (в нашем случае это transaction_amt — размер денежного перевода)
Вот, теперь мы видим счета и переводы между ними.
Как видно, из коробки ArangoDB сразу дает достаточно удобный интерфейс для работы с графами, но, понятно, что «глазками» мы сможем увидеть циклы только в небольших графах. Ну и, нам все-таки надо иметь возможность делать это в автоматическим режиме. Тут на помощь к нам приходит язык запросов — AQL.
Итак, следующий запрос позволяет найти все циклы в графе
WITH transaction, account
FOR suspicous_account IN account
FOR acct, tx, path IN 5…10 OUTBOUND suspicous_account._id GRAPH 'fraud-detection'
PRUNE tx._to == suspicous_account._id
FILTER tx._to == suspicous_account._id
RETURN path
Данный запрос перебирает все ноды (account) и ребра между ними (transaction) и находит все пути, где мы возвращаемся к исходному account-у (suspicous_account._id), причем в нашем случае мы рассматриваем только циклы с длиной от 5 до 10 ребер.
Как видно, одним, достаточно простым запросом, мы можем решить задачу, которая в обычных реляционных базах решалась бы значительно сложнее. При этом ArangoDB дает достаточно удобный интерфейс администратора для работы и с графами, и с запросами. Тот же запрос можно легко выполнить в админке, причем просмотреть результат и в виде графа
результат запроса в виде графа
так и в виде JSON
Чем мне понравилась база, это в первую очередь удобством и наглядностью именно работы с графами. Конечно ArangoDB позиционирует себя как multi-model база, но мне кажется ее возможности в основном сконцентрированы вокруг именно графов. Надеюсь, для всех, кто еще не был знаком с ArangoDB станет чуть понятней, где ее можно использовать.