Skip to content
Ignat99 edited this page Sep 9, 2011 · 1 revision

RDFlib

Это библиотека для Питона, которую можно использовать для работы с данными Семантик Веба. http://www.rdflib.net/

Лучше брать с СВС на Гугле Коде. Протестированный мной код с ГитХаба не содержит достаточного количества работоспособных примеров, которые как раз есть в Транке ГуглеКода в каталоге doc.

Хороший работающий пример для RDFlib версии 3.0 находится тут В следующей версии вынесли определение Пространства имён из запроса, поэтому программы требуют переработки под новую версию.

Для запросов SPARQL надо поставить расширение библиотеки. http://rdfextras.googlecode.com/files/rdfextras-0.1.tar.gz

import rdflib

rdflib.plugin.register('sparql', rdflib.query.Processor,
                       'rdfextras.sparql.processor', 'Processor')
rdflib.plugin.register('sparql', rdflib.query.Result,
                       'rdfextras.sparql.query', 'SPARQLQueryResult')

from rdflib import Graph
g = Graph()
g.parse("http://bigasterisk.com/foaf.rdf")
g.parse("http://www.w3.org/People/Berners-Lee/card.rdf")

from rdflib import Namespace
FOAF = Namespace("http://xmlns.com/foaf/0.1/")
g.parse("http://danbri.livejournal.com/data/foaf") 
[g.add((s, FOAF['name'], n)) for s,_,n in g.triples((None, FOAF['member_name'], None))]

for row in g.query('SELECT ?aname ?bname WHERE { ?a foaf:knows ?b . ?a foaf:name ?aname . \
                    ?b foaf:name ?bname . }', 
                   initNs=dict(foaf=Namespace("http://xmlns.com/foaf/0.1/"))):
    print "%s knows %s" % tuple(row)

Вывод этой программы будет такой, как видно мы получили список друзей двух людей, потому что в исходном графе мы заложили информацию о двоих людях. Проблема, которая тут высветилась, распределённые данные не всегда доступны, иногда личные компьютеры выключены. Отсюда вытекает решение, надо забирать все необходимые данные сразу и хронить локально на своей системе, когда данные будут собраны, можно провести анализ с помощью запросов, как в примере. Если данные не доступны надо продолжать попытки, с паузами по таймеру, когда сервер будет работать. Так случилось с этой ссылкой: http://bigasterisk.com/foaf.rdf она была времнно не доступна, и какое то время не было нинформации о друзьях Drew Perttula. Тоесть сборкой распределённых данных должен заниматься AI-Аватар.

>>> 
Dan Brickley knows johnromkey
Dan Brickley knows Chris Schmidt
Dan Brickley knows David Recordon
Dan Brickley knows Joseph Smarr
Dan Brickley knows binzac
Dan Brickley knows Sandro
Drew Perttula knows Henry Story
Drew Perttula knows Nathan Wilson
Dan Brickley knows ДарьБорисссна
Dan Brickley knows Brad Fitzpatrick
Dan Brickley knows anjeve
Drew Perttula knows David McClosky
Dan Brickley knows Dingbat
Dan Brickley knows missmhart
Drew Perttula knows Kelsi Perttula
Dan Brickley knows goat
Dan Brickley knows Atrus
Dan Brickley knows Arto Bendiken
Dan Brickley knows Sliver
>>> 

Это книга Тоби Сегарана - Програмирование Семантик веб http://www.docme.ru/doc/4926/programming.the.semanticweb.2009

Это список всех свободных и не очень хранилишь семантических данных http://www.oreillynet.com/pub/a/css-html/excerpts/programming-the-semantic-web/overview-toolkits.html

Это модуль для работы с АПИ Фрибазе http://freebase-python.googlecode.com/files/freebase-1.0.6.tar.gz

Это описание модуля от Фрибазе http://wiki.freebase.com/wiki/Python

Текст самого модуля приведён в описании его надо скопировать в файл metaweb.py

Этот модуль зависит от библиотеки: https://github.com/simplejson/simplejson

Эту библиотеку надо тоже установить. Рассмотрим пару примеров запросов распределённых нереляционных баз данных на языке Метавеб Квери Лангведж (MQL) от компании ФриБейз. Этот язык более удобный, чем предыдущий. И в написании кода меньше ньюансов и больше удобства. Это настоящие языки и они живые. Это значит что изменения происходят постоянно, в следствии деятельности экспертов по этим языкам.

Далее надо написать тестовую программу, если есть желание попробовать использовать RDF данные и MQL:

>>> import metaweb
>>> null = None
>>> freebase = metaweb.Session("api.freebase.com")
>>> q = {"id":"/en/harrison_ford", "type":"/film/actor","film":[{"film":null }] }
>>> output = freebase.read(q)
>>> print str(output)

Вывод программы будет такой:

{u'type': u'/film/actor', u'id': u'/en/harrison_ford', u'film': [{u'film': u'Air Force One'}, {u'film': u'Apocalypse         Now'}, {u'film': u'Blade Runner'}, {u'film': u'Clear and Present Danger'}, {u'film': u'Firewall'}, {u'film': u'Frantic'}, {u'film': u'Hollywood Homicide'}, {u'film': u'Indiana Jones and the Kingdom of the Crystal Skull'}, {u'film': u'Indiana Jones and the Last Crusade'}, ...

Для более удобночитаемого вывода, можно ввести седующую строку:

>>> for performance in output['film']: print performance['film']

Вывод будет такой:

Air Force One
Apocalypse Now
Blade Runner
Clear and Present Danger
Firewall
Frantic

Другой пример запроса о фильмах у которых режисёром были женьщины:

>>> import metaweb
>>> null = None
>>> freebase = metaweb.Session("api.freebase.com")
>>> q2 = [{"name":null, "type":"/film/film", "directed_by":[{"/people/person/gender":"Female"}]}]
>>> gen = freebase.results(q2)
>>> for r in gen:
	print r["name"]

Несколько первых строчек результата работы программы:

Joe Dirt
What a Girl Wants
Educating Nina
Ill Be Your Mirror
The Ballad of Sexual Dependency
Destricted
Nowhere Boy
Love You More
James Bond Supports International Women's Day

Веб интерфейс для создания запросов к общественной базе данных freebase

Пример Виртуально карты со ссылками на друзей

Надо установить вот такую библиотеку для работы с графами

Исходный код библиотеки находиться тут

Пакет векторной иллюстративной графики под Виндоус

Дополнительная информация по FOAF в LiveJournal

Множество FOAF профилей можно найти тут. Другие сайты которые потдерживают обмен RDF данныи и содержат онтологии можно найти на ссылках на этой картинке.