如何解决树结构数据的图数据库或关系数据库
我有公司按年份持有分层结构的数据。比如A公司持有B的50%,B持有C的50%,D持有C的50%。每个公司都有自己的属性,比如行业。
写操作很少,主要是读。具体来说,从一组节点(根)开始,通过跟踪一定百分比的份额阈值来提取家谱。家谱中有几个值得关注的指标。
对于每个节点:
- 从根开始的深度
- 从根开始逐层共享的产物,例如A 持有 0.5*0.5 = C 的 25%。
对于每个级别:
- 每个根的共享分配
- 产业分布
请注意,每个节点可能有多个根,我们对所有根都感兴趣。
目前,数据存储在关系数据库中,并且通过加入完成上述任务。像neo4j这样的图形数据库会更适合数据和这个任务吗?问题的关键是要有一个合适的索引,这样就不需要每次都加入。任何建议和指针将不胜感激。
解决方法
几乎任何图形数据库都可以对您所描述的信息进行建模。您构建查询以获得所需内容的方式在每个产品中都会有所不同。
在 InfiniteGraph 中,我们可以使用以下模式对信息进行建模:
UPDATE SCHEMA {
CREATE CLASS Company {
name : String,industry : String,owns : LIST {
element: Reference {
edgeClass : Owns,edgeAttribute : owns
},CollectionTypeName : SegmentedArray
},ownedBy : LIST {
element: Reference {
edgeClass : Owns,edgeAttribute : ownedBy
},CollectionTypeName : SegmentedArray
}
}
CREATE CLASS Owns
{
percentage : Real { Storage: B32 },owns : Reference {referenced: Company,inverse: ownedBy },ownedBy : Reference {referenced: Company,inverse: owns }
}
};
然后我们可以加载您在问题中提到的数据:
LET coA = CREATE Company { name: "A",industry: "Manufacturing" };
LET coB = CREATE Company { name: "B",industry: "Manufacturing" };
LET coC = CREATE Company { name: "C",industry: "Retail" };
LET coD = CREATE Company { name: "D",industry: "Construction" };
CREATE Owns { owns: $coB,ownedBy: $coA,percentage: 50.00 };
CREATE Owns { owns: $coC,ownedBy: $coB,ownedBy: $coD,percentage: 50.00 };
最后,我们可以定义一个权重计算器运算符,它可以有效地将一条路径上的边权重相乘。在这里,我们将每条边的权重表示为 1/百分比,然后最后我们再次翻转总和,这为我们提供了您正在寻找的值。
CREATE WEIGHT CALCULATOR wcOwnership {
minimum: 0,default: 0,edges: {
(:Company)-[ow:Owns]->(:Company): 1/ow.percentage
}
};
“edges”部分定义了要匹配的边模式以及要执行的计算以计算该边的边权重。在 InfiniteGraph 中,边权重不必是属性;它可以是简单的属性,也可以是基于一个或多个对象的内容进行复杂计算的结果。
在给定的数据上,我们可以使用权重计算器从目标公司 (C) 向上查询层次结构,对于发现的每个根,我们可以显示目标 (C)、所有权百分比、长度路径,以及根公司的名称。这个特定的查询只有 1 到 10 度 ([*1..10]),但可以根据需要扩展这个数字。
DO> Match m = max weight 1000.0 wcOwnership
((cTarget:Company {name == 'C'})-[*1..10]->(cRoot:Company))
return cTarget.name,1/Weight(m) as PercentageOwnership,Length(m),cRoot.name;
{
_Projection
{
cTarget.name:'C',PercentageOwnership:50.0000,Length(m):1,cRoot.name:'B'
},_Projection
{
cTarget.name:'C',cRoot.name:'D'
},PercentageOwnership:25.0000,Length(m):2,cRoot.name:'A'
}
}
此模型将捕获每个相关公司的所有根节点。
#InfiniteGraph
,Neo4j 非常适合这里。
Neo4j 确实使用索引来查找图中的起点,例如您的根节点。如果您只是使用它来获取根节点,那么这就是整个查询的单个索引查找。
从那里开始,遍历树只是遍历关系,这只是指针跳跃节点引用-> 关系引用-> 节点引用等。不涉及连接。然后,您只需处理每条路径节点中的数字即可获得百分比。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。