Ваш запрос

Привет. Я Микеланджело и являюсь частью команды Grakn Labs. В этой серии постов (Часть 1, Часть 2 и Часть 3) я описал свой путь новичка в программном стеке Grakn, рассказывая о своем опыте работы с ним по мере того, как я учился. В первых трех сообщениях я говорил о том, как структурировать и загружать данные в граф Гракна; в этом посте, который является последним в этой серии, я кратко покажу несколько простых запросов, которые мы можем использовать для изучения созданного нами графа.

Этот пост предполагает некоторые знания, изложенные в предыдущих постах этой серии, поэтому, если вы еще этого не сделали, пожалуйста, прочитайте их. Обещаю, я не убегу.

ПРИМЕЧАНИЕ. Приведенный ниже код был правильным для ранних версий Grakn. С момента публикации мы внесли некоторые изменения в синтаксис Graql по мере развития платформы, и нам еще предстоит обновить эту запись в блоге.

Что в запросе

В Graql (родной язык запросов Grakn), если мы хотим исследовать данные, которые мы вставили в наш график, нам нужен запрос match. Я дам вам краткое введение в синтаксис запроса, но, если вы хотите более подробное описание, я предлагаю вам посетить страницу документации Graql, которую можно найти здесь.

Запрос на соответствие состоит из трех частей: оператора match, оператора select и нескольких разделителей (или модификаторов, если вам так больше нравится). На самом деле необходима только первая часть запроса соответствия: части выбора и разделителя являются необязательными.

Каждую часть нашего запроса можно разделить на шаблоны, которые представляют собой отдельные наборы инструкций, передаваемых в Graql. Каждый шаблон должен заканчиваться точкой с запятой, чтобы Graql мог различать разные шаблоны. Как и следовало ожидать от языка запросов, вы должны иметь возможность использовать переменные. Если вы совершенно не знакомы с этой концепцией, переменные — это в основном сегменты, которые Graql может заполнить результатами запроса, который вы запустили на граф. В Graql перед именами переменных стоит знак доллара.

Время сделать запрос.

А не ___ ли нам?

Смешивать и сочетать

Давайте начнем с чего-то очень простого: представьте, что мы хотим найти всех онкологов в нашем графе. Вот как выглядит наш запрос:

match $x isa oncologist

Хотя запрос вполне естественен для любого, у кого есть хоть какой-то опыт программирования, давайте рассмотрим его подробно.

Мы сообщаем Graql, что он должен просмотреть граф — match— для всего типа онколог —isa oncologist— и сохранить результаты в переменной —$x –.

Если сравнить с запросом на добавление онколога в графу

insert "smithj12" isa oncologist

Вы можете видеть, что запрос insert говорит Graql поместить в граф все, что идет после ключевого слова insert, и назначить его типу «онколог», запросу match, на с другой стороны, сообщает Graql, что нужно получить все, что имеет тип, установленный как «онколог», и сохранить его в переменной, которая идет после ключевого слова match.

Выбор

Если вы действительно попробуете приведенный выше запрос на сопоставление, вы увидите, что возвращенные результаты, вероятно, не совсем то, что мы ищем.

Это происходит потому, что мы попросили Graql найти все экземпляры с типом онколог, и он возвращает их нам со списком их идентификаторов (которые, как вы, наверное, помните, должны быть уникальными). Следующий оператор select для нашего запроса сообщает Graql, чтобы он сосредоточился на тех частях результатов, которые нас особенно интересуют (в данном случае, на ресурсе oncologist_name ресурса онкологсущности, возвращаемые оператором соответствия).

match $x isa oncologist;
select $x(has oncologist_name)

И это (более полезный) результат.

По сути, как только вы нашли сущности и отношения, которые ищете, с помощью оператора match, вы можете выбрать, чтобы Graql отображал только часть информации, полученной с помощью оператора select.

Кроме того, если вы хотите, чтобы Graql показывал вам значения некоторого ресурса для переменных, определенных в части совпадения вашего запроса, вы используете приведенный выше синтаксис. Чтобы проверить ресурс resource_name сопоставленной переменной $variable, вы добавляете

select $variable(has resource_name)

на ваш запрос.

Никаких ограничений, только разделители

Как вы могли заметить, результаты нашего запроса немного запутаны, и немного сложно понять, кто такие онкологи на нашем графике. Было бы неплохо, если бы мы могли получать результаты, скажем, в алфавитном порядке, может быть, только по небольшой группе за раз?

Для этого и нужны разделители; добавим несколько из них в конец нашего запроса:

order by $x(has oncologist_name), offset 15, limit 10

Строка довольно проста для понимания: мы говорим Graql упорядочить наши результаты в соответствии с ресурсом имя-онколога, начать с 15-го результата (именно для этого используется ключевое слово offset ) и показать нам только 10 результатов (это ограничение).

Просто для ясности: разделители смещения и ограничения здесь явно не нужны, но я подумал, что вам может понравиться увидеть что-то большее, чем просто оператор order by :)

Вот наш полный запрос с результатами:

Это немного сложнее

Давайте закончим немного более сложным запросом, связанным с отношениями. Представьте, что вы хотите проверить наиболее плодотворное сотрудничество наших онкологов.

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

match $coauth isa co-authorship;
select $coauth(has number_of_papers)

Проблема с этим подходом заключается в том, что нас на самом деле не интересуют узлы отношений (за исключением значения их ресурсов количества статей): нас интересуют сущности, которые связаны этими узлами (это то, что мы называем узлами). ролевые игроки). Чтобы конкретно запрашивать интересующие нас концепции, мы должны указать имена переменных для каждого ролевого игрока, чтобы ссылаться на них позже. А вообще все достаточно просто

match $coauth (author_X $x, author_Y $y) isa co-authorship;
select $coauth(has number_of_papers), 
       $x(has oncologist_name), 
       $y(has oncologist_name)
order by $coauth(has number_of_papers) desc, limit 10

Опять же, синтаксис для части совпадения в основном такой же, как и при вставке отношений (за исключением того, что мы заменяем ролевых игроков переменными). Затем мы выбираем то, что мы хотим показать. Наконец, мы даем некоторые инструкции о том, как показать результаты.

Это действительно очень просто. И в этом вся прелесть.

Мы подошли к концу моего краткого вводного исследования программного стека Grakn. Я только начал освещать темы построения онтологии, загрузки данных в граф и запроса к ним, но еще многое предстоит изучить.

Надеюсь, я достаточно пробудил ваше любопытство, чтобы пойти скачать и попробовать. Или посмотрите исходный код на GitHub.

Он новый, с открытым исходным кодом и имеет дружелюбное сообщество разработчиков, которое поможет решить проблемы, с которыми вы можете столкнуться.

Быть в курсе,

M.