Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Тикаємо Freebase

with one comment

Перед тим як перейти до фізичної взаємодії – можете подивитись що воно таке:

А щоб перейти до фізичної взаємодії:

Качаємо останню версію freebase-python. Розпаковуємо архів, переходимо в нього і пишемо:

sudo python setup.py build
sudo python setup.py install

Після цього пробуємо виконати простенький запит, наприклад дізнатись хто режисер фільму “Hot Fuzz”:

 
import freebase 
print freebase.mqlread({"name":"Hot Fuzz","type":"/film/film","directed_by":[]})

Словник що передається у функцію – запит MQL. Запити MQL записуються в форматі JSON, і всі поля що містять значення “[]”, або “null” заповнюються даними з бази. Детальна інструкція по MQL слідує:

Архітектура Metaweb

Тепер трохи відійдемо від практики, і розглянемо структуру бази даних.

База даних Metaweb відрізняється від звичайних реляційних БД. Вона являє собою граф з вузлів та відношень. Також є додаткова частина – сховище медіа (content store). Вона призначена для зберігання бінарних файлів (BLOB в SQL), кожному з яких відповідає вузол графа. Ключем до файлу є його SHA2 хеш, це забезпечує відсутність дублікатів.

Вузли та зв’язки

На найнижчому рівні база даних Metaweb – це граф вузлів та зв’язків між ними. Кожен вузол має унікальний ідентифікатор та запис про те коли, й ким він був створений. Окрім ідентифікатора дати та автора вузли не містять жодної інформації. Все найцікавіше зберігається в зв’язках між вузлами (чи між вузлами та примітивами).

Зв’язки – це кортежі з 4 елементів (насправді 6, зв’язок теж має автора та час створення). Перший елемент From – перший (лівий) вузол зв’язку. Другий – Property – тип зв’язку. Наступне значення – To другий (правий) вузол зв’язку. Value – значення. Вузол може перебувати у відношенні з іншим вузлом, або зі значенням, або з обома одночасно, залежно від типу (Property) зв’язку.

Наприклад:

From Property To Value
/en/the_police /type/object/name /lang/en The Police
/en/zenyatta_mondatta /type/object/name /lang/en Zenyatta Mondatta
/en/zenyatta_mondatta /music/album/artist /en/the_police

Перший рядок каже, що вузол /en/the_police, пов’язаний зв’язком /type/object/name (ім’я) з вузлом /lang/en (англійська мова) та значенням “The Police”, тобто англійською мовою вузол /en/the_police називається “The Police”. Другий дає подібну інформацію про альбом “Zenyatta Mondatta”. Третій – каже про те, що альбом та група пов’язані через /music/album/artist, тобто “Zenyatta Mondatta” – альбом групи “The Police”.

Властивості

Властивості об’єктів (вузлів) в БД задаються типами зв’язків. Можна було помітити що колонка Property попередній таблиці містить ідентифікатори подібні до ідентифікаторів вузлів. А все тому, що тип зв’язку теж є вузлом, і його теж можуть створити користувачі, і він теж може попадати в поля From та To. Наприклад:

From Property To Value
/type/object/name /type/object/name /lang/en Name
/music/album/artist /type/object/name /lang/en Artist
/music/track/album /type/object/name /lang/en Appears On
/music/album/artist /type/property/unique true
/music/track/album /type/property/unique false

Перший рядок цієї таблиці має доволі цікавий сенс. Він каже нам про те, що ім’я властивості ім’я англійською мовою “Name”.

Напрямки властивостей

Напевне досить очевидно, що граф бази даних – напрямлений, так як для зв’язку конкретно вказано куди і звідки. Але Metaweb вміє переміщуватись по графу в обидві сторони.

Наприклад розглянемо зв’язок між альбомами та треками. Кожна композиція (трек) має властивість “альбом[и]” в яких вона була видана. Ми можемо здійснити запит “дізнатись в яких альбомах публікувалась Driven to Tears”, і Metaweb знайде всі значення поля “To” кортежів, в яких поле “From” містить “Driven to Tears”, а поле “Property” – /music/track/album. Можна задати протилежний запит – “які треки містить альбом Zenyatta Mondatta?”. Metaweb дасть нам значення поля “From” всіх кортежів які містять “Zenyatta Mondatta” в полі “To”, та /music/track/album в “Property”.

Metabase має як властивість альбоми в яких видавалась композиція (/music/track/album), так і протилежну – композиції альбому. (/music/album/track). Такі властивості називаються взаємними (англ. reciprocal properties), і такий їх зв’язок теж описується в графі:

From Property To Value
/music/track/album /type/property/reverse_property /music/album/track

Значення властивостей

Деякі властивості є базовими, тобто вбудовані в архітектуру і мають чітко прописане значення. Наприклад на /type/object/name накладається обмеження, що кожен об’єкт хоча й може мати багато імен, але лише одне кожною мовою. Іншою властивістю вбудованою в архітектуру є наприклад /type/property/unique, яка показує чи властивість вказує на один об’єкт, чи на множину.

Щоправда більшість властивостей не такі. /music/album/artist не є частиною архітектури. Його створили користувачі freebase.com для запису інформації про музику. Сам ідентифікатор властивості дає нам підказку про те що вона означає, яка підтверджується тим, що ця властивість має ім’я “Artist” (через зв’язок /type/object/name). Ми навіть можемо отримати коротку інструкцію використання властивості, якщо використаємо властивість /freebase/documented_object/tip.

Таким чином значення /type/property/unique закодоване прямо в реалізації БД, а значення /music/album/artist існує тільки в головах користувачів.

Далі буде… І вже є.

Written by bunyk

31 Березня, 2011 at 00:00

Опубліковано в Кодерство, Павутина

Tagged with ,

Одна відповідь

Subscribe to comments with RSS.

  1. […] тім-лід на співбесіді питав “Я не дочитав статтю про freebase. Движок […]


Залишити коментар

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.