Semantic Web на PHP при помощи библиотеки ARC

Прежде чем рассказывать о самой библиотеке, расскажу несколько слов о том что такое Semantic Web (семантическая паутина или web 3.0, как его еще называют), для тех кто не знает.

Итак, всемирная паутина продолжает развиваться. С одной стороны, объёмы существующей информации, огромны и кардинальные изменения происходят медленнее, в силу того, что для изменения нужно затрачивать больше усилия. С другой стороны, именно благодаря масштабу и размаху существующие проблемы становятся очивиднее. Информации становится больше, и найти нужную, упорядочить её становится всё сложнее. Тим Бернерс-Ли, изобретатель существующей версии интернета предлагает свою версию обновленного интернета, называя его Семантической Сетью. Идея новой модели немного непривычно ложится на существующие стереотипы понимания сети. Смысл его в том что документы это не голый текст, а какой-то смысл, изложенный текстом на каком-то языке, или еще шире, графика, видео, суть неважно. Научив машины «понимать» этот смысл мы сможем оперировать с информацией на более высоком уровне, — например делать умозаключения, искать неочевидные решения, избегать излишнего дублирования информации и многое другое. Я сейчас не хочу говорить о том насколько реалистичным является построение Семантической Сети в ближайшее время, пусть копья ломают те, у кого есть на это время и силы, но в узких прикладных областях (например в экспертных системах), эти идеи уже нашли свое применение.

semantic-web

Это классическая иллюстрация, описывающая пирамиду идей, на которых строится Семантическая паутина. Видно что в центре идеи находятся онтологии 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.

Comments

comments


Bookmark and Share