Feed on Posts or Comments

Spatial &Ликбез &Общее Андрей Пивоваров on 22 Jan 2007 03:25 pm

Еще про Resource Description Framework

Как оказалось, RDF и все о чем говорилось в прошлом посте имеет уже практические применения.

Во первых, RSS, оказывается, первоначально расшифровывалось не как “Really Simple Syndication”, а “RDF Site Summary”

Во-вторых, в исходных текстах многих страниц интернета, например в тех же блогах можно встретить RDF вставки. Даже в коде этой страницы.

Нашелся перевод на русский оригинальной статьи Тима Бернерса-Ли сотоварищи про семантические сети. Тут.

Теперь что касается Oracle Spatial.

Поддержка RDF появилась в Spatial только в версии базы 10g Release 2. Раньше не было.

Поэтому поводу, в документации по 10.2 появилась новая книжка “Oracle® Spatial Resource Description Framework (RDF)”

Там есть два примера, которые можно прогнать на своей базе и посмотреть как это все работает.

Один пример про каталог публикаций. (Статья, Автор, На какую статью ссылается) И затем можно делать запросы о ссылках.
Например. Запрос, ссылается ли статься Article2 на статью Article3:

SELECT SDO_RDF.IS_TRIPLE(
'articles',
'http://www.nature.com/nature/Article2',
'http://purl.org/dc/terms/references',
'http://www.nature.com/nature/Article3') AS is_triple FROM DUAL;

Ответ – TRUE (EXACT)

Второй пример более интересен. Он о том, как построить иерархию семьи (John – отец Matt, Sammy – отец Cathy, Cathy – сестра Jack и т.д.)

http://download-west.oracle.com/docs/cd/B19306_01/appdev.102/b19307/family.gif

А вот как вставляется запись, о том, что John – отец Matt:

INSERT INTO family_rdf_data VALUES (2,
SDO_RDF_TRIPLE_S('family',
'http://www.example.org/family/John',
'http://www.example.org/family/fatherOf',
'http://www.example.org/family/Matt'));

А вот как описывается отношение “Если x – родитель y, а y – родитель z, то x – дедушка y” В оригинале, конечно не “дедушка”, а GrandParent, а GrandParent это может быть и “бабушка”, но я не знаю какое слово в русском этому соответствует :-)

INSERT INTO mdsys.rdfr_family_rb VALUES(
'grandparent_rule',
'(?x :parentOf ?y) (?y :parentOf ?z)',
NULL,
'(?x :grandParentOf ?z)',
SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.example.org/family/')));

То есть, можно создавать новые отношения между существующими отношениями, а потом делать запросы используя уже новое отношение.

Вот например запрос: “Выбрать всех дедов и их внуков”. При этом, изначально, в базе были определено только кто является чьим родителем.

SELECT x grandfather, y grandchild
FROM TABLE(SDO_RDF_MATCH(
'(?x :grandParentOf ?y) (?x rdf:type :Male)',
SDO_RDF_Models('family'),
SDO_RDF_Rulebases('RDFS','family_rb'),
SDO_RDF_Aliases(SDO_RDF_Alias('','http://www.example.org/family/')),
null));

Интересно, что “дедушка” от “бабушки” тут отличается по “типу” Male.

Результат запроса:

GRANDFATHER                        GRANDCHILD
-----------------------------------------------------------------------
http://www.example.org/family/John http://www.example.org/family/Cindy
http://www.example.org/family/John http://www.example.org/family/Jack

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

__________________________________
Читайте также:
А еще можно почитать мой твиттер @apivovarov

Trackback This Post | Subscribe to the comments through RSS Feed

Leave a Reply