Тикаємо Freebase
Перед тим як перейти до фізичної взаємодії – можете подивитись що воно таке:
А щоб перейти до фізичної взаємодії:
Качаємо останню версію 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
існує тільки в головах користувачів.
[…] тім-лід на співбесіді питав “Я не дочитав статтю про freebase. Движок […]
Чому варто вести блог? « Блоґ одного кібера
16 Квітня, 2012 at 04:11