Прежде чем рассказывать о самой библиотеке, расскажу несколько слов о том что такое Semantic Web (семантическая паутина или web 3.0, как его еще называют), для тех кто не знает.
Итак, всемирная паутина продолжает развиваться. С одной стороны, объёмы существующей информации, огромны и кардинальные изменения происходят медленнее, в силу того, что для изменения нужно затрачивать больше усилия. С другой стороны, именно благодаря масштабу и размаху существующие проблемы становятся очивиднее. Информации становится больше, и найти нужную, упорядочить её становится всё сложнее. Тим Бернерс-Ли, изобретатель существующей версии интернета предлагает свою версию обновленного интернета, называя его Семантической Сетью. Идея новой модели немного непривычно ложится на существующие стереотипы понимания сети. Смысл его в том что документы это не голый текст, а какой-то смысл, изложенный текстом на каком-то языке, или еще шире, графика, видео, суть неважно. Научив машины «понимать» этот смысл мы сможем оперировать с информацией на более высоком уровне, — например делать умозаключения, искать неочевидные решения, избегать излишнего дублирования информации и многое другое. Я сейчас не хочу говорить о том насколько реалистичным является построение Семантической Сети в ближайшее время, пусть копья ломают те, у кого есть на это время и силы, но в узких прикладных областях (например в экспертных системах), эти идеи уже нашли свое применение.
Это классическая иллюстрация, описывающая пирамиду идей, на которых строится Семантическая паутина. Видно что в центре идеи находятся онтологии OWL, описывающие взаимосвязи между понятиями (URI). Неймспейсы (namespaces) поволяют одни и те же понятия описывать по разному в рамках разных предметных областей. RDF предлагает простой способ описания взаимосвязей между понятиями в виде троек (триплетов): субъект — предикат — объект. Вот примеры таких троек:
- крушовице — чешское — пиво
- чешское — очень хорошее — пиво
- Иннокентий — любит — пиво
В этом примере интересно что основываясь на этих данных машина может делать некоторые предположения, — например о том, что Иннокентию, скорее всего, понравится крушовице. То что мы только делаем предположения относительно результата, а не гарантируем его, может смутить, но на самом деле вся информация в сети, это просто предположения а не факты в последней инстанции. OWL расширяет семантику и логику «троек» до классов с описанием взаимодействий внутри этих классов, причем класс может быть определен разными способами:
- идентификатором класса (URI)
- перечислением всех экземпляров класса
- ограничением свойства
- пересечением 2 и более определений классов
- объединением 2 и более определений классов
- дополнением определения класса
OWL описывает классами предметную область, языком которой можно описать факты, касающиеся предметной области.
Есть два видения развития сети, — первый это постепенное создание онтологий вокруг существующих предметных областей (медицина, право и т.д.), второй — это построение синтаксических анализаторов, способных разбирать обычные тексты и строить онтологии на основании предположений записанных обычным, человеческим языком. При всей футуристичности второго подхода существуют довольно интересные наработки в эту сторону, например WordNet.
Надо сказать что шум вокруг Semantic Web докатился и до PHP. ARC развивается с конца 2007 года и, превратился в весьма функциональный инструмент. Вот неполный перечень того что умеет ARC:
- Web Reader, для построения ботов с поддержкой проки и редиректов
- Парсеры: RDF/XML, Turtle, SPARQL + SPOG, Legacy XML, HTML tag soup, RSS 2.0, Google Social Graph API JSON
- Сериализаторы: N-Triples, RDF/JSON, RDF/XML, Turtle, SPOG dumps
- Сохранение RDF в mysql базу (SPARQL SELECT, ASK, DESCRIBE, CONSTRUCT, + aggregates, LOAD, INSERT, and DELETE)
- RDF экстракторы (DC, eRDF, microformats, OpenID, RDFa)
- Поддержка SPARQL
Код у библиотеки шикарный, и отлаживаться-расширятся она должна очень легко. Но, как говорится, лучше один раз увидеть чем сто раз услышать, — приведу несколько примеров её использования:
include_once('arc/ARC2.php');
$parser = ARC2::getRDFParser();
$parser->parse('http://www.w3.org/TR/owl-guide/wine.rdf'); // загружаем онтологию
var_dump($parser->getTriples()); // получаем массив "троек" онтологий вида:
array(2012) { [0]=> array(7) { ["s"]=> string(52) "http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine" ["p"]=> string(47) "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" ["o"]=> string(38) "http://www.w3.org/2002/07/owl#Ontology" ["s_type"]=> string(3) "uri" ["o_type"]=> string(3) "uri" ["o_datatype"]=> string(0) "" ["o_lang"]=> string(0) "" } ...
Загруженную онтологию или RDF можно сохранить в N-Triples, RDF/JSON и даже HTML:
$ser = ARC2::getSer('LegacyHTML');
echo $ser->getSerializedArray($triples);
Но самое интересное, что позволяет ARC, это безусловно SPARQL:
$config = array(
/* db */
'db_host' => 'localhost',
'db_name' => 'db_name',
'db_user' => 'user',
'db_pwd' => 'password',
);
$store = ARC2::getStore($config);
if (!$store->isSetUp()) { // проверяем инициализацию базы
$store->setUp(); // если таблицы не были созданы, - они создаются
}
$store->query("PREFIX base:
INSERT INTO base:Graph {
base:testEntity1 base:testPredicate1 'test object 1' .
base:testEntity1 base:testPredicate2 base:testEntity3 .
base:testEntity2 base:testPredicate1 'test object 2' .
base:testEntity2 base:testPredicate2 base:testEntity4 .
base:testEntity3 rdf:type base:Type1 .
base:testEntity4 rdf:type base:Type2 .
}
"); // выполняем запрос на добавление "троек"
$store->query('SELECT *
WHERE {
?obj ?predic "test object 1" .
}'); // выполняем запрос
Для того чтобы попробовать «поиграть» с элементами семантического веба, в ваших приложениях, функционала ARC вполне достаточно. Ну а если вы всерьез заинтересуетесь этой темой, рекомендую обратить внимание на открытый проект Jena.