基于图形的数据库(http://neo4j.org/)有哪些使用场景?

137

我经常使用关系型数据库,但决定探索其他可用类型。

这款产品看起来很不错,很有前途:http://neo4j.org/

有人用过基于图形的数据库吗?从可用性角度来看,有什么优缺点?

您是否在生产环境中使用过这些数据库?是什么要求促使您使用它们?


Neo4j在国际公司中有不同的用途。Neo Technology拥有几篇白皮书,分析了每个用途:
  1. 欺诈检测
  2. 实时推荐和社交网络
  3. 数据中心管理
更多详情请参见:https://bbvaopen4u.com/en/actualidad/neo4j-what-graph-database-and-what-it-used
- Chirag Maliwal
7个回答

193

我曾在之前的一份工作中使用过图形数据库。我们没有使用neo4j,而是在Berkeley DB基础上构建了一个公司内部的图形数据库,但它很相似。它被用于生产环境(现在仍在使用)。

我们使用图形数据库的原因是,系统存储的数据以及系统对数据进行的操作正是关系型数据库的弱点,而图形数据库的优势恰恰在于这些方面。该系统需要存储由关系连接起来的、缺乏固定架构的对象集合。为了对数据进行推理,系统需要执行大量操作。在图形数据库中这只需要进行几次遍历,但在SQL中则需要进行复杂的查询。

图形模型的主要优点是快速开发时间和灵活性。我们可以快速添加新功能而不影响现有的部署。如果潜在客户想要导入一些自己的数据并将其移植到我们的模型上,通常可以由销售代表在现场完成。灵活性还在我们设计新功能时提供了帮助,使我们不必试图将新数据塞进严格的数据模型中。

拥有非常规的数据库让我们构建了许多其他奇特的技术,为我们的产品提供了很多秘密酱汁,使我们的产品与竞争对手区分开来。

主要缺点是我们没有使用标准的关系型数据库技术,这对于企业客户可能会成为问题。我们的客户会问为什么不能将我们的数据托管在他们的大型Oracle集群上(通常我们的客户拥有大型数据中心)。团队中的一位甚至重写了数据库层以使用Oracle(或PostgreSQL或MySQL),但速度比原始版本稍慢。至少有一个大型企业甚至有Oracle-only策略,但幸运的是Oracle收购了Berkeley DB。我们还需要编写许多额外的工具-例如我们无法只使用Crystal Reports。

我们的图形数据库的另一个缺点是我们自己构建了它,这意味着当我们遇到问题时(通常是可扩展性方面),我们必须自己解决。如果我们使用了关系型数据库,供应商早在十年前就已经解决了这个问题。

如果你正在为企业客户构建产品,并且你的数据符合关系模型,尽可能使用关系数据库。如果你的应用程序不适合关系模型,但适合图形模型,则使用图形数据库。如果它适合其他东西,请使用该数据库。

如果你的应用程序不需要适配当前的架构,可以使用图形数据库、CouchDB、BigTable或任何适合你的应用程序并且你认为很酷的东西。这可能会给你带来优势,并且尝试新事物是有趣的。

无论你选择什么,除非你真的喜欢构建数据库引擎,否则请尽量不要自己构建数据库引擎。


35

我们与Neo团队已经合作一年多了,感到非常满意。我们模拟学术资料及其关系,这正是图数据库所需要的,而且在网络上运行推荐算法。

如果你已经在使用Java,我认为使用Neo4j进行建模非常简单,并且它具有比我们尝试过的任何其他解决方案更平缓/更快的读写性能。

老实说,我很难不考虑图/网络,因为与设计复杂的表结构来保存对象属性和关系相比,它要容易得多。

话虽如此,我们仍然在MySQL中存储一些信息,仅仅是因为商业部门可以更轻松地对其运行快速SQL查询。要使用Neo执行相同的功能,我们需要编写代码,但目前我们只是没有足够的带宽。一旦有了,我将把所有数据都移到Neo上!

祝你好运。


1
你能告诉我你在MySQL中存储什么样的信息吗?我要创建一个新的社区,我能把所有“常规”的信息,比如用户名、密码、名字和姓氏等,都存储在neo4j中吗?还是说这不太适合? :o - Muqito
3
你完全可以将所有这些信息存储在Neo中。我曾经构建过几个系统,其中所有帐户信息都在图形数据库中。我通常会将大量的时间序列数据存储在图形数据库之外,以便进行报告查询。 - DataRiot
1
如果您正在使用 .Net/Microsoft 技术栈,Neo4jClient 是一个很好的选择。 - Manuel Hernandez

25

有两个要点:

首先,针对我在SQL Server上工作的数据,在过去的5年里,针对我们需要运行的查询类型(嵌套关系……你知道的……图形)我最近遇到了SQL的可伸缩性壁垒。我一直在尝试neo4j,并且发现当我需要这种查找时,我的查找时间快了好几个数量级。

其次,关于图数据库过时的观点。嗯……不是这样的。早期,人们正在尝试找出如何高效存储和查找数据,他们创建并尝试使用图形和网络式数据库模型。这些被设计为物理模型反映逻辑模型,所以它们的效率并不那么高。这种数据结构对半结构化数据很好,但对于结构密集的数据来说就不太好了。因此,这位名叫 Codd 的IBM工程师研究了安排和存储结构化数据的有效方式,并想出了关系型数据库模型的概念。这很好,人们感到很满意。

这里我们有什么呢?两个工具分别用于两个不同的目的。图数据库模型非常适合表示半结构化数据以及实体之间的关系(可能存在也可能不存在)。关系数据库适用于具有非常静态架构且连接深度不太深的结构化数据。一个适用于一种数据类型,另一个适用于其他数据类型。

总之,没有银弹这个说法。认为图形数据库模型已经过时,并且使用它放弃了40年的进步是非常短视的。这就像说使用C语言放弃了我们所经历的所有技术进步,以获得类似Java和C#之类的东西。但事实并非如此。 C是必要的某些任务的工具。而Java是其他任务的工具。


15

多年来,我一直使用MySQL来管理工程数据,并且一直很好用,但我们曾经遇到的一个问题(但没有意识到)是我们总是不得不事先计划模式。另一个我们知道的问题是将数据映射到域对象和返回。

现在我们刚开始尝试使用neo4j,看起来它解决了我们的这两个问题。每个节点(和关系)添加不同属性的能力使我们重新思考了数据的整个处理方式。就像动态语言(Ruby)与静态语言(Java)之间的区别,但是对于数据库而言。可以以更加敏捷和动态的方式在数据库中构建数据模型,从而大大简化我们的代码。

由于代码中的对象模型通常是图形结构,因此从数据库中进行映射也更加简单,代码量更少,因此漏洞也较少。

作为额外的奖励,我们的最初用于将数据加载到neo4j中的原型代码实际上比以前的MySQL版本运行速度更快。我还没有确切的数字(但这是一个很好的额外功能)。

但归根结底,选择可能主要应基于您领域模型的本质。它是否更适合映射到表格或图形?通过制作一些原型,加载数据并进行操作来决定。使用neoclipse查看数据的不同视图。完成这些后,希望您知道是否正在做正确的事情。


1
目前我没有任何使用图形数据库的业务需求。这可能是因为除了关系数据库管理系统之外,我认为没有其他合适的选择。很有可能大部分时间我都是把方形木块塞进圆形洞里。基于图形的数据库对我来说是全新的视角。我曾经使用过基于场景图的持久化框架(Java3D、Xith3D),但那只是用于存储图形应用程序。整个对话给了我一个新的视角。有没有任何应用程序参考可以使用基于图形的数据库,以便我可以亲眼看到其运作情况! - Khangharoth

5

4
我正在公司建立一个内部网络。 我想了解如何将存储在不同表格(Oracle,MySQL,SQL Server,Excel,Access和其他随机列表)中的数据加载到NeoJ或其他图形数据库中。特别是当公共数据与系统中已有的数据重叠时会发生什么。是的,我知道某些数据最好在RDBMS中进行建模,但是我有这个想法让我痒痒,即当您需要叠加几个不同的表格时,图形模型比表格结构更好。例如,我在制造环境中工作。我们正在进行一个重大项目,由于复杂性,每个部门都创建了一个单独的Excel电子表格,其中左侧列中有BOM(物料清单)层次结构,然后是由制作这些表格的个人制作的多列笔记和检查。因此,其中一个问题是将所有这些注释合并到一个“视图”中,以便某人可以看到需要在任何特定零件中解决的所有问题。
第二个问题是,当一个公共组件被用在多个子装配中时,Excel电子表格无法很好地表示层次结构BOM。这意味着,如果有人在点火子装配中写有关P34继电器的注释,则应将相同的注释与马达驱动子装配中使用的P34继电器相关联。但这在Excel电子表格中不会发生。
对于公司内网,我希望能够轻松搜索任何东西,如与零件号、BOM结构、电话号码、电子邮件地址、公司政策或流程相关的数据。我甚至想扩展此功能以管理计算机硬件资产和安装的软件。
我设想一旦信息网络开始被填充,你就可以开始进行酷炫的遍历,例如“我想给所有参与XYZ项目的人写一封电子邮件”。人们将与该项目相关联,因为他们将被标记为创建和修改XYZ项目中的数据。因此,通过使用XYZ项目作为搜索关键字,将创建一个包含与XYZ项目相关的所有内容的巨大集合。这包括链接到构建XYZ项目的人的链接。人们的链接将连接到他们的电子邮件地址。因此,通过他们在XYZ项目中的参与,他们将被包括在我的电子邮件中。这与某些秘书试图维护工作在项目上的人员名单形成了鲜明对比。我们生成了很多列表。我们花费了很多时间来维护列表并确保它们是最新的。而其中大部分都没有为我们的产品增加任何价值。
另一个很酷的遍历可以报告安装了特定软件的所有计算机,按版本。该报告可用于生成任务以删除旧软件的额外副本,并更新需要最新副本的人员。它还可用于许可证跟踪。

@Paul Bock:我认为使用neo4j来解决这种问题会非常合适。如果你加入邮件列表,我相信你可以从社区中获得很多帮助:http://neo4j.org/community/list/ - nawroth
2
我不明白为什么不能在关系型数据库中完成这个任务。我有什么遗漏吗? - Andrew Harry
5
我认为任何关于“NoSQL”的讨论,除非涉及扩展,否则都不会集中讨论关系型数据库做不到的事情。对我来说,它通常是关于一个解决方案有多自然、解决你的问题有多高效等问题。 - Eelco

3
可能有点晚,但是使用Neo4j的项目越来越多了,其中比较著名的可以在Neo4j上列出。此外,Neo4j背后的公司NeoTechnology也在其客户页面上提供了一些参考信息。

注意:我是Neo4j团队的一员


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