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 в веб-консоли, и вы получите этот график:
Вы можете узнать больше об этой библиотеке здесь и найти полный пример здесь, не стесняйтесь вносить свой вклад и сообщать об ошибках.