Как оказалось, 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 и т.д.)
А вот как вставляется запись, о том, что 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.