Shindig: интеграция Neo4j с Meteor

Meteor - это изоморфный полнофункциональный Javascript-фреймворк, который является самым простым способом начать создавать приложения. Здесь очень мало шаблонов, и по большей части он просто работает.

Meteor поставляется с MongoDB и имеет все эти потрясающие причудливые вещи, которые реактивно публикуют, а задержка компенсирует все взаимодействие с базой данных через Minimongo. Но MongoDB - не лучший выбор для каждого приложения.

Mongo - это нереляционная база данных. Это отличное решение, когда все, что вам нужно, - это сохранять и извлекать документы с помощью некоторых простых запросов. Но Mongo не предназначен для моделирования отношений. Shindig включает в себя сеть пользователей, которые следят за другими пользователями, которые отмечают или организуют мероприятия. Фактически, этот запрос Neo4j Cypher вернет всю сеть, которая семантически следует за предыдущим утверждением.

MATCH (u:USER)-[f:FOLLOWS]->(p:USER)-[s:HOSTS|STARS]->(e:EVENT)
RETURN *

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

Чтобы выполнять реляционные запросы в Mongo, вам придется выполнять большой запрос $ in, который со временем будет становиться все менее и менее эффективным.

Вдобавок к этому вам нужно будет выполнять реактивные соединения в ваших метеорных публикациях, возможно, используя reywood: publish-Composite или один из многих других популярных пакетов, который дает вам еще худшую производительность с Mongo.

Я также сортирую события на основе рейтинга популярности, для чего потребуется запрос конвейера агрегации Mongo. Такие запросы не являются реактивными в отношении Meteor, поэтому вам придется использовать Meteor.methods - эквивалент REST API - для отправки необработанных данных клиенту.

Я хочу сказать, что Mongo просто не подходит для этого приложения.

Взаимодействие с Neo4j

Моей первой задачей было просто подключиться к Neo4j и запустить Cypher-запросы. Neo4j имеет простой HTTP-интерфейс, и я создал пакет ccorcos: neo4j, чтобы абстрагироваться от синтаксического анализа ответа и обработки любых ошибок. Он также поставляется со сценарием оболочки для запуска и остановки базы данных локально и сохранения базы данных в каталоге .meteor / local / neo4j вашего проекта. Это изолирует базы данных между проектами, как это делает инструмент сборки Meteor с Mongo. Если бы только Meteor дал мне несколько хуков цикла сборки, чтобы мне не приходилось вручную запускать и останавливать Neo4j отдельно!

Все, что вам нужно сделать, это создать экземпляр базы данных, а затем запускать запросы на сервере в Fiber с помощью Neo4j.query.

Neo4j = Neo4jDb() # defualts to localhost:7474
str = Neo4j.stringify
getFollowers = (userId) ->
  Neo4j.query """
    MATCH (u:USER)-[:FOLLOWS]->(:USER {id:#{str(userId)}})
    RETURN u.id
  """

Вы можете установить neo4j_url в своем settings.json, который автоматически подключит и создаст глобальный объект Neo4j, но вы также можете подключиться к нескольким различным экземплярам Neo4j, вызвав Neo4jDb с разными URL-адресами.

При написании Cypher-запросов вы можете использовать Neo4j.stringify, чтобы экранировать любые строки и правильно форматировать объекты (которые не переводятся точно в JSON).

Теперь нам нужно передать эти данные клиенту. Мы можем использовать Meteor.methods, но эти запросы не будут реактивными, и тогда Meteor вдруг перестает быть крутым. Итак, давайте сделаем это дальше.