将多位置库存流建模为图形

时间:2016-12-30 23:27:00

标签: graph neo4j location inventory

我试图将给定时间段内的库存流量建模为图表。信息存储在RDBMS或CSV文件中。

我想要完成的事情的表示是转换下表:

Product FromLoc ToLoc   Qty TransactionType TransactionTime
A       Loc1    Loc2    10  Move            1/1/2017 10:00
A       Loc0    Loc2    15  Move            1/1/2017 11:00
A       Loc2    Loc3    25  Move            1/1/2017 12:00
A       Loc3            5   Scrap           1/1/2017 14:00
A       Loc3    Loc4    20  Move            1/1/2017 16:00

对于这样的事情: enter image description here 我尝试使用neo4j这样做,但我对这项业务不熟悉。

欢迎提出建议!

感谢。

1 个答案:

答案 0 :(得分:0)

为图形数据库建模时,将数据模型中的重要实体建模为节点通常是有意义的。如果您计划按属性查找信息,这尤其有用,因为索引和唯一约束适用于节点上的标签/属性并允许快速查找。

在您当前的模型中,您将重要数据存储在关系中(事务类型,产品类型,产品数量),并且根据您要对此数据进行的查询类型,您可能无法以此形式查询它。例如,如果要查询所有产品在一段时间内发生的所有事务。由于关系及其属性未编入索引,因此必须搜索所有关系,并且随着关系数量的增加,查询的效率会逐渐降低。

最终,它归结为您计划对数据进行哪些类型的查询。如果您建议的模型允许您有效地(甚至使用大型数据集)轻松地进行这些查询,并且您认为您计划编写的未来查询也将是高效且简单的,那么它就很好。< / p>

作为一种可能的替代模型,可以考虑将事务建模不作为关系建模,而是考虑:事务节点(您可以另外使用事务类型标记以加速仅限于某些类型的事务的查询)。

答:事务节点可能具有以下属性:

  • 产品(已编入索引)
  • qty
  • transactionTime(已编入索引)

它可能与以下关系:位置节点如下:

(:Location)-[:Txn_Out]->(:Transaction)-[:Txn_To]->(:Location)

选择正确的关系类型在这里可能很棘手。一方面,您希望关系在语义上是正确的。但是,在您的情况下,对产品流进行建模并能够将其可视化非常重要。如果我们要使用:From和:对于关系,那么对它们进行建模的语义正确的方法总是从外部:事务,并始终向内到:位置。虽然没有任何问题,而且您的查询也很好,图表的可视化可能会让人感到困惑,因为您无法通过单独查看关系方向来轻松看到产品流(如: :关系总是会传入:位置)。它取决于你如何建模。我上面的建议:Txn_Out和:Txn_To是我能想到的最好的,它保留了语义并保持关系方向的单向流动。

使用节点的另一个优点:交易是在废品交易或产品无法流入图表中任何其他节点的任何交易的情况下。 Neo4j不允许悬空关系,关系必须连接两个现有节点,因此您无法在图表中建立废品交易建模。如果你有一个:Transaction:Scrap节点,你需要的只是:从相关位置到该节点的Txn_Out关系,并且在其他任何地方都不需要:Txn_To关系。

如果您想为每个产品建模更多数据,我建议创建:产品节点来保存这些属性并将它们附加到:涉及这些产品的事务:

(:Transaction)-[:Product]->(:Product)

此外,关于您的日期/时间数据,Neo4j模拟以毫秒为单位的时间(例如使用timestamp()函数),并且不具有对字符串表示进行解析或格式化的良好支持。我强烈建议安装APOC程序库,它支持Date/Time operations以及许多其他有用的功能和程序。