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

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

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


Для изучения граф-ориентированной базы данных нужен тот или другой граф. Это может фигурировать социальная сеть, дамп википедии alias элемент железных дорог. Мы пойдём простым путём равно воспользуемся огромным общедоступным графом лексической базы 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/

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