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