Shindig: интеграция Neo4j с Meteor
- ccorcos: neo4j
- Предыдущая статья: Shindig: приложение для обнаружения событий, созданное с использованием Meteor.js, React.js и Neo4j
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 вдруг перестает быть крутым. Итак, давайте сделаем это дальше.
- Следующая статья: Shindig: Reactive Meteor Publish / Subscribe with Any Database