23

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

几个星期以来,我一直在验证 node.js 可以使用的一些图形数据库解决方案。我的用例是保存不同社交用户网络帐户的交互。需要以最有效的方式使用 CPU 和内存

我最重要的要求是:

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

Neo4J

我真的很喜欢cypher,所以我最好的选择是 Neo4j。但是关于 Neo4j 的主要问题是 JavaScript 访问是非本地的。它使用比直接 Java 访问慢十倍 (10x)的 REST-API。所以我看了一下node-neo4j-embedded,但它已经两年多没有活动了。看起来它的作者根本不活跃(坏迹象)。

ArangoDB

ArangoDB 的真正优秀的核心开发人员回答了关于内部的问题。最后,这意味着JavaScript是一等公民,因为原生查询可以从 JS 中推出。看看开源基准,我认为这是公平的。但恐怕他们没有使用node-neo4j-embedded作为他们的基准。基准比较了 REST-API(因@weinberger 评论而编辑)。我希望他们比较原生 API(也许有人足够窥探并试一试!-让我们知道!)。更新:正如我现在注意到的,OrientDB 已经用一个新的 node.js 驱动程序回答了基准测试(使用命令缓存通过启动服务器-Dcommand.cache.enabled=true -Dcommand.cache.minExecutionTime=3这是不公平的,因为它不是查询缓存基准!)

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

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

MongoDB

基于文档的 MongoDB 并未针对图形操作进行优化,但最近获得了一个实验性的 in_memory 存储引擎。还有一些与 in_memory 或图形相关的项目,但没有什么是真正引人注目的。在这个讨论中,MongoDB 似乎不是我喜欢使用的。

东方数据库

因为有一个关于OrientDB 和 MongoDB的比较(来自 OrientDB),所以我打算使用这个。“ OrientDB 有一个混合的 Document-Graph 引擎”使用 SQL。我是前 PHP/MySQL 专家。但是建模部分在哪里?他们使用图表的章节不像密码。这就像使用 SQL for Graphs。这并没有错,但是在我错过建模感觉之前使用密码。如果有人用 OrientDB 和 Graphs 做了一个建模过程,也许你可以写一个像Neo4J 那样的教程。

更新:关于第一个公民的 JavaScript 访问有消息:“在下一个版本中,此驱动程序的速度将与本机 Java 相媲美” 分叉的 node.js 驱动程序已在前几天修复了 bin

更新:在选择 OrientDB 之前,您可能想阅读有关从那里链接的一些问题和讨论的文章。这篇文章涉及一个敏感问题,应该以批判的态度来对待。此更新作者的注意事项:我是编辑 SO 的新手,没有足够的声誉来发表评论。我相信这个信息是一个有效的讨论点,不知道如何根据 SO 规则把它放在这里。

LokiJS

在我研究 Neo4J、ArangoDB 和 MongoDB 之前,我曾使用过名为LokiJS的基于 JavaScript 的 in_memory 数据库,遵循策略的接缝忽略了降低性能和效率的所有因素。LokiJS 正在尝试完成 Mongo-Style (RoadMap)。主要问题是规模化能力差。当然,它不是图形数据库,但在我的项目开始时它是一个有趣的解决方案。此外,找到所有分布式文档也不是一种完美的感觉(也许他们应该用 GitBook 重新启动)。最后 LokiJS 是一个非常有趣的项目,我希望他们能继续前进!

级别数据库

以前,当我写学位论文时,我正在查看 levelDB。写这篇文章时记住了这一点,我搜索了LevelDB in_memory并得到了一个很有希望的结果,称为MemDown(另请参见参考资料)。我还没有测试过这个发现,但也许有人有为此解决方案工作和建模的经验。如果所有其他方法都不适合,也许这将是最有效的方法,因为我会简单地编写一个轻量级的密码克隆,目标是尽可能保持轻量级。

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

密码

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

水平图

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

结论

正如您可能注意到的那样,我不是关于图表的超级英雄。但这是我最初对此的深入研究,我试图获得一个概述。我想有很多人想问和我一样的问题,但没有时间。我希望这篇文章能对很多人有所帮助,并且会通过评论和答案来改变,从而成为一个很好的概述如何为图形数据建模。


@editors:不客气。

@commenters:这是我个人研究的结果——如果你也像我一样经历过一段旅程,请像我对我评估的每个数据库所做的那样做一个简短的总结来回答(不要忘记瞄准我的 4 个目标) .

4

2 回答 2

2

通过任何本机功能(例如流)和高级查询语言之类的结合节点样式性能的想法CYPHER实际上非常简洁。

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

cypher-stream因为包含所有这些,同时(表面判断)保持良好的风格。

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

于 2015-11-04T00:48:56.853 回答
0

你应该看看 Gundb https://github.com/amark/gun 它是开源的,有一个非常活跃和乐于助人的首席开发人员。

加入我们https://gitter.im/amark/gun

于 2016-09-11T21:35:04.833 回答