GRAKN.AI

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:11, 1 марта 2019.
GRAKN.AI
Grakn-logo.png
Создатели: Haikal Pribadi
Разработчики: Grakn Labs
Выпущена: 2008
Написана на: Java, Python, Node.js
Операционная система: Linux, Mac OS X
Платформа: x32-64
Локализация: Английский
Тип ПО: NoSQL база данных
Лицензия: BSD лицензия
Веб-сайт grakn.ai

GRAKN.AI является дедуктивной базой данных в виде графа знаний, который использует машинное мышление для упрощения задач обработки данных для приложений ИИ (приложения, использующие искусственный интеллект)[Источник 1].

Архитектура

GRAKN.AI состоит из двух частей: Grakn (хранилище) и Graql (язык).

  • Grakn - это база данных в виде графа знаний, которая использует интуитивно понятную онтологию для моделирования чрезвычайно сложных наборов данных. Он хранит данные таким способом, который позволяет машинам понимать значение информации в полном контексте их отношений. Следовательно, Grakn позволяет компьютерам обрабатывать сложную информацию более разумно с меньшим вмешательством человека.
  • Graql - это декларативный, ориентированный на граф знаний язык запросов, который использует машинное мышление для получения явно хранимых и неявно полученных знаний из Grakn. На рисунке 1 Вы можете наглядно видеть устройство Grakn и Graql и их взаимодействие друг с другом[Источник 2]:
Рисунок 1 – Внутреннее устройство Grakn и Graql и их взаимодействие

Особенности

GRAKN.AI - это интуитивная и выразительная схема данных, с конструкциями для определения иерархий, гипер-сущностей, гипер-отношений и правил, для создания богатых моделей знаний. Имеет интеллектуальный язык, выполняющий логический вывод типов данных, отношений, атрибутов и сложных шаблонов во время выполнения, а также распределенных и сохраненных данных. Располагает готовыми алгоритмами распределенной аналитики (Pregel и MapReduce), доступными через язык с помощью простых запросов. Сильная абстракция над низкоуровневыми шаблонами, позволяющая использовать более простые выражения сложных конструкций, в то время как система вычисляет наиболее оптимальное выполнение запроса.

Сравнение с иными популярными решениями[Источник 3]

Сравним GRAKN.AI с решением Neo4j (базой данных с открытым исходным кодом):

Сравнение решений GRAKN.AI и Neo4j
GRAKN.AI Neo4j
Первичная модель базы данных Graph DBMS, Relational DBMS Graph DBMS
Вторичные модели базы данных хранилище ключ-значение не указана
Ранг баз данных 280 22
Язык реализации Java Java, Scala
Операционная система Linux, OS X, Unix, Windows Linux, OS X, Solaris, Windows
Схема данных есть schema-free и schema-optional
Предопределенные типы данных, такие как float или date есть есть
Поддержка XML нет не указано
APIs и другие методы доступа Java API, Proprietary protocol, RESTful HTTP API Cypher query language, Java API, Neo4j-OGM, RESTful HTTP API, Spring Data Neo4j, TinkerPop 3
Поддерживаемые языки программирования Groovy, Java, Scala, языки на базе JVM .Net, Clojure, Elixir, Go, Groovy, Haskell, Java, JavaScript, Perl, PHP, Python, Ruby, Scala
Сохраняемые процедуры нет есть
Триггеры нет есть
Методы хранения различных данных на разных узлах sharding (при помощи Cassandra) нет
Методы избыточного хранения данных на нескольких узлах Master-master (при помощи Cassandra) Causal Clustering при помощи протокола Raft (доступно только для Enterprise Version)
MapReduce есть (используя Apache Kafka и Apache Zookeeper) нет
Методы обеспечения согласованности в распределенной системе возможная согласованность, немедленная согласованность причинная и возможная согласованность, настраиваемая в настройке причинного кластера, немедленная согласованность в автономном режиме
Возможности памяти есть не указано
Контроль доступа есть пользователи, роли и разрешения, подключаемая аутентификация с поддерживаемыми стандартами (LDAP, Active Directory, Kerberos)

Установка

Для начала необходимо выполнить бесплатную загрузку Grakn Core 1.4[1] c официального сайта GRAKN.AI с указанием Вашей операционной системы и затем просто разархивировать архив в удобное для Вас место. Стоит предупредить, что GRAKN.AI необходима среда Java 8 (Standard Edition) с набором $JAVA_HOME соответственно. Её можно установить при помощи данного руководства. Далее предстоит работа с терминалом вашей операционной системы(вся последующая работа была произведена на операционной системе Linux). Введите следующие команды для запуска Grakn:

cd [your Grakn install directory]
./grakn server start

Этот код также запустит:

  • Экземпляр системы Cassandra, который служит поддерживаемой базовой программой для Grakn.
  • Grakn Engine, обеспечивающий пакетную загрузку HTTP-сервера, мониторинг и панель мониторинга браузера.
  • Apache Kafka.
  • Apache Zookeeper.

На рисунке 2 показан пример выполнения этой команды в терминале.

Рисунок 2 – Запуск сервера Grakn

Полезные команды

  • Чтобы запустить Grakn, запустите
    grakn server start
    .
  • Чтобы остановить Grakn, запустите
    grakn servers stop
    .
  • Чтобы удалить все графы из Grakn, запустите
    grakn server clean
    .

Тестирование оболочки Graql

Теперь, когда Вы успешно запустили Grakn, можно протестировать его возможности. Для тестов отлично подойдёт тестовый граф, который бесплатно даётся нам в комплект к Grakn Core 1.4. Для этого необходимо ввести следующую команду в терминале, которая загрузит тестовый граф знаний:

./graql console -f ./examples/basic-genealogy.gql

Выше мы вызываем оболочку Graql и передаем флаг -f, чтобы указать файл для загрузки в граф знаний. Это запускает оболочку Graql в неинтерактивном режиме, загружает указанный файл и завершает работу после завершения загрузки. На рисунке 3 показан пример выполнения этой команды в терминале.

Рисунок 3 – Загрузка тестового графа знаний

Теперь запустите оболочку Graql в её интерактивном (REPL) режиме при помощи следующей команды:

./graql console

На рисунке 4 показан пример выполнения этой команды в терминале.

Рисунок 4 – Запуск оболочки Grakql в её интерактивном режиме

Вы увидите консоль >>>. Теперь введите следующую команду, чтобы убедиться, что всё работает:

match $x isa person, has identifier $n; get;

На рисунке 5 показан пример выполнения этой команды в терминале.

Рисунок 5 – Отображение графа в интерактивном режиме

Схема

Схема представляет собой формальную спецификацию всех соответствующих понятий и их содержательных ассоциаций в данной области применения. Это позволяет классифицировать объекты и отношения по отдельным типам, а также выражать общие свойства этих типов. Для целей данного руководства схема описывает элементы данных и определяет, как они связаны друг с другом. Для выполнения полезных запросов к данным необходимо иметь базовое представление о схеме, поэтому давайте рассмотрим ее фрагменты, важные для первоначальной демонстрации:

define

# Entities

person sub entity
  plays parent
  plays child
  plays spouse1
  plays spouse2

  has identifier
  has firstname
  has surname
  has middlename
  has picture
  has age
  has birth-date
  has death-date
  has gender;

# Attributes

identifier sub attribute datatype string;
name sub attribute datatype string;
firstname sub name datatype string;
surname sub name datatype string;
middlename sub name datatype string;
picture sub attribute datatype string;
age sub attribute datatype long;
event-date sub attribute datatype date;
birth-date sub event-date datatype date;
death-date sub event-date datatype date;
gender sub attribute datatype string;

# Roles and Relations

marriage sub relationship
  relates spouse1
  relates spouse2
  has picture;

parentship sub relationship
  relates parent
  relates child;

Есть несколько вещей, которые мы можем сказать о схеме, показанной выше:

  • здесь есть объект, person, который представляет человека в семье, генеалогические данные которого мы изучаем
  • объект person имеет ряд атрибутов для описания их аспектов, таких как имя, возраст, даты рождения и смерти, пол и URL-адрес их изображения (если таковое существует). Эти атрибуты выражаются в виде переменных типа string, long или date. Grakn также поддерживает double и boolean
  • есть два типа отношений, которые person может иметь: marriage (состоять в браке) и parentship (быть родителем)
  • человек может играть разные роли в этих отношениях, как супруг (spouse1 или spouse2 (мы не назначаем их по полу) и как parent (родитель) или child (ребёнок) (опять же, мы не назначаем пол)
  • у брачных отношений marriage есть атрибут, который является URL-адресом свадебной фотографии, если она существует.

Данные

Данные довольно громоздкие, поэтому мы не будем все здесь воспроизводить. Это лишь часть нашего проекта генеалогической базы знаний. Ниже приведен фрагмент некоторых данных, добавленных в график при загрузке файла basic-genealogy.gql:

$57472 isa person has firstname "Mary" has identifier "Mary Guthrie" has surname "Guthrie" has gender "female";
$86144 has surname "Dudley" isa person has identifier "Susan Josephine Dudley" has gender "female" has firstname "Susan" has middlename "Josephine";
$118912 has age 74 isa person has firstname "Margaret" has surname "Newman" has gender "female" has identifier "Margaret Newman";
...
$8304 (parent: $57472, child: $41324624) isa parentship;
$24816 (parent: $81976, child: $41096) isa parentship;
$37104 isa parentship (parent: $49344, child: $41127960);
...
$122884216 (spouse2: $57472, spouse1: $41406488) isa marriage;
$40972456 (spouse2: $40964120, spouse1: $8248) isa marriage;
$81940536 (spouse2: $233568, spouse1: $41361488) has picture "http:\/\/1.bp.blogspot.com\/-Ty9Ox8v7LUw\/VKoGzIlsMII\/AAAAAAAAAZw\/UtkUvrujvBQ\/s1600\/johnandmary.jpg" isa marriage;

Не беспокойтесь о таких цифрах, как $ 57472. Это переменные в Graql, и у них случайно назначенные номера, чтобы сделать их уникальными. Каждое заявление-это добавление либо person,либо parentship или marriage в граф знаний. Мы покажем, как добавить больше данных в разделе расширение графа знаний. Для этого нам придётся запросить граф в оболочке Graql.

Запрос графа знаний

Запустив движок Grakn и оболочку Graql в интерактивном режиме, мы готовы сделать несколько интересующих нас запросов. Для начала сделаем парочку get запросов (запросов на получение информации). Найдём всех людей в графе знаний и перечислим их идентификаторы identifier (строки, представляющие их полные ФИО):

match $p isa person, has identifier $i; get;

На рисунке 6 показан пример выполнения этой команды в терминале.

Рисунок 6 – Идентификаторы людей в тестовом графе знаний

Теперь найдём людей, состоящих в браке:

match (spouse1: $x, spouse2: $y) isa marriage; $x has identifier $xi; $y has identifier $yi; get;

На рисунке 7 показан пример выполнения этой команды в терминале.

Рисунок 7 – Люди, состоящие в браке

Отобразим список отношений родитель-ребёнок с именами каждого человека:

match (parent: $p, child: $c) isa parentship; $p has identifier $pi; $c has identifier $ci; get;

На рисунке 8 показан пример выполнения этой команды в терминале.

Рисунок 8 – Список отношений родитель-ребёнок

Теперь найдём всех людей с именем "Elizabeth":

match $x isa person, has identifier $y; $y contains "Elizabeth"; get;

На рисунке 9 показан пример выполнения этой команды в терминале.

Рисунок 9 – Список людей с именем "Elizabeth"

Расширение графа знаний

А теперь попрактикуемся в добавлении и удалении информации из графа знаний. Добавим нового человека (имя: Titus, фамилия: Groan, пол: male (мужской)) в наш тестовый граф при помощи команды, приведённой ниже:

insert $g isa person has firstname "Titus" has identifier "Titus Groan" has surname "Groan" has gender "male";
commit

На рисунке 10 показан пример выполнения этих команд в терминале.

Рисунок 10 – Добавление нового человека в граф знаний

Важное замечание: ничто из того, что вы ввели в оболочку Graql, еще не было зафиксировано в графе знаний и не было подтверждено. Для сохранения внесенных Вами изменений необходимо ввести commit в консоли. Чтобы найти добавленного нами человека, введём следующую команду:

match $x isa person has identifier "Titus Groan"; get;

На рисунке 11 показан пример выполнения этой команды в терминале.

Рисунок 11 – id нового человека в графе знаний

Теперь добавим дополнительную информацию (фамилия: Phoenix, дата рождения: 1902.01.01, дата смерти: 1952.01.01, возраст: 50 лет) о новом человеке:

match $p has identifier "Titus Groan"; insert $p has middlename "Phoenix";
match $p has identifier "Titus Groan"; insert $p has birth-date 1902-01-01;
match $p has identifier "Titus Groan"; insert $p has death-date 1952-01-01;
match $p has identifier "Titus Groan"; insert $p has age 50;
commit

На рисунке 12 показан пример выполнения этих команд в терминале.

Рисунок 12 – Добавление новой информации о человеке в граф знаний

А теперь удалим созданного нами человека из графа знаний:

match $x isa person has identifier "Titus Groan"; delete $x;
commit

На рисунке 13 показан пример выполнения этих команд в терминале.

Рисунок 13 – Удаление нового человека из графа знаний

Использование визуализатора Grakn

Вы можете открыть визуализатор Grakn, перейдя на сайт "localhost: 4567" в веб-браузере. Визуализатор позволяет выполнять запросы или просто просматривать схему в графе знаний. На рисунке 14 показан базовый запрос идентификаторов людей в графе знаний, введенный в форму в верхней части главной страницы и визуализированный нажатием" >”:

Рисунок 14 – Запрос идентификаторов людей в графе знаний

Вы можете увеличивать и уменьшать дисплей, а также двигать вершины графа для улучшения видимости при помощи мыши.

Использование вывода

Теперь перейдем к обсуждению использования GRAKN.AI для вывода новой информации о наборе данных. До сих пор мы имели дело только с человеком, не определяя его пол, а родительские отношения были просто между родителем и ребёнком. Разработчики не стали напрямую добавлять информацию о половой принадлежности родителя и ребенка в каждые отношения - это могут быть отец и сын, отец и дочь, мать и сын или мать и дочь. Однако у объекта person есть атрибут gender, и мы можем использовать Grakn для получения дополнительных сведений о каждой связи с помощью этого свойства. Схема учитывает более конкретные роли матери, отца, дочери и сына:

define

person
  plays son
  plays daughter
  plays mother
  plays father;

parentship sub relationship
  relates mother
  relates father
  relates son
  relates daughter;

mother sub parent;
father sub parent;
son sub child;
daughter sub child;

В basic-genealogy.gql включён набор правил Graql, показывающий как Grakn отмечать каждые родительские отношения:

define

genderizeParentships1 sub rule
when
{(parent: $p, child: $c) isa parentship;
$p has gender "male";
$c has gender "male";
}
then
{(father: $p, son: $c) isa parentship;};

genderizeParentships2 sub rule
when
{(parent: $p, child: $c) isa parentship;
$p has gender "male";
$c has gender "female";
}
then
{(father: $p, daughter: $c) isa parentship;};

genderizeParentships3 sub rule
when
{(parent: $p, child: $c) isa parentship;
$p has gender "female";
$c has gender "male";
}
then
{(mother: $p, son: $c) isa parentship;};

genderizeParentships4 sub rule
when
{(parent: $p, child: $c) isa parentship;
$p has gender "female";
$c has gender "female";
}
then
{(mother: $p, daughter: $c) isa parentship;};

Если вы не знакомы с синтаксисом правил, то не стоит беспокоиться об этом. Достаточно знать, что для каждого отношения parentship Graql проверяет, может ли модель в первом блоке (when) быть проверена, и, если возможно, делает вывод, что утверждение во втором блоке (then) истинно, поэтому выставляет отношение между гендерными родителями и детьми. Теперь попробуем сделать запрос get, чтобы найти отношения родительства между отцами и сыновьями в оболочке Graql:

match (father: $p, son: $c) isa parentship; $p has identifier $n1; $c has identifier $n2; get;

На рисунке 15 показан пример выполнения этой команды в терминале.

Рисунок 15 – Отношение родительства в графе знаний

На рисунке 16 показано как выглядит данный запрос в визуализаторе Grakn:

Рисунок 16 – Отношение родительства в графе знаний в визуализаторе Grakn

Использование аналитики

Обратившись к аналитике Graql, можно проиллюстрировать некоторые базовые запросы в визуализаторе Grakn

  • Статистика

Среднюю продолжительность жизни можно вычислить с помощью compute mean следующим образом, введя его в форму запроса визуализатора:

compute mean of age, in person;

На рисунке 17 показан пример выполнения этой команды в терминале.

Рисунок 17 – Средняя продолжительность жизни

Другие статистические значения могут быть вычислены аналогичным образом, например, значения для count:

compute count in person;

На рисунке 18 показан пример выполнения этой команды в терминале.

Рисунок 18 – Количество людей в графе

Видео

Примечания

  1. Изучение продукта GRAKN.AI проходило при помощи версии ядра Grakn Core 1.4. Стоит воздержаться от использования более поздних версий в виду их неэффективности и недоработанности.

Источники

  1. GRAKN.AI // The Knowledge Graph. [2008-2019]. Дата обновления: 16.08.2018. URL: https://grakn.ai (дата обращения: 01.10.2018)
  2. Get Started With GRAKN.AI // DZone Big Data. [1998-2019]. Дата обновления: 10.08.2017. URL: https://dzone.com/articles/get-started-with-graknai (дата обращения: 01.10.2018)
  3. GRAKN.AI vs. Neo4j Comparison // DB-Engines - Knowledge Base of Relational and NoSQL Database Management Systems. [2012-2019]. Дата обновления: 07.05.2018. URL: https://db-engines.com/en/system/GRAKN.AI%3BNeo4j (дата обращения: 24.01.2019)