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.

Site Footer

Sliding Sidebar

About Me

About Me

For whom this blog for?

For those who are interested in modern Internet technologies, IT business, startups, management, quality control, personal effectiveness, motivation. Here I write about what is interesting, about problems I faced and solutions I found. I hope it will be interesting to you either.

What motivates me to write?

The desire to improve, to study deeper topics that interest me. Find people with similar problems and tasks, together look for ways out and solutions.

Feel free to contact if you have anything to say to me

Old Flash site with my artistic works and misuc.