GREL
| Краткое описание языка | GREL (Google/General Refine Expression Language) — это выражения, которые используются в OpenRefine для фильтрации, преобразования и агрегирования данных в ячейках и столбцах. По смыслу GREL для OpenRefine играет ту же роль, что формулы для Excel или SQL‑запросы для баз данных: позволяет выполнять более сложные операции, чем доступно через стандартные пункты меню. |
|---|---|
| Компетенции в каких сферах формирует | |
| Парадигмы программирования | |
| Возрастная категория | |
| Назначение языка (Общее / Учебное) | |
| Visual_Text_Blocks | |
| Измерение (2D/3D/Tangible) | |
| Область знаний | |
| Открытость продукта | Открытый |
| Address | |
| Предки (Ancestors) | JavaScript |
| Потомки (Descendants) | |
| Активность в данный момент | Project is active |
| Доступны ремиксы? | Нет |
| Год создания | |
| Создатели | |
| Поясняющее видео | |
| Используется для создания мобильных приложений? | Нет |
- GREL упоминается в свойствах следующих страниц
GREL (Google/General Refine Expression Language) — это выражения, которые используются в OpenRefine для фильтрации, преобразования и агрегирования данных в ячейках и столбцах. По смыслу GREL для OpenRefine играет ту же роль, что формулы для Excel или SQL‑запросы для баз данных: позволяет выполнять более сложные операции, чем доступно через стандартные пункты меню.
GREL по синтаксису близок к JavaScript и работает с теми же типами данных, что и таблица OpenRefine: строки, числа, даты, массивы, [[JSON[[‑объекты. Основная переменная — `value` (значение текущей ячейки), но в выражениях можно обращаться и к другим столбцам через `cells["ColumnName"].value`.
В OpenRefine GREL можно использовать в четырёх основных контекстах:
- создание Custom text / numeric facet (собственные фасеты на основе выражения);
- Transform → Edit cells → Transform… (преобразование значений в столбце);
- Edit column → Add column based on this column… (создание нового столбца на основе выражения);
- некоторые расширенные операции (например, при Fetch URL) также используют GREL как язык выражений.
- GREL полезен для
- подготовки временных рядов (извлечение года/месяца из даты, агрегация по дате);
- конструирования панели `объект × время` (например, `user, board_id, year`);
- очистки текстовых категорий, работы с JSON‑массивами и вложенными объектами;
- вычисления агрегатов (сумма, количество) по группе строк.
Таблица подсказок по GREL в OpenRefine
| Контекст: что хотим сделать | Где и в каком режиме | Пример Expression (GREL) |
|---|---|---|
| Преобразовать текстовую дату в тип Date (для временных рядов) | Меню столбца с датой → Edit cells → Common transforms → To date (выбор GREL не нужен, но важно понимать, что OpenRefine внутри применяет преобразование типа) [datacarpentry.github](https://datacarpentry.github.io/openrefine-socialsci/02-working-with-openrefine.html) | (автоматическое преобразование ISO‑строки, например `"2022-07-06T06:37:06Z"`)
— отдельное выражение не вводим |
| Вытащить год из даты в новый столбец (переменная времени \(t\)) | Меню столбца с датой → Edit column → Add column based on this column… → язык: GREL [libjohn.github](https://libjohn.github.io/openrefine/grel.html) | value.toDate().toString("yyyy")
Создаёт столбец `year` с годом, используемым как временной индекс |
| Построить строковое представление «год‑месяц» (для месячных рядов) | Меню столбца с датой → Add column based on this column… | value.toDate().toString("yyyy-MM")
Например, "2024-03" |
| Очистить пробелы в начале/конце и узнать длину строки | Меню столбца с текстом → Edit cells → Transform… | value.trim().length()
Полезно для диагностики «грязных» строк, где есть лишние пробелы [guides.library.illinois](https://guides.library.illinois.edu/openrefine/grel) |
| Заменить подстроку (очистка категорий) | Меню столбца → Edit cells → Transform… | value.replace("old","new")
Например, объединить разные варианты написания категорий [library.vassar](https://library.vassar.edu/openrefine/common_transformations) |
| Объединить значения двух столбцов (конструирование идентификатора панели) | Меню любого из столбцов → Edit column → Add column based on this column… | cells["user"].value + "_" + cells["board_id"].value
Создаёт composite key вида "user_board", удобный для группировок |
| Превратить JSON‑массив в строку с разделителем (подготовка к Split multi-valued cells) | Меню столбца с массивом (например, idBoards) → Edit cells → Transform… [programminghistorian](https://programminghistorian.org/en/lessons/fetch-and-parse-data-with-openrefine) | value.join("|")
После этого используем Edit cells → Split multi-valued cells… с разделителем |
| Посчитать количество строк с той же парой user–board (агрегация по ключу) | В режиме Rows, любой столбец → Edit column → Add column based on this column… [openup.org](https://openup.org.za/blog/openrefine-aggerate-tutorial) | length(
filter(
rows,
r,
r.cells["user"].value == cells["user"].value &&
r.cells["board_id"].value == cells["board_id"].value
)
)
Даёт частоту пары (аналог COUNT(*) GROUP BY user, board_id) |
| Посчитать сумму числового показателя по user–board (например, events) | Аналогично: Add column based on this column…, предварительно столбец events → To number [openup.org](https://openup.org.za/blog/openrefine-aggerate-tutorial) | sum(
forEach(
filter(
rows,
r,
r.cells["user"].value == cells["user"].value &&
r.cells["board_id"].value == cells["board_id"].value
),
r, r.cells["events"].value
)
)
Аналог SUM(events) GROUP BY user, board_id |
| Фильтровать строки, где значение содержит подстроку (кастомный facet) | Меню столбца → Facet → Custom text facet… | value.contains("wiki_edit")
Возвращает true/false для фасета, удобно для выделения определённых типов событий [guides.lib.lsu](https://guides.lib.lsu.edu/c.php?g=1469606&p=10994060) |
