Вивчаємо граф-орієнтовану СУБД Neo4j на прикладі лексичної бази Wordnet, SavePearlHarbor
Ще одна копія хабора
Головне меню
Навігація за записами
Вивчаємо граф-орієнтовану СУБД Neo4j на прикладі лексичної бази Wordnet

Cypher запозичив ключові слова типу WHERE, ORDER BY із SQL; синтаксис з різних мов як Python, Haskell, SPARQL; і в результаті з'явилася мова, що дозволяє робити запити до граф у візуальній формі на кшталт ASCII art. Наприклад, заголовок цієї статті я б представив у вигляді графа (Neo4j) - [вивчаємо] -> (Wordnet) . І це майже готовий запит до бази даних!
Установка Neo4j
Процес установки для різних операційних систем описаний на сайті. Все описане тут платформно-незалежне, але для визначеності всі інструкції будуть для Debian/Ubuntu.
1. Додати репозиторій
2. Встановити Neo4j (community edition)
Ця команда встановить програмне забезпечення у вашу домашню директорію і запустить сервіс, який буде працювати від імені користувача neo4j.
3. Дозволити віддалений доступ
Якщо ви встановили Neo4j на комп'ютер, пропустіть цей крок. Якщо ж потрібний доступ до сервера з інших комп'ютерів у локальній мережі, відредагуйте файл /var/lib/neo4j/conf/neo4j-server.properties
Для доступу з будь-якого комп'ютера локальної мережі встановіть такі параметри:
За замовчуванням використовується порт 7474, змінити порт можна, додавши рядок до того ж файлу:
Встановлення клієнта (Python)
Щоб імпортувати базу Wordnet у Neo4j, скористаємося скриптом на Пітоні.
1. Спочатку потрібно встановити бібліотеку py2neo
2. Скачайте з гітхабу мій скрипт
Отриманнялексичної бази даних Wordnet
- Найсвіжіша версія англомовної бази Wordnet доступна за посиланням
- Попередні версії (наприклад, для сумісності з ImageNet)
- Я пропоную завантажити українську версію із сайту wordnet.ru
Розархівуйте файли у доступне місце.
Імпорт даних у Neo4j
Лексичні дані Wordnet лежать у файлах частинами промови. Наприклад, іменники знаходяться у файлі data.noun; дієслова - data.verb; а з іншими частинами мови я не пробував.
1. Імпорт іменників
Для імпорту іменників перейдіть до директорії, куди помістили мої скрипти (ми її назвали просто habrawordnet2neo4j) і виконайте команду в консолі:
Давайте розберемо параметри докладніше.
2. Імпорт дієслів
Для імпорту дієслів виконайте команду в консолі:
Імпортувати дієслова необов'язково, хоча деякі з них пов'язані з іменниками, і це цікаво повивчати.
3. Переконайтеся, що дані імпортовані
Якщо отримали зображення графа, то все пройшло успішно.
Виконуємо прості запити
Всі подальші дії будемо виконувати у браузері, у консолі Neo4j. Я буду вважати, що як мітки вузлів ви використовували Ruswordnet, а як тип ребер Pointer (як зазначено в попередньому розділі). І що ви імпортували саме українську базу Wordnetцілком.
1. Hello World
Як зазначено на сайті української бази Wordnet, переведено близько половини смислових одиниць, що містять найуживаніші слова. Тому спробуємо знайти в базі перше, що спало на думку:
Виконайте запит, переконайтеся, що це поняття знайдено, отже, на думку українських лінгвістів, воно входить до найуживаніших. ДавайтеРозберемо цей простий запит.
Ключове словоMATCHозначає приблизно те саме, що SELECT в SQL. Грубо кажучи, "знайти відповідні до шаблону елементи графа".
Круглими дужками позначаються вузли графа. Шаблон(n:Ruswordnet)позначав би, що хочемо знайти всі вузли з міткою «Ruswordnet». Тутn- ідентифікатор, можна сказати "змінна".
Вузли графа (і ребра теж) можна забезпечувати довільними атрибутами. Щоб знайти конкретний вузол, ми запитали умову на атрибути у форматі, схожому на JSON:. Таким чином, фраза
означає, що з усього графа будуть обрані всі вузли з міткою Ruswordnet та атрибутом name рівним зазначеному там поняття.
Ключове словоRETURNговорить нам, які нас цікавлять. У разі ми хотіли просто побачити вузол (вузли), відповідні заданим умовам, тому пишемоRETURN n. Важливо розуміти, щоn— це колекція вузлів, які відповідають запиту. Щоб переконатися в цьому, просто замініть поняття у запиті:
Якщо ви імпортували базу Wordnet, ви побачите шість вузлів понять «лев». Давайте розберемося чому.
2. Змінні = колекції
Виконаємо такий запит:
Тут ми задали більш складний шаблон для пошуку. Ми хочемо знайти всі вузли(n), що відповідають поняттю «лев», а також всі вузли(m), пов'язані з левами. Зв'язок, т. е. ребро графа позначається двома дефісами. Можна в явному вигляді вказувати напрямок, що цікавить нас, символом —> (це я і називав ASCII art).

Якщо у вас не відображаються імена смислових одиниць, натисніть кнопку Ruswordnet(23) у лівому верхньому куті графа, і в рядку стану внизу консолі виберіть «name» у полі Caption. Так буде наочніше.
Теперми зрозуміли, що це лев, виявляється не тільки болгарська валюта (bulgarian_money), копійкою для якої є стотинка, але і велика кішка, і сузір'я, астрологічний знак, і щось, пов'язане з гордістю.
3. Підключаємо ребра
У базі Wordnet ребра називаються покажчиками (Pointer), і використовують велику кількість лінгвістичних типів покажчиків. Вони позначаються символами, деякі з яких я наводжу в таблиці:
У процесі імпорту ми привласнили ребрам графа атрибут pointer_symbol і тепер можемо робити запити з урахуванням атрибутів ребер. Давайте розберемося, що таке узагальнення (hypernum):
Квадратними дужками позначаються специфікації ребер. У цьому запиті ми хочемо знайти ребра типу Pointer, атрибут яких pointer_symbol дорівнює «@», тобто символу узагальнення. До речі, протилежний узагальненню символ уточнення

Тепер зрозуміло, що узагальнення для лева – це кіт, а також людина. Звичайно, йдеться про різні смислові одиниці: лев (кіт) це один вузол графа, а лев (людина) - інший вузол, що відповідає знаку зодіаку. Лев (відомість) — це результат поганого перекладу українською; мається на увазі лев (celebrity), тобто знаменитість, світський лев.
Давайте розберемося, що таке part holonym:
А тепер зрозуміло: лев входить у зодіак як складова частина, отже зодіак є part holonym для лева.
З таблиці видно, що Wordnet містить багато цікавих відносин, наприклад, з яких речовин, що зроблено. На жаль, немає інформації, що лев зроблений з м'яса, тому поставимо питання інакше: знайти такі вузли графа, які пов'язані ставленням «з якої речовини зроблено».
У цьому запиті ми не накладаємо жодних умов на вузли(n)та(m). Ми тільки хочемо, щоб їх пов'язувалиребра з атрибутом "#s". Зверніть увагу, з'явилося ключове словоLIMIT, знайоме нам із SQL. Якби його тут не було, сервер повернув би нам дуже багато результатів і погано було б нашому браузеру.
В результаті запиту ми дізналися, що сигарети складаються з марихуани, а суп з волових хвостів - з волових хвостів.
4. Ланцюжки довільної довжини
У дитинстві всі грали в таку гру: перетворити муху на слона. Для цього потрібно було змінювати по одній літері в слові, поки слово МУХА не перетворилося на слово СЛОН. Давайте дізнаємося у лексичному графі, чи пов'язані між собою ЛЕВ та ОВЦА.
Конструкція[p:Pointer*1..3]говорить, що потрібно знайти ланцюжок ребер типу Pointer довжиною від одного до трьох, що зв'язує вузол "лев" з вузлом "вівця".

Це відрізняється від класичної дитячої гри, але теж цікаво: ВІВЦЯ — ПРОСТАК — ЛЮДИНА — ЛЕВ… це звучить гордо. До речі, можна спробувати знайти зв'язок і між мухою та слоном, лише трохи збільшити граничну довжину ланцюжка. Я використав значення 6. До речі, не намагайтеся відразу поставити 100 - процес пошуку швидше за все зірветься тому що кількість варіантів для перебору шляхів у графі буде занадто велика. Отже, ось як пов'язані слон та муха лексично:
Думаю, на цьому етапі ви багато чого зрозуміли про базу даних Neo4j і здатні самостійно відкрити багато цікавого в базі даних Wordnet, а може застосувати Neo4j у своїх проектах. Ми застосовуємо зв'язку Neo4j c Wordnet в системі пошуку кіноархівів. Якщо ви хочете займатися дослідженнями в галузі машинного навчання, запрошую на стажування або на постійну роботу до НІКФД — науково-дослідного кінофотоінституту.