Быстрый поиск пространств имён

Василий Фаронов

9 июня 2010 года

При работе с Linked Data постоянно приходится иметь дело с пространствами имён URI. К счастью, есть замечательная служба prefix.cc, облегчающая процесс.

Идея службы очень проста. Обычно у каждого пространства имён есть общепринятый префикс. Например, пространство http://www.w3.org/2002/07/owl# почти всегда сокращается префиксом owl. На сайте prefix.cc пользователи просто вводят эти соответствия, а в случае неоднозначностей — голосуют за них, чтобы выбрать самый популярный вариант.

У prefix.cc есть очень простой HTTP-интерфейс, написать к которому «морду» — дело пяти минут. Пользователям GNU/Linux предлагаю следующий bash-скрипт, снимающий проблему префиксов раз и навсегда.

  1. Устанавливаем программы zenity (входит в состав GNOME), curl и опционально xsel.
  2. Кладём скрипт xmlns куда-нибудь в $PATH.
  3. Создаём пустой файл кэша, где будут храниться сохранённые префиксы. Путь к файлу указываем в переменной CACHE в начале скрипта.
  4. Когда нужно подсмотреть адрес префикса xyz, вызываем: xmlns xyz.
  5. Если префикс есть в кэше, появляется окошко с его адресом, и он сразу копируется в буфер обмена (если установлена xsel).
  6. Если префикса нет в кэше, то он ищется на prefix.cc. Найденный адрес показывается в окошке, его предлагается добавить в кэш, и он сразу копируется в буфер обмена.
  7. Файл кэша устроен очень просто — по одной строке на префикс в формате префикс‹TAB›адрес — и в него можно добавлять собственные строки.
#!/bin/bash

CACHE=$HOME/xmlns.cache

URI=$( egrep -w "^$1" $CACHE | cut -f 2 )
if [ "$URI" ]
then
    echo -n "$URI" | xsel -ib
    zenity --info --text="$URI"
else
    LINE=$( curl --fail http://prefix.cc/$1.file.txt )
    if [ $? -eq 0 ]
    then
        if zenity --question --text="$LINE" --title="Добавить в кэш?"
        then
            echo "$LINE" >>$CACHE
            URI=$( echo "$LINE" | cut -f 2 )
            echo -n "$URI" | xsel -ib
        fi
    else
        zenity --error --text="Такого префикса не нашлось."
    fi
fi