小编n4n*_*ite的帖子

关于Neo4j中数学计算的元数据建模

我是论坛的新手,刚刚开始使用Neo4J.为我冗长的问题和背景信息道歉,但我认为这有助于解释我想要解决的问题.

我经常为公司从事商业智能和数据仓库项目.当我们创建商业智能需求时,我们通常需要创建一个我们感兴趣的业务指标列表(销售收入,利润率,总费用),并记录如何使用我们的底层系统的数据属性计算这些业务指标.通常,我们以数据要求电子表格的形式记录excel中的大部分工作.我们创建一个业务指标列表,然后创建一堆列,其中包含描述,源数据属性,计算等.我正在尝试做的事情(作为个人方项目)是开发一个应用程序,我们可以用它来记录这种类型的而是元数据信息.我已经阅读了一些Neo4j书籍和在线文章,我认为Neo4j非常适合这个用例,现在我正在尝试记录基本数据模型以帮助我入门.

起初我想出了一些相当直接的东西,如左下图所示,从以下几点开始:

销售收入= Unit_Price*Count_Units_Sold

首次尝试建模度量和属性

然而,我很快意识到计算本身对我来说非常重要,我可能稍后想要获取有关它的更多信息,例如添加不同版本的计算或添加注释以进一步描述它.我根据左上方的图像修改了模型,使"计算本身"成为一个单独的节点.

但是,当我开始研究更复杂的指标时,我仍然不确定如何最好地表示计算的细节.如果我采用以下示例,我将按如下方式对其进行建模.

薪水= Salary_Amount + Overtime_Amount - 税额

更复杂的例子

现在这清楚地表示了计算中使用的数据属性(3或它们),但我不知道如何表示计算本身.例如,通过首先将Salary_Amount添加到Overtime_Amount然后减去Tax_Amount来定义计算.当我有更复杂的计算涉及除法和乘法时需要按特定顺序执行时,这将变得更加复杂.基本上我希望能够从模型推断出计算如下:

薪水= Salary_Amount + Overtime_Amount - 税额

相反:

薪水=薪资_安装*税额/加班金额

要么:

薪水=税额*加班金额 - 工资金额

我正在寻找一些方法来定义计算节点,从而我可以对数据属性的使用方式进行排序.可能我应该将计算存储为计算属性中的文本字符串,但我不禁认为这可能会让我感到痛苦,并限制我在多个时候从图中获取有用信息的能力数据属性用于不同的计算.

注意:我确实在论坛上看到了类似主题的这个问题,但没有收到很多回复,所以即使我的问题类似,我提供更多的背景信息可能会带来更多的见解.

非常感谢,迈克尔


我在回顾@ChristopheWillemsen和@ stdob--的答案后正在编辑这个问题.

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

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

方法1之后的基本计算

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

新的索赔计数

这就是我对@ChristopheWillemsen在下面第一个答案中提供的解决方案进行建模的方法.

新索赔计数建模

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

  • 重构逻辑,以便我可以将它呈现给最终用户
  • 回答诸如此属性所需的指标之类的问题.
  • 执行假设分析(例如,如果属性值更改了对使用此属性的指标的影响.

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

neo4j graph-databases

6
推荐指数
1
解决办法
499
查看次数

NullPointer在Neo4j Cypher Query中使用apoc.map.fromPairs

我使用下面的代码返回来自特定节点(id(65))的3个面向内的边的所有节点,并在apoc.map.fromPairs过程的帮助下将结果格式化为JSON Graph.如果没有距离起始节点3个边缘的节点,则会收到错误.

当我包含OPTIONAL语句时,似乎apoc.map.fromPairs过程会抛出针对用于模式缺失部分的"null"运行的下面的错误.

无法调用函数apoc.map.fromPairs:引起:java.lang.NullPointerException

任何建议我如何克服这一点.我尝试编写一个CASE语句来检查地图中是否有任何键但是无法使其工作.

*******************************************************************************************
// ** 
// ** Author: MOS
// ** Date: 02/03/2017
// ** Description: Returns all nodes and relationships that are within 3 inward
// ** hops of the requested node. The response is formatted as Graph JSON.
// ** 
// *******************************************************************************************
OPTIONAL MATCH (l0) <-[r1]- (l1) <-[r2]- (l2) <-[r3]- (l3)
WHERE ID(l0) = 65
WITH [
       {
            id: id(l0),
            label: labels(l0),
            type:"",
            metadata: apoc.map.fromPairs([key IN keys(l0) | [key, l0[key]]])  
        },
        {
            id: …
Run Code Online (Sandbox Code Playgroud)

neo4j cypher neo4j-apoc

1
推荐指数
1
解决办法
345
查看次数

标签 统计

neo4j ×2

cypher ×1

graph-databases ×1

neo4j-apoc ×1