将多地点库存流建模为图表
Modelling multi location inventory flow as graph
我正在尝试将给定时间段内的库存流量建模为图表。信息存储在 RDBMS 或 CSV 文件中。
我要完成的表示是转换以下 table:
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
像这样:
我正在尝试使用 neo4j 来执行此操作,但我是这项业务的新手。
欢迎提出建议!
谢谢。
在为图形数据库建模时,将数据模型中的重要实体建模为节点通常是有意义的。如果您计划按属性查找信息,这将特别有用,因为索引和唯一约束适用于节点上的 label/properties 并允许快速查找。
在您当前的模型中,您在关系中存储了重要数据(交易类型、产品类型、产品金额),并且根据您要对该数据进行的查询类型,您可能无法在这种形式。例如,如果您想查询所有产品在一段时间内发生的所有交易。由于关系及其属性未编入索引,因此必须搜索所有关系,并且随着关系数量的增加,查询的效率会逐渐降低。
最终归结为您计划对数据进行何种查询。如果您提出的模型允许您高效(即使使用大型数据集)轻松地进行这些查询,并且您认为您计划编写的未来查询也将高效且简单,那么它就可以了。
作为一种可能的替代模型,考虑将交易建模为不是关系,而是:交易节点(您可以另外标记交易类型以加速仅限于特定类型交易的查询)。
A :Transaction 节点可能具有以下属性:
- 产品(索引)
- 数量
- 交易时间(索引)
它可能与 :Location 节点有关系,如下所示:
(:Location)-[:Txn_Out]->(:Transaction)-[:Txn_To]->(:Location)
在这里选择正确的关系类型可能很棘手。一方面,您希望关系在语义上是正确的。而且,在您的情况下,对产品流进行建模并能够将其可视化也很重要。如果我们改用 :From 和 :To 关系,那么对它们进行建模的语义正确方法将始终从 :Transactions 向外,并始终向内到 :Locations。虽然这没有什么问题,而且您的查询会很好,但图形的可视化可能会令人困惑,因为您无法通过单独查看关系方向来轻松地看到产品流(因为 :From 和 :To 关系总是进入 :Location)。如何对此建模取决于您。我上面对 :Txn_Out 和 :Txn_To 的建议是我能想到的最好的建议,它保留了语义并保持关系方向以一种方式流动。
将节点用于 :Transactions 的另一个优势是在废品交易或任何产品不会流向图中任何其他节点的交易的情况下。 Neo4j 不允许悬空关系,关系必须连接两个现有节点,因此您不能像图中那样对报废交易进行建模。如果您有一个 :Transaction:Scrap 节点,您所需要的只是从相关位置到该节点的 :Txn_Out 关系,而无需在其他任何地方建立 :Txn_To 关系。
如果您想为每个产品建模更多数据,我建议创建 :Product 节点来保存这些属性并将它们附加到涉及这些产品的 :Transactions:
(:Transaction)-[:Product]->(:Product)
此外,关于您的 date/time 数据,Neo4j 以毫秒为单位对 UTC 时间进行建模(例如使用 timestamp() 函数),并且对字符串表示形式的解析或格式化没有很好的支持。我强烈建议安装 APOC 程序库,它支持 Date/Time operations 以及许多其他有用的函数和程序。
我正在尝试将给定时间段内的库存流量建模为图表。信息存储在 RDBMS 或 CSV 文件中。
我要完成的表示是转换以下 table:
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
像这样:
欢迎提出建议!
谢谢。
在为图形数据库建模时,将数据模型中的重要实体建模为节点通常是有意义的。如果您计划按属性查找信息,这将特别有用,因为索引和唯一约束适用于节点上的 label/properties 并允许快速查找。
在您当前的模型中,您在关系中存储了重要数据(交易类型、产品类型、产品金额),并且根据您要对该数据进行的查询类型,您可能无法在这种形式。例如,如果您想查询所有产品在一段时间内发生的所有交易。由于关系及其属性未编入索引,因此必须搜索所有关系,并且随着关系数量的增加,查询的效率会逐渐降低。
最终归结为您计划对数据进行何种查询。如果您提出的模型允许您高效(即使使用大型数据集)轻松地进行这些查询,并且您认为您计划编写的未来查询也将高效且简单,那么它就可以了。
作为一种可能的替代模型,考虑将交易建模为不是关系,而是:交易节点(您可以另外标记交易类型以加速仅限于特定类型交易的查询)。
A :Transaction 节点可能具有以下属性:
- 产品(索引)
- 数量
- 交易时间(索引)
它可能与 :Location 节点有关系,如下所示:
(:Location)-[:Txn_Out]->(:Transaction)-[:Txn_To]->(:Location)
在这里选择正确的关系类型可能很棘手。一方面,您希望关系在语义上是正确的。而且,在您的情况下,对产品流进行建模并能够将其可视化也很重要。如果我们改用 :From 和 :To 关系,那么对它们进行建模的语义正确方法将始终从 :Transactions 向外,并始终向内到 :Locations。虽然这没有什么问题,而且您的查询会很好,但图形的可视化可能会令人困惑,因为您无法通过单独查看关系方向来轻松地看到产品流(因为 :From 和 :To 关系总是进入 :Location)。如何对此建模取决于您。我上面对 :Txn_Out 和 :Txn_To 的建议是我能想到的最好的建议,它保留了语义并保持关系方向以一种方式流动。
将节点用于 :Transactions 的另一个优势是在废品交易或任何产品不会流向图中任何其他节点的交易的情况下。 Neo4j 不允许悬空关系,关系必须连接两个现有节点,因此您不能像图中那样对报废交易进行建模。如果您有一个 :Transaction:Scrap 节点,您所需要的只是从相关位置到该节点的 :Txn_Out 关系,而无需在其他任何地方建立 :Txn_To 关系。
如果您想为每个产品建模更多数据,我建议创建 :Product 节点来保存这些属性并将它们附加到涉及这些产品的 :Transactions:
(:Transaction)-[:Product]->(:Product)
此外,关于您的 date/time 数据,Neo4j 以毫秒为单位对 UTC 时间进行建模(例如使用 timestamp() 函数),并且对字符串表示形式的解析或格式化没有很好的支持。我强烈建议安装 APOC 程序库,它支持 Date/Time operations 以及许多其他有用的函数和程序。