【发布时间】:2017-02-03 10:53:29
【问题描述】:
我是论坛的新手,刚刚开始使用 Neo4J。为我冗长的问题和背景信息道歉,但我认为这有助于解释我试图理解的内容。
我经常为公司从事商业智能和数据仓库项目。当我们创建商业智能需求时,我们通常需要创建一个我们感兴趣的业务指标列表(例如销售收入、利润率、总费用),并记录如何使用来自我们底层系统的数据属性计算这些业务指标。 通常,我们以数据需求电子表格的形式在 excel 中记录大部分此类工作。我们创建了一个业务指标列表,然后是一堆带有描述、源数据属性、计算等的列。我想做的(作为个人项目)是开发一个应用程序,我们可以用它来记录这种类型的而是元数据信息。我已经阅读了一些 Neo4j 书籍和在线文章,我认为 Neo4j 非常适合这个用例,现在我正在尝试记录一个基本数据模型来帮助我入门。
起初我想出了一些相当简单的东西,如下图左图所示:
销售收入 = Unit_Price * Count_Units_Sold
但是,我很快意识到计算本身对我来说非常重要,并且我以后可能想要获取有关它的更多信息,例如添加不同版本的计算或添加注释以进一步描述它。我修改了模型,使“计算本身”成为一个单独的节点,如左上图所示。
但是,当我开始查看更复杂的指标时,我仍然不确定如何最好地表示计算的细节。如果我采用以下示例,我将对其建模如下。
薪水 = Salary_Amount + Overtime_Amount - 税额
现在这清楚地表示了计算中使用的数据属性(3 或它们),但我不知道如何表示计算本身。例如。定义通过首先将 Salary_Amount 添加到 Overtime_Amount 然后减去 Tax_Amount 来完成计算。当我有更复杂的计算涉及需要以特定顺序执行的除法和乘法时,这将变得更加复杂。 本质上我希望能够从模型中推断出计算如下:
薪水 = Salary_Amount + Overtime_Amount - 税额
相对于:
薪水 = Salary_Amount * 税额/加班费
或者:
工资=税额*加班费-工资额
我正在寻找某种方式来定义计算节点,借此我可以将排序应用于数据属性的使用方式。可能我应该将计算作为文本字符串存储在计算的属性中,但我不禁认为这可能会导致我在路上痛苦并限制我从图表中获取有用信息的能力。数据属性用于不同的计算。
注意:我确实在论坛上看到了类似主题的this question,但没有收到很多回复,所以即使我的问题相似,但提供更多背景信息可能会带来一些进一步的见解。
非常感谢, 迈克尔
在查看@ChristopheWillemsen 和@stdob-- 的答案后,我正在编辑这个问题。
首先非常感谢两位贡献者。答案和参考资料真的很有帮助,都涵盖了我的要求。最初,根据@stdob 的回答,我倾向于使用逆波兰表示法——因为它提供了一种处理分组运算的简洁方法(例如,我的数学公式中的括号)。然而,在尝试以两种方式对我的数据进行建模后,我发现我还有一些我在第一篇文章中没有涵盖的额外要求,即捕获逻辑表达式,例如“如果、在哪里、有”。基本上我希望能够捕获超出纯数学表达式的 ETL 类型转换规则,我认为@ChristopheWillemsen 的解决方案将支持这一点。
以下是我使用这种方法对基本公式进行建模的方式:
但是,我还想建模更复杂的逻辑。这些是 ETL 类型规则,在定义数据仓库或 BI 项目的业务需求时,通常会以伪代码或 SQL 的形式捕获。下面是一个示例,其中我定义了 ETL 如何计算保险公司的新索赔计数指标的逻辑。
这就是我如何根据@ChristopheWillemsen 在下面的第一个答案中提供的解决方案对这种扩展进行建模。
你能看看这个,看看这是否是一个合适的建模方法。从需求的角度来看,我希望能够:
- 重构逻辑,以便我可以将其呈现给最终用户
- 回答问题,例如哪些指标需要此属性。
- 进行假设分析(例如,如果属性值发生变化,对使用该属性的指标有何影响。
这看起来像是对此类信息建模的合适方法吗?欢迎提出任何建议或改进?
【问题讨论】:
-
我也刚看到这篇有趣的文章:blog.socratic.org/…
标签: neo4j graph-databases