Neo4j与ArangoDB在建模社交网络时的比较

13

我想建立一个社交网络(例如,人们可以将其他人添加为好友),我认为图形数据库比传统数据库更适合此类项目。我希望在边缘和节点上存储属性,它们可以是JSON格式,但如果数据库不理解JSON,也无所谓。

ArangoDB还可以存储文档,而Neo4J仅仅是一个图形数据库。

我希望有一个用户节点,并且对于每个人可能有两个边缘关联的用户节点。

用户-[用户名]->人
用户-[ID]->人

并且需要在边缘上建立索引。我不想使用不同的数据库,因此最好能够在数据库中存储图像(字节数组),甚至可以针对每个图像/视频存储不同大小。还应该将帖子等内容存储在数据库中。

据我了解,Neo4j支持更多独立于制造商的查询语言,但我认为学习制造商标准比较容易且更好。您有哪些关于哪种数据库管理系统更适合的建议? 我将使用Java(和一些Scala)编写代码。


2
Cypher正在成为一个开放的努力,详见opencypher.org。 - Michael Hunger
2个回答

48

ArangoDB和Neo4j都有能力完成你所想要的工作。这两个项目都有出色的文档,获取任一个的答案都很容易。它们都可以从Java使用(尽管Neo4j可以被嵌入)。

有一件事情可能有助于你做出决策的过程是认识到许多NoSQL数据库解决的问题比人们意识到的要窄得多。

Sarah Mei在一篇关于MongoDB的史诗级博客文章中,使用了一些电视节目数据的例子。从摘要来看:

MongoDB的理想用例甚至比我们的电视数据更窄。 它擅长的唯一事情就是存储任意的JSON片段。

我认为Neo4j解决的问题范围也很狭窄,这可以从使用Neo4j 其他一些 数据存储一起的普遍性看出。

我不确定在ArangoDB或Neo4j中存储图片或视频数据是否是一个好主意。我建议将其存储在其他服务器(如S3)上,并将该文件的URL保存在Neo4j/Arango中。

虽然创建只有图数据库能回答的查询是可能的, 但是图数据库在任何给定的查询上的性能变化巨大,并且可能会给出一些非常令人惊讶的结果。例如,国际计算机科学和信息技术期刊的一篇论文对Neo4j与MySQL、Vertica和VoltDB进行了比较,使用的是你本以为Neo4j非常擅长的查询: Performance comparison

我的想法是,“社交网络”并不自动意味着优越性,甚至不一定使用图数据库(特别是在GraphQLFalcor发布后)。
关于查询语言的问题。图数据库没有标准语言。 AQL是一种查询语言,提供了一个统一的接口,用于处理键/值、文档和图形数据。
Cypher是一种图形查询语言。 Badwolf Query Language是一种受SPARQL启发的用于时间图的语言。
这些语言的存在是因为它们解决了不同的问题。支持它们的数据库也解决了不同的问题。
Neo4j在其网站上有“多语言持久性”的示例:an example

Using neo4j redis and mongo together

我认为ArangoDB和AQL试图解决的问题就是这个,假设是可以在不比Neo4j等专业软件差的情况下解决这个问题。目前看来他们可能是对的


1
这是一个很棒的答案,谢谢! - brainoverflow98

1
我不理解为什么你希望将用户的名称和ID分别建模?它们只是属于用户的属性。你更愿意将与其他用户、帖子或喜欢等相关的连接建模为链接。
例如...
(:User {name:"Florian",id:12})-[:KNOWS]->(:User {name:"Michael",id:3})

你需要关注关系索引的作用是什么? Neo4j可能不是存储图像的最佳选择,但过去人们确实这样做了,但视频不行。 你可以在Java和Scala中使用Neo4j,请参见http://neo4j.com/developer/language-guides。 希望对你有所帮助。

1
嗨,这个想法是拥有一个用户节点,它与所有(n)个用户有关系。最大值的数量为(m)> n。如果n很大,我仍然需要快速获取用户节点。我不希望它的复杂度为n,我希望它的复杂度是m的位数。用户名也是如此。具有树形结构的索引非常适合。如果您有100万个用户,我不知道您的查询速度会有多快。我希望这个解释听起来合理。 - Florian Reisinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接