Какая (in_memory) БД графа, если данные моделирования сфокусированы

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

Я проверял некоторые решения для графовых баз данных, которые может использовать node.js в течение нескольких недель. Я использую для сохранения взаимодействий различных учетных записей социальных сетей. Необходимо максимально эффективно использовать ЦП и память.

Мои самые важные требования:

  • in_memory (хотя бы для индексации)
  • открытый исходный код (и бесплатное использование)
  • та же производительность JavaScript / Node.js, что и у первоклассного гражданина
  • удобный язык запросов и моделирования

Neo4J

Мне очень нравится cypher, поэтому лучшим выбором будет Neo4j. Но главная проблема Neo4j в том, что доступ к JavaScript не является родным. Он использует REST-API, который примерно в десять раз (10x) медленнее чем прямой доступ к Java. Итак, я взглянул на node-neo4j-embedded, но он был неактивен для более двух лет. Похоже, его автор вообще не активен (плохой знак).

ArangoDB

Действительно хорошие разработчики ядра ArangoDB ответили на мой вопрос Про внутренности. Наконец, это означает, что JavaScript является первоклассным гражданином, потому что собственные запросы могут быть вытеснены из JS. Глядя на тесты с открытым исходным кодом, я думаю, что это справедливо. Но я боюсь, что они не использовали node-neo4j-embedded для своего теста. Тесты сравнивают REST-API (отредактировано из-за комментария @weinberger). Хотелось бы, чтобы они сравнили нативные API (может быть, кто-то достаточно любопытен и попробует! - дайте нам знать!). Обновление: как я заметил сейчас, OrientDB отвечает тесту с новым драйвером node.js (используя Command Cache, запустив сервер с -Dcommand.cache.enabled = true -Dcommand.cache.minExecutionTime = 3, что несправедливо, потому что это не был тест кеширования запросов!)

Поскольку мне нравится использовать ArangoDB в качестве базы данных графов, у меня есть 3 варианта (источник: FAQ):

В общем, это неудобно, как шифр. И я не уверен, как сравнивать и как правильно моделировать данные (например, Neo4J очень хорошо объясняет < / а>). Я бы хотел иметь что-то подобное для графиков ArangoDB. Кажется, что ArangoDB ориентирован на операции с графами, а Neo4J больше подходит для нужд использования графов, если у вас больше связей, чем строк (причина использовать графы вместо отношений с объединениями).

MongoDB

MongoDB на основе документа не оптимизирован для операций с графами, но в последнее время получил экспериментальный механизм хранения in_memory. Также есть несколько проектов, связанных либо с in_memory, либо с графами, но ничего действительно интересного. И в этом обсуждении похоже, что MongoDB не то, что мне нравится использовать. .

OrientDB

Поскольку существует сравнение OrientDB и MongoDB, доступное (от OrientDB), я собирался используйте это. «OrientDB имеет гибридный механизм Document-Graph» с использованием SQL. Я бывший эксперт по PHP / MySQL. Но где же модельная часть? Их глава работа с графиками не похожа на шифрование. Это похоже на использование SQL для графиков. В этом нет ничего плохого, но, используя шифрование, я скучаю по моделированию как по ощущениям. Если кто-то делал процесс моделирования с помощью OrientDB и Graphs, возможно, вы могли бы написать учебник, например, Neo4J сделал.

Обновление: о доступе к JavaScript, например о первом гражданине, есть новости: "В следующем выпуске скорость этого драйвера будет сопоставима со скоростью нативного Java" Разветвленный драйвер node.js в последние дни был исправлен ящик.

Обновление: перед тем, как выбрать OrientDB, можно прочитать статья о некоторых проблемах и обсуждениях, связанных с ней. Статья затрагивает деликатный вопрос, и к ней следует подходить критически. Примечание автора этого обновления: я новичок в редактировании SO, и у меня недостаточно репутации, чтобы оставлять это в комментариях. Я считаю, что эта информация является правильным поводом для обсуждения, но не знаю, как разместить ее здесь в соответствии с правилами SO.

LokiJS

Прежде чем я посмотрел на Neo4J, ArangoDB и MongoDB, я поигрался с базой данных in_memory, основанной на JavaScript, которая называется LokiJS, что может следуйте стратегии игнорировать все, что снижает производительность и эффективность. LokiJS пытается завершить Mongo-Style (RoadMap). Основная проблема - это плохая способность масштабирования. Конечно, это не графическая база данных, но это было интересное решение в начале моего проекта. Также было не очень приятно найти всю распространяемую документацию (возможно, им стоит перезагрузиться с GitBook). Наконец, LokiJS вообще очень интересный проект, и я надеюсь, что они будут продвигаться вперед!

LevelDB

Раньше, когда я писал свою дипломную работу, я смотрел на levelDB. Вспоминая об этом во время написания этого сообщения, я поискал LevelDB in_memory и получил многообещающий результат под названием MemDown (см. также ). Я не тестировал эту находку, но, возможно, у кого-то есть опыт работы и моделирования для этого решения. Возможно, это был бы наиболее эффективный способ, если бы все остальные не подходили, потому что я бы просто написал легкий клон шифра с целью оставаться намного легче, чем я могу.

Изменить: из-за комментария вот ссылка на LevelGraph. В качестве идеи реализации синтаксического анализатора CYPHER для LevelGraph / LevelDB вашей отправной точкой будет сравнение

Cypher:

CREATE (SUBJECT:"a") - [b:PREDICATE] -> (OBJECT:"c") 
RETURN, subject, predicate, object

LevelGraph:

var RETURN = { SUBJECT: "a", PREDICATE: "b", OBJECT: "c" };
db.put(RETURN, function(err) {
  // ..
});

Заключение

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


@editors: Добро пожаловать.

@commenters: Это результат моего личного исследования - если вы также совершили путешествие, как я, ответьте, пожалуйста, кратким резюме, как я сделал для каждой оцениваемой мной БД (не забудьте настроить таргетинг на мои 4 гола).


person Danny    schedule 22.07.2015    source источник
comment
закрывая все вкладки браузера, я наткнулся на redis-graph: npmjs.com/package/redis-graph - есть какие-нибудь впечатления?   -  person Danny    schedule 22.07.2015
comment
Я из ArangoDB, поэтому могу отвечать только на вопросы об ArangoDB. Что касается эталонного теста: мы не тестировали встроенный node-neo4j, потому что он неактивен, рекомендуемый драйвер - neo4j, см. j. mp / 1HRIFwz, и нам нужна была настройка клиент / сервер. Связь между узлом и ArangoDB всегда осуществляется по протоколу HTTP. Мы использовали CYPHER для Neo4J и AQL для ArangoDB - в обоих случаях связь осуществляется по протоколу HTTP. Я согласен с тем, что CYPHER более лаконичен, чем текущий AQL. Мы добавим синтаксический сахар, чтобы упростить запросы. Аспект моделирования данных лучше всего обсуждать с помощью электронной почты, claudius на arangodb.com   -  person weinberger    schedule 22.07.2015
comment
@weinberger: Честно говоря, я отредактировал пост. Спасибо за ваш отзыв. Вы правы, собираясь изменить это к лучшему. Как я уже добавил, мне бы хотелось увидеть сравнение с node-neo4j-embedded и прямыми AQL-запросами из node.js.   -  person Danny    schedule 23.07.2015
comment
Посмотрим, сможем ли мы протестировать вашу среду. Вы также должны упомянуть, что кеш запросов не является частью определения теста. У других продуктов также есть кеш запросов, который не использовался. Если я использую кеш запросов в ArangoDB, например, агрегация составляет всего 2 мс для второго вызова. Мы также обновили наш последний пост о тесте.   -  person weinberger    schedule 23.07.2015
comment
@weinberger: ДА, вы абсолютно правы! Использование кешей запросов нечестно (также с указанием на). Я добавил к сообщению уведомление.   -  person Danny    schedule 23.07.2015
comment
@weinberger: О моделировании данных я прочитал радар .oreilly.com / 2015/07 / - Основываясь на этом и размышляя о SQL-решении OrientDBs для работы с мультимоделями, Cypher-решение Neo4J должно быть средством измерения для создания БОЛЬШОГО семантического предложения для очень важного Причина: студенты все еще изучают ERD ... А академики должны учить неакадемических программистов. Простые идеи входа ВЫИГРЫВАЮТ когда-либо. То, что вы предоставляете на более глубоких уровнях, предназначено для профессионалов (и поддержки).   -  person Danny    schedule 23.07.2015
comment
Скорее всего, это будет закрыто как не по теме (прочтите справочные страницы, чтобы узнать, почему), но если вы хотите провести полное сравнение, вам следует включить Titan и, возможно, Oracle Graph, некоторые движки RDF (Jena, Sesame, Allegro, Virtuoso) и, возможно, VertexDB и InfiniteGraph также.   -  person jjaderberg    schedule 23.07.2015
comment
@jjaderberg: Спасибо за вашу благодарность! - Похоже, у вас есть опыт. Напишите, пожалуйста, ответ, как будто я создал свой вопрос. Это завершило бы список решений. Не забывайте ориентироваться на мои 4 основных желания (и шифр вроде RDF-моделирования). @ все это также приветствовали бы другие специалисты.   -  person Danny    schedule 23.07.2015
comment
В настоящее время я работаю с Neo4j и модулем neo4j-io ... с моей точки зрения производительность даже с накладными расходами Rest довольно потрясающая. Вы должны предоставить некоторые требования, метрики или любые другие числа из предполагаемого использования, прежде чем указывать, что sth. слишком медленно.   -  person pagid    schedule 24.07.2015
comment
+1 @pagid npmjs.com/package/neo4j-io выглядит интересно с обещаниями - Круто! Но я намерен использовать нативную версию NodeJS, чтобы предотвратить излишние узкие места. Для наиболее распространенных случаев вы будете правы, REST-API - это круто. Но таким образом NodeJS не сможет превзойти Java. Особенно, если вам нравится использовать его, например, с Tessel 2.   -  person Danny    schedule 24.07.2015
comment
Вы уже смотрели на график уровней? Похоже на удовольствие. Но мне лично не нравится API запросов. Но это скорее я, новичок в этой теме.   -  person eljefedelrodeodeljefe    schedule 14.09.2015
comment
@eljefedelrodeodeljefe ДА, это то, что я имел в виду, говоря о LevelDB с моей бумажной работой. Если вам нужно моделировать ваши данные как CYPHER, вы просто скажете (SUBJECT) - [: PREDICATE] - ›(OBJECT) .... В случае, если вы напишете node_module, укажите его здесь. Если кто-то заплатит мне и позволит сохранить лицензию MIT, я бы это сделал;)   -  person Danny    schedule 16.09.2015
comment
@Danny: Вы пробовали обход AQL новое в ArangoDB 2.8?   -  person CodeManX    schedule 17.04.2016


Ответы (2)


Идея объединить производительность в стиле узла с помощью любой из встроенных функций (например, потоков) и языка запросов высокого уровня, такого как CYPHER, на самом деле довольно интересна.

То, что вы, скорее всего, не получите, так это какой-либо низкоуровневый API, поскольку он довольно редко встречается у авторов БД и, предположительно, не желателен в их шаблонах проектирования. Итак, долго работающие tcp соединения будут работать нормально.

cypher-stream с тех пор, как включить все это, сохраняя при этом (по поверхностной оценке) хороший стиль .

Поскольку вы, вероятно, не продвинетесь дальше с поиском, я бы посоветовал отправить ему запрос на перенос, если нужны какие-либо другие функции :)

person eljefedelrodeodeljefe    schedule 04.11.2015
comment
спасибо за Ваш ответ. Я думаю, что в основном мне нужно найти решение, способное объединить обучаемую методологию для чистого моделирования и получить доступ к низкоуровневому API для этого. Если кто-то занимается мелочами, то низкий уровень подойдет, но для больших задач нужна профессиональная методология моделирования и документирования. И поскольку узел стал важным, идея низкого уровня должна быть объединена с чистой обучаемой методологией для планирования эффективных баз данных. На данный момент мои кадровые исследования приостановлены, но я надеюсь, что это обсуждение подтолкнет конкурентов к работе над этим. - person Danny; 10.12.2015

Вам следует взглянуть на Gundb https://github.com/amark/gun. Это открытый исходный код и очень активный и полезный ведущий разработчик.

Присоединяйтесь к нам на https://gitter.im/amark/gun

person Stef de Vries    schedule 11.09.2016