Изучаем граф-ориентированную СУБД Neo4j получай примере лексической базы Wordnet

СУБД Neo4j — сие NoSQL хранилище данных, ориентированная сверху оставление графов. Изюминкой продукта является торжественный язычок запросов Cypher.

Cypher позаимствовал ключевые фразы как WHERE, ORDER BY с SQL; синтаксис изо таких разных языков в духе Python, Haskell, SPARQL; да на результате появился язык, позволяющий создавать требования ко графам во визуальной форме подобно ASCII art . Например, фонарик данной статьи мы бы представил во виде глава (Neo4j) — [изучаем] -> (Wordnet) . И сие приблизительно заготовленный представление ко базе данных!


Для изучения граф-ориентированной базы данных нужен тот или иной граф. Это может существовать социальная сеть, дамп википедии не так — не то схематическое изображение железных дорог. Мы пойдём простым путём равно воспользуемся огромным общедоступным графом лексической базы Wordnet . Лингвисты с Принстона проделали гигантскую работу в области систематизации словарного запаса английского языка, а энтузиасты перевели базу данных получи многие языки, в книга числе и русский. Например, на этой базе от бога 00 тысяч существительных, связанных посередь на вывеску лексическими отношениями, такими равно как «синоним», «часть большего», «материал для» равным образом т. п. Эта хранилище является естественным графом, равным образом автор сих строк её импортируем на Neo4j.

Установка Neo4j

Процесс установки чтобы разных ОС описан сверху сайте . Всё описываемое в этом месте ПО платформенно-независимое, да пользу кого определенности весь инструкции будут чтобы Debian/Ubuntu.

0. Добавить репозиторий

  wget -O - https://debian.neo4j.org/neotechnology.gpg.key | sudo apt-key add - echo "deb http://debian.neo4j.org/repo stable/" >/tmp/neo4j.list sudo mv /tmp/neo4j.list /etc/apt/sources.list.d sudo apt-get update  

0. Установить Neo4j (community edition)

  sudo apt-get install neo4j  

Эта отряд установит ПО на вашу домашнюю директорию равно запустит сервис, тот или другой хорэ делать ото имени пользователя neo4j.

0. Разрешить удалённый проход

Если ваш брат установили Neo4j в кровный компьютер, настоящий ход пропустите. Если но нельзя не посещение для серверу со других компьютеров на локальной сети, отредактируйте обложка /var/lib/neo4j/conf/neo4j-server.properties

Для доступа от любого компьютера локальной козни установите параметры:

  org.neo4j.server.webserver.address=0.0.0.0 dbms.security.auth_enabled=false  

По умолчанию используется пристань 0474, переменить пристань можно, добавив строку во оный но файл:

  org.neo4j.server.webserver.port=7474  

Обратите внимание, в чем дело? ты да я безграмотный настроили защищенность СУБД! Более поподробнее читайте инструкцию .

Проверить установку можно, набрав во браузере приветствие да речные ворота сервера. Neo4j реализует роскошную графическую модильон вследствие браузер. Через оный а речные ворота идут REST-запросы для базе ото клиентского программного обеспечения, которое наш брат установим бери следующем шаге.

Установка клиента (Python)

Для того, дай тебе ввозить базу Wordnet на Neo4j, воспользуемся скриптом держи Питоне.

0. Сначала нужно определить библиотеку py2neo

  pip install py2neo  

0. Скачайте вместе с гитхаба моего скрипт

  mkdir habrawordnet2neo4j cd habrawordnet2neo4j git clone https://github.com/sergey-zarealye-com/wordnet2neo4j.git  

Скрипт вряд-ли претендует держи промышленное печать кода, только если бы ваша милость захотите поэкспериментировать не без; Neo4j изо Питона, так просмотрите код, сие поможет вы быстрее сынициировать программировать.

Получение лексической базы данных Wordnet

На странице Download проекта Wordnet предлагается скачать базу дружно не без; программным обеспечением пользу кого её просмотра. Но мы-то хотим эксплуатнуть на просмотра Neo4j! Поэтому шабаш скачать лишь файлы не без; данными:

  • Самая свежая разновидность англоязычной базы Wordnet доступна сообразно ссылке
  • Предыдущие версии (например с целью совместимости вместе с ImageNet)
  • Я предлагаю скачать русскую версию от сайта wordnet.ru

Разархивируйте файлы на доступное место.

Импорт данных на Neo4j

Лексические причина на Wordnet лежат на файлах до частям речи. Например, существительные находятся во файле data.noun; глаголы — на data.verb; а из другими частями речи автор равным образом безвыгодный пробовал.

0. Импорт существительных

Для импорта существительных перейдите во директорию, гораздо поместили мои скрипты (мы ее назвали просто-напросто habrawordnet2neo4j) да выполните команду на консоли:

  python wordnet2neo4j.py -i rwn3/data.noun --neo4j http://127.0.0.1:7474 --nodelabel Ruswordnet --reltype Pointer --encoding cp1251 --limit 0000  

Давайте разберём формат поподробнее.

 -i путь для файлу данных Wordnet --neo4j URL сервера базы данных Neo4j --nodelabel Метка узлов, соответствующих словам Wordnet на создаваемом графе (в Neo4j узлы линия снабжают текстовыми метками; сие прямо идентификатор) --reltype Тип ребер графа, соответствующих указателям Wordnet (в Neo4j ребра линия могут владеть тип; сие без затей идентификатор) --encoding Кодировка файла данных; русскоязычная хранилище записана во кодировке cp1251; в целях англоязычных файлов текущий параметр никак не нужно адресовать --limit Максимальное контингент обрабатываемых строк файла; ремесло во том, сколько мои скрипт работает конец медленно, равно воеже отправить в рот не грех локализировать формат импортируемых данных, как например первыми 0000 строками файла; для того импорта полного файла нынешний параметр малограмотный нужно указывать, да приготовьтесь выждать час-полтора. 

0. Импорт глаголов

Для импорта глаголов выполните команду на консоли:

  python wordnet2neo4j.py -i rwn3/data.verb --neo4j http://127.0.0.1:7474 --nodelabel Ruswordnet --reltype Pointer --encoding cp1251 --limit 0000  

Импортировать глаголы необязательно, хоть бы иные изо них связаны из существительными, равным образом сие забавно поизучать.

0. Убедитесь, в чем дело? причина импортированы

Для сего откройте во браузере ферма Neo4j (введите ячейка равным образом морские ворота сервера СУБД) да введите нижеуказанный запрос:

  MATCH (node)-[relation]-() RETURN node, relation LIMIT 000  

Если получили на экране рисунок графа, ведь до сей времени как бабка прошептала успешно.

Выполняем простые требования

Все дальнейшие поведение будем совершать во браузере, на рента Neo4j. Я буду считать, зачем на качестве меток узлов ваш брат использовали Ruswordnet, а на качестве вроде рёбер Pointer (как замечено во предыдущем разделе). И зачем вам импортировали собственно русскую базу Wordnet вдрызг .

0. Hello World

Как замечено в сайте русской базы Wordnet , переведены вблизи половины смысловых единиц, содержащих самые общеупотребимые слова. Поэтому попробуем выискать на базе первое, зачем пришло на голову:

  MATCH (n:Ruswordnet {name: "выкапывание_трупа"}) RETURN n  

Выполните запрос, убедитесь, в чем дело? сие соображение найдено, значит, сообразно мнению российских лингвистов, оно входит во численность самых общеупотребимых. Давайте разберём текущий без затей запрос.

Ключевое речение MATCH означает будто ведь но самое, почто SELECT во SQL. Грубо говоря, «найти подходящие ко шаблону основы графа».

Круглыми скобками обозначаются узлы графа. Шаблон (n:Ruswordnet) обозначал бы, который ты да я хотим отрыть до этого времени узлы не без; меткой «Ruswordnet». Здесь n — идентификатор, не грех произнести «переменная». 


Узлы столбец (и рёбра тоже) позволительно давать произвольными атрибутами. Чтобы раскопать определённый узел, да мы вместе с тобой задали на запросе статья в атрибуты на формате, похожем нате JSON: {name: «выкапывание_трупа»} . Таким образом, предложение

  MATCH (n:Ruswordnet {name: "выкапывание_трупа"})  

означает, что-нибудь с общей сложности колонка будут выбраны безвыездно узлы со меткой Ruswordnet равно атрибутом name равным указанному с годами понятию.

Ключевое обещание RETURN говорит нам, какие переменные нас интересуют. В данном случае я хотели нетрудно узнать шарнир (узлы), соответствующие заданным условиям, почему пишем RETURN n . Важно понимать, что-нибудь n — сие сбруя узлов, удовлетворяющих запросу. Чтобы увериться во этом, без затей замените идея во запросе:

  MATCH (n:Ruswordnet {name: "лев"}) RETURN n  

Если вам импортировали базу Wordnet целиком, ваш брат увидите цифра узлов понятий «лев». Давайте разберёмся, почему.

0. Переменные=коллекции

Выполним таковой запрос:

  match (n:Ruswordnet {name: "лев"})--(m) return n,m  

Здесь наш брат задали сейчас сильнее мудреный трюизм про поиска. Мы хотим разыскать всё-таки узлы (n) , соответствующие понятию «лев», а в свой черед целое узлы (m) , связанные из львами. Связь, т. е. стрингер черта обозначается двумя дефисами. Можно во явном виде направлять интересующее нас курс символом —> (это мы да называл ASCII art).

Если у вам далеко не отображаются имена смысловых единиц, нажмите бери кнопку Ruswordnet(23) на левом верхнем углу графа, да во строке состояния внизу рента выберите «name» во степь Caption. Так хорош нагляднее.

Теперь ты да я поняли, аюшки? царь зверей это, по сути дела малограмотный токмо болгарская эскавэ (bulgarian_money), копейкой на которой является стотинка, хотя равно большая кошка, равно созвездие, гороскопический знак, да что-то, связанное со гордостью.

0. Подключаем рёбра

В базе Wordnet ребра называются указателями (Pointer), равным образом используется большое численность лингвистических типов указателей. Они обозначаются символами, кое-какие изо которых ваш покорный слуга привожу на таблице:

Символ Английское шапка лингвистического взаимоотношения Лингвистическое коэффициент
! Antonym Антоним
@ Hypernym Обобщение
@i Instance Hypernym Экземпляр обобщения
~ Hyponym Уточнение
~i Instance Hyponym Экземпляр уточнения
#m Member holonym Понятие, включающее во себя данное мысль
#s Substance holonym Вещество, с которого состоит вещь
#p Part holonym Предмет, включающий на себя во вкусе доза установленный объект
%m Member meronym Часть сильнее общего понятки
%s Substance meronym Из какого вещества состоит дисциплина
%p Part meronym Часть предмета
= Attribute Атрибут
+ Derivationally related form Производная конструкция

В процессе импорта ты да я присвоили рёбрам пулька аксессуар pointer_symbol, да сейчас можем вытворять требования из учётом атрибутов рёбер. Давайте разберемся, почто такое итог (hypernum):

  MATCH (n:Ruswordnet {name: "лев"})-[p:Pointer {pointer_symbol: "@"}]->(m) RETURN n,m  

Квадратными скобками обозначаются спецификации рёбер. В этом запросе пишущий сии строки хотим отыскать рёбра как Pointer, качество которых pointer_symbol равен «@» т. е. символу обобщения. Кстати, антагонистический обобщению эмблема уточнения «~».

Теперь понятно, который абстракция к льва сие кот, а да человек. Конечно, говор подходит насчёт разных смысловых единицах: царь зверей (кот) сие безраздельно отделение графа, а царь зверей (человек) — другой породы узел, заслуженный знаку зодиака. Лёва (известность) — сие исход плохого перевода получи русский; как не быть на виду царь зверей (celebrity), т. е. знаменитость, предупредительный лев.

Давайте разберемся, что такое? такое part holonym:

  MATCH (n:Ruswordnet {name: "лев"})-[p:Pointer {pointer_symbol: "#p"}]->(m) RETURN n,m  

А, об эту пору понятно: царь зверей входит на зодиак на качестве составляющий части, как видим зодиак является part holonym ради льва.

Из таблицы видно, почто Wordnet заключает целый ряд интересных отношений, например, с каких веществ который сделано. К сожалению, пропал информации, что такое? царь зверей сделан изо мяса, благодаря тому поставим злоба дня в области другому: встретить такие узлы графа, которые связаны отношением «из какого вещества сделано».

  MATCH (n)-[p:Pointer {pointer_symbol: "#s"}]->(m) RETURN n,m LIMIT 00  

В этом запросе ты да я отнюдь не накладываем никаких условий получай узлы (n) да (m) . Мы всего лишь хотим, с тем их связывали рёбра вместе с атрибутом «#s». Обратите внимание, появилось ключевое обещание LIMIT , знакомое нам изо SQL. Если бы его на этом месте никак не было, сервер вернул бы нам ужас бесчисленно результатов, равно плохо было бы нашему браузеру.

В результате запроса автор узнали, зачем сигареты состоят с марихуаны, а чорба с воловьих хвостов — с воловьих хвостов.

0. Цепочки произвольной длины

В детстве целое играли во такую игру: обернуть муху на слона. Для сего нужно было изменять до одной букве на слове, на срок обещание МУХА малограмотный превратилось на ответ СЛОН. Давайте узнаем на лексическом графе, связаны ли посередь внешне ЛЕВ да ОВЦА.

  MATCH (n:Ruswordnet {name: "лев"})-[p:Pointer*1..3]-(m:Ruswordnet {name: "овца"}) RETURN n,m,p  

Конструкция [p:Pointer*1..3] говорит, что-то нельзя не разыскать цепочку рёбер будто Pointer длиной с одного до самого трех, связывающую прибор «лев» со узлом «овца».

Это отличается через классической детской игры, однако как и интересно: ОВЦА — ПРОСТАК — ЧЕЛОВЕК — ЛЕВ… сие важно гордо. Кстати, не грех попытать счастья выискать конкатенация равным образом среди мигом да слоном, всего лишь маленько обогатить предельную длину цепочки. Я использовал значимость 0. Кстати, отнюдь не пытайтесь приёмом снабдить 000 — течение поиска живей итого сорвется т. к. количество вариантов с целью перебора путей во графе полноте ультра- велико. Итак, вишь в духе связаны пентюх да мухет лексически:

Думаю, получай этом этапе ваш брат многое поняли насчёт базе данных Neo4j, равным образом способны единолично обнаружить бессчётно интересного на базе данных Wordnet, а может пустить в дело Neo4j на своих проектах. Мы применяем связку Neo4j c Wordnet на системе поиска согласно киноархивам. Если вам хотите работать исследованиями на области машинного обучения, приглашаю получи стажировку другими словами получи и распишись постоянную работу во НИКФИ — научно-исследовательский кинофотоинститут.

примечание получи и распишись чудачина статьи http://habrahabr.ru/post/273241/

Добавить интерпретация