什么(in_memory)图形DB如果聚焦建模数据

Dan*_*nny 21 neo4j node.js orientdb arangodb lokijs

我没有想法,希望得到一些有用的意见.我正在使用这个问题来压缩我的经验并分享它们,希望激励一些经销商进一步将图形数据库建模作为一流的问题/方式.

我已经验证了node.js可以使用的一些图形数据库解决方案几周.我的用例是保存不同社交用户网络帐户的交互.需要以最有效的方式使用CPU和内存.

我最重要的要求是:

  • in_memory(至少用于编制索引)
  • 开源(并免费使用)
  • 与一等公民相同的JavaScript/Node.js表现
  • 舒适的查询和建模语言

Neo4j的

我真的很喜欢密码,所以我最好的选择是Neo4j.但是关于Neo4j的主要问题是JavaScript访问是非原生的.它使用的REST-API 比直接Java访问慢大约十倍(10倍).所以我看了一下node-neo4j-embedded,但它已经处于非活动状态超过两年了.看起来它的作者根本不活跃(坏迹象).

ArangoDB

ArangoDB非常好的核心开发人员回答了关于内部的问题.最后,它意味着JavaScript是一流的公民,因为本机查询可以被推出JS.看看开源基准测试,我认为这是公平的.但我担心他们没有使用node-neo4j-embedded作为他们的基准.基准测试比较REST-API(由于@weinberger评论而编辑).我希望他们比较本机API(也许有人足够snoopy并尝试一下! - 让我们知道!).更新:正如我现在注意到的那样,OrientDB 用新的node.js驱动程序回答了基准测试(通过启动服务器使用命令高速缓存)-Dcommand.cache.enabled = true -Dcommand.cache.minExecutionTime = 3,什么是不公平的,因为它不是查询缓存基准!)

因为我喜欢使用ArangoDB作为图形数据库,所以我有3个选择(来源:FAQ):

一般来说,它像cypher一样不舒服.我不确定如何比较以及建模数据的正确方法(如Neo4J解释得很好).我很想为ArangoDB Graphs提供类似的东西.感觉ArangoDB专注于图形操作,如果你有更多的关系而不是行,Neo4J更符合使用图形的需要(使用图形而不是连接关系的原因).

MongoDB的

基于文档的MongoDB没有针对图形操作进行优化,但后来获得了实验性的内存存储引擎.还有一些项目是in_memory或图形相关,但没有什么是真正引人注目的.在本次讨论中,看起来MongoDB并不是我喜欢使用的.

OrientDB

因为有一个关于OrientDB和MongoDB的比较(来自OrientDB),我虽然即将使用这个." OrientDB有一个混合的Document-Graph引擎 ",使用SQL.我是以前的PHP/MySQL专家.但建模部分在哪里?他们使用图表的章节并不像cypher那样.就像使用SQL for Graphs一样.这没有什么不对,但在我错过像感觉之类的建模之前使用cypher.如果有人用OrientDB和Graphs做了一个建模过程,你可以写一个像Neo4J那样的教程.

更新:关于第一个类似的JavaScript公民访问有消息:" 在下一版本中此驱动程序的速度将媲美本地Java一个 "叉状的node.js司机不得不斌固定最后的日子.

更新:在选择OrientDB之前,您可能希望阅读有关此处链接的一些问题和讨论的文章.这篇文章涉及一个敏感问题,应该以批判的态度来处理.本更新作者的注意事项:我是编辑SO的新手,并且没有足够的声誉将其添加到评论中.我相信这些信息是一个有效的讨论点,不知道如何根据SO规则将其放在这里.

LokiJS

在我查看Neo4J,ArangoDB和MongoDB之前,我使用了基于JavaScript的in_memory数据库LokiJS,接下来的策略是忽略所有会降低性能和效率的因素.LokiJS正试图完成Mongo-Style(RoadMap).主要问题是规模能力差.因为它不是图形数据库,但在我的项目开始时它是一个有趣的解决方案.找到所有分发的文档(也许他们应该使用GitBook重启)并不是一种完美的感觉.最后LokiJS是一个非常有趣的项目,我希望他们能继续前进!

性LevelDB

以前,当我写学位论文时,我正在查看levelDB.记住这一点的同时写这篇文章,我搜索了性LevelDB in_memory找来一个叫有前途的结果MemDown(见).我没有测试过这个发现,但也许有人有为这个解决方案工作和建模的经验.也许这将是最有效的方式,如果所有其他人都不适合,因为我只是编写一个轻量级的密码克隆,其目标是保持轻量级,就像我能做的那样.

编辑:由于评论,这里是LevelGraph的链接.作为为LevelGraph/LevelDB实现CYPHER解析器的想法,您的出发点是比较

Cypher:

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

LevelGraph:

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

结论

你可能已经注意到我不是关于图表的超级英雄.但这是我最初的研究,我试图得到一个概述.我假设有很多人想和我问同样的问题,但没有时间.我希望这篇文章能够帮助很多人,并会通过评论和答案进行更改,从而成为一个完善的概述,如何为图表建模数据.


@editors:不客气.

@commenters:这是我个人研究的结果 - 如果你也像我这样的旅程,请回答一个简短的总结,就像我为每个评估过的DB做的那样(不要忘记针对我的4个目标) .

elj*_*efe 2

通过任何本机功能(例如流)和高级查询语言(如)将节点式性能结合起来的想法CYPHER实际上非常巧妙。

您可能不会得到任何类型的低级 API,因为这对于数据库作者来说相当罕见,并且据说在他们的设计模式中并不需要。因此,长时间运行的tcp连接应该可以正常工作。

cypher-stream自从整合了所有这些,同时(表面上判断)保持了良好的风格。

由于您可能无法进一步进行搜索,因此如果需要任何其他功能,我建议向他发送拉取请求:)