среда, 8 июня 2011 г.

Типизация данных на основе URI/URL

Как работать с данными внутри одной функции всегда понятно. Известно, что передается на вход, что передается на выход, каким образом осуществляется работа с переменными. Когда необходимо совместно использовать несколько функций или классов, важно понимать какие данные в каком формате должны быть переданы, что в результате получено. Работая над проектом pyflowctrl, вопрос взаимодействия с потоками данных, можно сказать, стал одним из основных.

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

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

Принципы, лежащие в основе RDF (Resource Description Framework) помогли найти некое универсальное средство. Несколько слов о RDF – это универсальный язык для представления знаний в Сети. RDF данные описывают знания в самом общем виде. Это разновидность графа, набора понятий,  соединенных некими отношениями. Утверждение, высказываемое о ресурсе, имеет вид «субъект — предикат — объект» и называется триплетом. Для обозначения субъектов, предикатов и объектов в RDF используются URI.

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

Рассмотрим на примере. Допустим, нам необходимо из текстового файла извлечь ссылки на сайты с прогнозом погоды, загрузить страницы, извлечь из них данные и сохранить результат в базе данных, в формате METAR. Взаимодействие процессов для решения данной задачи представим в следующем виде:
Имя файла передается в процесс для чтения текстового файла и выдачи выходных данных в формате URL. Wikipedia - одна из крупнейших энциклопедий в мире, практически на любой вопрос можно найти там ответ. Как вариант, ее можно использовать для определения различных типов данных. Тип файла в данном случае описывается ссылкой http://en.wikipedia.org/wiki/Filename, а тип выходных данных URL для процесса TextFileReader описывается ссылкой http://en.wikipedia.org/wiki/URL. Проверка типов выходного потока TextFileReader и входного потока для UrlFetch может быть достаточно просто выполнена: TextFileReader.output == UrlFetch.input. Аналогичным образом происходит объединение и других процессов. Желательно для определения типов использовать известные ресурсы, несколько полезных ресурсов:

- Schema.org, http://www.schema.org
- PURL, http://purl.oclc.org/

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

0 комментариев:

Отправить комментарий