Neo4j - отличная база данных для создания социальных сервисов, а Scala - язык программирования, который стал популярным для создания высокопроизводительных серверов параллелизма.

В этом посте я покажу вам, как использовать Scala для сопоставления классов с узлами и отношениями в базе данных Neo4j.

В новом или существующем проекте добавьте зависимость библиотеки от файла build.sbt:

libraryDependencies ++= Seq("com.kreattiewe" %% "neo4s" % "2.2.1")

Добавьте два класса, которые будут представлять пользователя в нашей социальной сети и их отношения:

case class User(name: String, email: String)

case class Friendship(from: User, to: User, active: Boolean) extends Rel[User, User]

Теперь создайте Mapper, который преобразует класс case в Map:

import com.kreattiewe.mapper.macros.Mappable
implicit val userMapper = Mapper.build[User]
implicit val friendshipMapper = Mapper.build[Friendship]

Создайте NeoNode, который является классом, который будет сохранять узлы в базе данных:

implicit val neoUser = NeoNode("user", "email", (user: User) => user.email)

Метод NeoNode.apply принимает метку для узла, уникальный столбец и функцию, которая получает экземпляр моего пользователя и возвращает строку, представляющую уникальный ключ в базе данных для узла.

Для создания NeoRel нам нужны импликации для Картографов пользователей и Дружбы и NeoNode для Пользователей.

implicit val neoRel = NeoRel[Friendship, User, User]("friendship", true)

Вот и все, теперь вы можете сохранять узлы в базе данных, но сначала необходимо установить соединение:

implicit val connection = Neo4jREST("localhost", 7474, "/db/data/", "user", "password")

Создание узлов:

val user = User("Michel Perez", "[email protected]")
val friend = User("Juan David", "[email protected]")

Каждая операция CRUD в базе данных будет возвращать ответ в будущем, поэтому я буду использовать для понимания, чтобы обрабатывать эти операции:

val fut = for {
  _ <- user.save()
  _ <- friend.save()
  saved <- Friendship(user, friend, true).save()
} yield saved

val saved = Await.result(fut, 1 second)

Таким образом, я могу создать два узла в базе данных и установить связь, вы можете запросить Neo4J в веб-консоли, и вы получите этот график:

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