Статьи

Выпущен Neo4j.rb 3.0

Автор Крис Григг

После сотен часов работы от многочисленных участников за последний год был выпущен Neo4j.rb, замена ActiveRecord для Ruby on Rails и каркасов Rack! Эта новая версия, полностью переписанная на весь драгоценный камень, представляет собой захватывающий перезапуск, который предлагает идеальный опыт для всех, кто хочет использовать Neo4j в своем приложении. Вы можете найти его на Github по адресу  https://github.com/neo4jrb/neo4j  и на Rubygems по адресу https://rubygems.org/gems/neo4j .

Меня зовут Крис Григг, один из сопровождающих проекта, и в этом посте я познакомлю вас с некоторыми новыми и интересными функциями 3.0.  

Слева направо: Крис Григг, Андреас Ронге, Брайан Андервуд

Слева направо: Крис Григг, Андреас Ронге, Брайан Андервуд

(Перл: Neo4jrb) — [: поддерживает] -> (PaaS: Heroku)

Хотя Neo4j.rb 2.3 был чрезвычайно мощным, его требование использования JRuby ограничивало возможности развертывания, не говоря уже о сложностях, связанных с тестированием и совместимостью с гемами. 3.0 делает это в прошлом благодаря поддержке REST Server Neo4j с использованием Ruby MRI. Если вы предпочитаете JRuby и встроенную базу данных, она все еще поддерживается; переключение между ними подразумевает изменение нескольких простых строк в конфигурации вашего приложения, но в противном случае ни один из кодов вашего приложения не должен будет меняться. Благодаря этому развертывание на PaaS по вашему выбору, наконец, возможно.

Революционный Cypher DSL

Каждая часть драгоценного камня была пересмотрена, чтобы обеспечить лучшую комбинацию ActiveRecord-подобного синтаксиса и повышенной мощности по сравнению с версией 2.3. Нигде это не проявляется так явно, как в новом DSL-запросе Cypher, называемом в геме QueryProxy. Давайте посмотрим на несколько примеров.  

Представьте себе график объектов, связанных с расписанием занятий в колледже. Он включает в себя узлы для учащихся, учителей и уроки, каждый из которых имеет соответствующие модели с одинаковыми именами и ассоциации между ними. Используя QueryProxy, соответствия, которые были бы очень сложными в SQL и, возможно, даже немного длинными в Cypher, легко генерируются с помощью Ruby.  

Предполагая, что «student» является узлом Student, мы можем увидеть все их уроки одним простым запросом, как и ожидал бы любой пользователь Rails:  

student.lessons   

Но что, если вы хотите найти всех учителей на всех их уроках? Вы можете связать ассоциацию «учителя» модели урока, и сервер выполнит одно совпадение Cypher, чтобы сгенерировать ответ:  

student.lessons.teachers 

Как насчет того, чтобы найти все уроки, которые преподают учителя, 43 года? Предполагая, что свойство «возраст» на Учителя, это так же просто.  

student.lessons(:lesson).teachers.where(age: 43).pluck(:lesson)   

Соответствие свойств отношений не может быть проще. Хотите знать всех молодых учителей в возрасте до 30 лет, у которых есть ученики на уроках с оценками A +? Цепные ассоциации в методах класса, назовите «где» и укажите отношения урока, а затем скажите, чтобы вы вернули соответствующих учителей!  

Teacher.as(:t).where(“t.age < 30”).lessons.students(:student, :lesson_rel).where(“lesson_rel.grade: ‘A+’”).pluck(:t)  

# generates the impressive Cypher:

# MATCH (t:`Teacher`), (lesson:`Lesson`),

        (t)-[rel1:`lessons`]->(lesson),

        (lesson)<-[lesson_rel:`lessons`]-(student:`Student`)

  WHERE t.age < 30 AND lesson_rel.grade = ‘A+’   

Такие запросы в SQL были бы чрезвычайно сложными и медленными; По мере того как их сложность возрастает, вероятность того, что они могут быть реализованы без наличия администратора базы данных, снижается. Neo4j.rb 3.0 позволяет любому разработчику Ruby раскрыть всю мощь Cypher без необходимости знать больше, чем основы языка запросов. Когда вы будете готовы перейти к расширенным запросам перемещения, полный язык Cypher уже доступен через класс Query в классе neo4j-core, который автоматически включается при использовании Neo4j.rb.

Новая парадигма: модели отношений для объектов отношений

Как мы знаем, отношения в Neo4j являются объектами и очень похожи на узлы: они имеют свойства, их можно сопоставлять, их можно создавать и уничтожать. В Neo4j.rb 3.0 мы представляем ActiveRel, упаковщик отношений, чтобы вы могли создавать модели для отношений. С их помощью вы можете сохранить сложный код отношений от ваших узлов. Модели ActiveRel имеют общий синтаксис с моделями узлов, поэтому вы можете использовать те же проверки, обратные вызовы и пользовательские методы для классов и экземпляров, как и для моделей в ванильном Ruby on Rails.

Перечислимые методы со вкусом Neo4j

Такие методы, как count, include ?, empty ?, существуют? и многие другие могут быть вызваны в цепочках прокси-запросов для полной оценки результатов в Neo4j. Такие методы, как: each_rel и: each_with_rel, могут быть вызваны для получения прямого доступа к отношениям без дополнительных запросов.  

Дружественный для разработчиков Rails

В дополнение к добавлению функций, весь драгоценный камень был пересмотрен, чтобы предложить более низкую кривую обучения для пользователей ActiveRecord, делающих переключение. Все более естественно, кажется более предсказуемым и лучше задокументировано.  

Обязательное  обслуживание, растущее сообщество

Быстрее переходить на некоторые важные этапы процесса разработки,  Neo Technology  и  Jayway 

спонсируемый со-сопровождающий Брайан Андервуд и я отправляемся из США в Мальме, Швеция, чтобы работать вместе с создателем драгоценного камня Андреасом Ронге в офисе Neo Technology. Наряду с доведением альфа-версии до версии-кандидата мы обсудили планы на будущее и наши надежды как на самоцвет, так и на Neo4j. Мы с нетерпением ожидаем услышать от вас, увидеть, что вы создаете с ним, и работать с вами, чтобы сделать этот инструмент еще лучше с течением времени.

Смотреть скринкаст