将 SQL 数据库导出到 NoSQL 以进行图形数据挖掘是否有意义?

Could it make sense to schedule an export of SQL database to NoSQL for graphical data mining?

我安排将我的 SQL 数据库导出到图形数据库(例如 Neo4j)以生成关系的交互式图形(例如 here)是否有意义?

更新: 或者推而广之,我是否应该完全转向图形数据库?

我的图形数据库不需要是关系数据库的实时反映 - 每隔几天提取一次就足够了。

就我而言,我目前有一个关系数据库 (MySQL),我在其中记录在 individuals/depots 之间传递的库存商品。概念如下:

项目数:

STOCKID DISPATCHDATE
0001    2014-01-01
0002    2015-06-03

个人:

USERID FIRSTNAME
0001   Tom
0002   Jones

仓库:

DEPOTID ZIPCODE
0001    50421
0002    71028

所有者:

STOCK_ID USER_ID RECEIVED   DISPATCHED
0001     0001    2015-05-01 2015-05-10
0001     0002    2015-05-11 2015-05-20

我希望能够从 NoSQL 数据库中直观地看到诸如以下内容:

作为N.B。在评论中说,如果该工具有用,那么就使用它——最坏的情况是您发现该工具毕竟没有用,并且您停止使用它(浪费了一些时间来设置它,但这就是生活)。

一般来说,同步数据库有以下三种方式:

  1. Two Phase Commit:在一个事务中修改MySql,在另一个事务中修改Neo4j,如果其中一个事务失败则回滚两个事务;在双方都发出可以提交的信号之前,交易不会提交。这提供了最高的数据完整性,但非常昂贵。
  2. 松散同步事务:在一个事务中修改MySql,在另一个事务中修改Neo4j,如果一个成功另一个失败则重试失败的事务几次,如果仍然失败则决定如何处理做(例如,撤消成功的事务,由于事务已经提交并且值可能已被使用而变得复杂;或记录错误并要求数据库管理员手动同步数据库;或第三种选择)。这提供了良好的数据完整性并且比两阶段提交更便宜,但如果出现严重错误则更难恢复。
  3. 批量同步:修改MySql,然后在一个时间间隔(五分钟,一小时,任何合适的)之后,你根据行版本号或时间戳(注意它是如果您同步的数据太多,这不是什么大问题,因为您只是用相同的值覆盖了一个值,所以宁愿每批同步太多)。此解决方案易于编程,适用于 Neo4j 不需要最新和最大数据的情况。

我在一个类似的项目中工作,我们使用松散同步事务将 MySql 与键值 nosql 数据库(缓存昂贵的查询)同步。我们编写了一个定制的 Transaction 包装器,其中包含一个并发的副作用队列(即要对键值数据库进行的更改);如果 MySql 事务成功,那么我们将队列中的所有副作用提交到键值数据库(在暂时性网络故障的情况下重试三次,之后我们记录错误,使键无效 -值数据库条目会导致回退到 MySql,并通知了数据库管理员 - 这发生在键值数据库长时间崩溃时,并通过 运行 批处理同步解决), 否则我们丢弃它们。

我认为在开始迁移之前,有一些问题值得问问自己:

  • 我可以在没有 migrating/adding 新数据源(使用 MySQL)的情况下进行图形表示吗?
  • 使用这样的图形界面,我想要什么效率?
  • 万一添加新数据源有多容易?

您在该视频中看到的内容是由来自数据库或平面文件的某些数据的可视化组件完成的,因此我认为第一个问题的答案很可能是肯定的。

根据将要使用此类图形表示的人数和用户类型(内部或外部、分析师或非分析师等...),这可能是决策的另一个驱动因素。

关于第三个问题,我认为@Zim-Zam O'Pootertoot 已经涵盖了它,而无需重复另一个答案。像往常一样,对于许多数据源,问题总是使事物保持同步和实体解析问题(您使用相同的数据集将其最小化)。

根据我的经验,Neo4J 非常擅长的是 "pattern" 查询:给定一个特定的网络模式(使用 Cypher 语言绘制),它将应用并找到网络数据集。 当它的邻居查询也是一个 SQL 解决方案时,在小项目中,可以达到相同的结果而不会出现太多问题。当然,如果您的解决方案必须扩展到每天数百名分析师和数十万个查询,请考虑迁移。

无论如何,鉴于您的数据集,在我看来您正在处理基于时间的数据类型。在这种情况下,值得查看网络的动态行为以找到时间模式,而不是简单的网络模式。 来自您发布的视频的同一作者也看看这个其他 graphical representation

如果您想为基于时间的图表建模,请注意目前还没有针对任何数据源的万无一失的解决方案。

Here's a Neo4J tutorial 在基于时间的数据集的情况下建模和表示数据。 我敢打赌你也可以用 MySQL 做类似的事情(可能在查询时效率和优雅度较低)但我自己还没有做过来给出一些数字 - 也许其他人做过并且可以在这里添加一些基准。

免责声明:我在 KeyLines 团队工作。