【发布时间】:2020-11-26 10:28:54
【问题描述】:
给定下图:
- 具有“名称”属性的“公司”类型的顶点
- 持有“控股”属性的“股东”类型的边。
定义:
- 受益人:直接或间接持有公司股份的公司
图表示例:
-CompanyB 持有 companyC 的 0.5 - CompanyA 持有 companyB 的 0.5。两家公司都被视为公司C的受益人(各自分别直接持有0.5股和间接持有0.25股
创建示例:
// create an empty graph
graph = TinkerFactory.createModern()
g = graph.traversal()
g.V().drop()
// create data
companyA = g.addV('Company').property('name', 'A').next()
companyB= g.addV('Company').property('name', 'B').next()
companyC = g.addV('Company').property('name', 'C').next()
g.addE("Shareholder").from(companyB)
.to(companyC).property("holding",0.5)
g.addE("Shareholder").from(companyA)
.to(companyB).property("holding", 0.5)
所需的解决方案:
- 我想计算 CompanyC 的受益人及其在公司中的持股。
- 我只对两个层次感兴趣(例如,我不在乎 A 公司的股东)
- 我确实想保留控股等级。
解决方案示例:
[{
name:"B",
holding:0.5,
shareholders:[
{
name:"A",
holding:0.25
}
]}
]
}]
我的尝试:
// js
let companyCBeneficiaries =await g.V(companyC.id)
.inE()
.project(
"holding",
"name",
"shareholders"
)
.by(__.identity().values("holding"))
.by(__.coalesce(__.outV().values("name") , __.constant("")))
.by(
__.coalesce(
__.outV().inE().project(
"name",
"holding"
)
.by(__.coalesce(__.outV().values("name") , __.constant("")))
.by(__.identity().values("holding"))
,
__.constant([])
)
)
.toList()
// console
g.V(companyC).inE().project("holding","name","shareholders")
.by(__.identity().values("holding"))
.by(__.coalesce(__.outV().values("name") ,__.constant("")))
.by(__.coalesce(__.outV().inE().project("name","holding")
.by(__.coalesce(__.outV().values("name") ,
__.constant("")))
.by(__.identity().values("holding"))
,__.constant([]))).toList()
这导致 CompanyA.holding = 0.5 而不是 0.25(目前正在迭代 companyCBeneficiaries 修复控股财产)
【问题讨论】:
-
图片很好,但请您提供一个 Gremlin 脚本来创建一些示例数据 - 这是一个示例 stackoverflow.com/questions/51388315/… - 这样您就可以获得经过全面测试的遍历作为答案
标签: javascript gremlin amazon-neptune