首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4j中数学计算的元数据建模

Neo4j中数学计算的元数据建模
EN

Stack Overflow用户
提问于 2017-02-03 10:53:29
回答 2查看 992关注 0票数 6

我是新来的论坛和刚刚起步的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 *税额/加班费

或者:

工资=税额*加班费-工资数额

我正在寻找某种方法来定义计算节点,这样我就可以将排序应用于数据属性的使用方式。也许我应该将计算作为文本字符串存储在计算的属性中,但我不得不认为这可能会导致我在不同的计算中使用多个数据属性时,从图中获取有用信息的能力受到限制。

注意:我确实在论坛上看到了这个问题,这个论坛的主题是相似的,但没有收到多少回复,所以尽管我的问题很相似,但我认为提供更多的背景信息可能会带来一些更深入的见解。

非常感谢,迈克尔

我是在复习了@ChristopheWillemsen和@stdob的答案之后编辑这个问题的。

首先,非常感谢这两个贡献者。答案和参考资料非常有用,都满足了我的要求。最初,我倾向于按照@stdob的答案使用反向波兰符号,因为它提供了一种处理分组操作的简洁方法(例如,我的数学公式中的括号)。然而,在尝试用这两种方法对数据建模之后,我发现我有一些额外的需求,这在我的第一篇文章中没有提到,这就是捕获逻辑表达式,比如“If,Where,which”。基本上,我希望能够捕获ETL类型的转换规则,它超越了纯数学表达式,我认为@ChristopheWillemsen的解决方案将支持这一点。

下面是我如何使用这种方法建模我的基本公式:

然而,我也有更复杂的逻辑,我想建模。这些是ETL类型的规则,通常在定义数据仓库或BI项目的业务需求时会捕获为伪代码或SQL形式。下面是一个例子,在这个例子中,我定义了ETL如何计算保险公司的新索赔计数度量的逻辑。

这就是我如何根据@ChristopheWillemsen在下面的第一个答案中提供的解决方案来建模这个扩展。

你能看看这个,看看这是否是一个合适的方式来建模。从需求的角度来看,我希望能够:

  • 重新构造逻辑,以便我可以将它返回给最终用户。
  • 回答诸如需要该属性的度量标准等问题。
  • 执行什么-如果-如果-分析(例如,如果属性值发生变化,那么对使用该属性的指标的影响是什么。

这看起来像一种对这类信息进行建模的合适方法吗?欢迎有任何建议或改进吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-03 11:39:43

这是一个非常有趣的用例,对我来说,它接近我们所说的规则引擎。

我在neo4j博客上发布了一个关于它的用例:https://neo4j.com/blog/uncommon-use-cases-graph-databases/

当然,实现你想要的东西有多种方法,我会分享我心中的一种方式。

我会把计算看作是Operations的有序列表,不同的性质由它们的标签来定义。例如,您将有一个Operation节点有一个附加的标签Addition,它的下一个操作可以是一个带有标签SubstractionOperation节点。

一个简单的模型可以这样表示:

然后,您的Operation节点将引用它们正在使用的传入值。

在更复杂的情况下,您希望表示一组操作,这些操作可以在括号之间定义一个数学分组,同样可以这样做:

可能性几乎是无限的。

注意,在计算机科学中,这种技术也被称为规范模式:https://www.martinfowler.com/apsupp/spec.pdf

票数 6
EN

Stack Overflow用户

发布于 2017-02-03 12:21:01

第一个选项是用反向波兰表示法编写表达式,并将其存储在有序树中:

代码语言:javascript
复制
Salary_Amount * Tax_Amount / Overtime_Amount
=>
Salary_Amount Tax_Amount * Overtime_Amount /

想到的第二个选项是:将公式保留为文本形式,并在任何脚本语言中发送参数的公式和值以运行。例如,在javascript eval中。

我还建议阅读本文:电子表格也是图表。

Upd:如何使用密码和apoc库计算公式的想法:

代码语言:javascript
复制
WITH "{Salary_Amount} * {Tax_Amount} / {Overtime_Amount}" as Formula
CALL apoc.cypher.run("return " + Formula + " as value", {
  Salary_Amount: 1000,
  Tax_Amount: 0.49,
  Overtime_Amount: 100
}) yield value as result
RETURN result.value
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42022564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档