【问题标题】:Could it make sense to schedule an export of SQL database to NoSQL for graphical data mining?安排将 SQL 数据库导出到 NoSQL 以进行图形数据挖掘是否有意义?
【发布时间】:2015-06-04 14:49:57
【问题描述】:

安排将我的 SQL 数据库导出到图形数据库(例如 Neo4j)以生成诸如here 之类的交互式关系图形对我来说有意义吗?

更新: 或者通过扩展,我什至应该寻求转移到图形数据库吗?

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

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

项目:

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 数据库中,我希望能够直观地看到以下内容:

  • 物品经过的人流(以及每个关系的日期)
  • 每个人/仓库有哪些物品(在给定日期)
  • 哪些人在哪些仓库(在给定日期)

【问题讨论】:

  • 如果有什么东西可以减少你的工作量,帮助你更好地组织,隔离功能或者只是让你的事情变得更容易——那么是的,这当然是有道理的。我们有使用它们的工具,因此,如果您使用两种工具来帮助自己或您的用户 - 那太棒了,这就是要走的路。
  • 感谢您的快速和令人鼓舞的反馈......我想我无法完全解决的问题(我现在会更新问题)是我应该改变吗?我的生产数据库到 Neo4j,而不是每隔几天从关系数据库中提取一个
  • 组织方式由您决定。没有什么能阻止您同时插入关系数据库和 NoSQL。我假设您有某些代码可以处理使用信息填充数据库 - 为什么不插入两者?

标签: mysql neo4j graph-databases extraction nosql


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    • 我能否在不迁移/添加新数据源的情况下进行图形表示(使用 MySQL)?
    • 使用这种图形界面时,我希望达到什么程度的效率?
    • 万一添加新数据源有多容易?

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

    根据人数和用户类型(内部或外部、分析师或非分析师等),这可能是决定的另一个驱动因素。

    关于第三个问题,我认为@Zim-Zam O'Pootertoot 已经涵盖了它,而没有写出另一个答案的副本。像往常一样,对于许多数据源,问题总是要保持同步以及实体解析问题(使用相同的数据集可以最小化)。

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

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

    如果您想对基于时间的图表进行建模,请注意目前还没有针对任何数据源的防弹解决方案。

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 2014-10-14
      • 1970-01-01
      • 2011-10-12
      • 2011-02-07
      • 2012-09-24
      • 2013-08-01
      • 2016-05-10
      • 1970-01-01
      相关资源
      最近更新 更多