gremlin - 如何乘以 "carried" 属性
gremlin - how to multiply "carried" properties
给定下图:
- 持有“名称”的“公司”类型的顶点属性
- 持有“持股”的“股东”类型边 属性 .
定义:
- 受益人:直接或间接持有公司
的公司
图形示例:
-CompanyB 持有 companyC 的 0.5 - CompanyA 持有 companyB 的 0.5。两家公司都被视为 companyC 的受益人(每家分别直接持有 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)
所需的解决方案:
- 我想计算公司C的受益人及其在公司的持股。
- 我只对两个层面感兴趣(例如,我不关心公司 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 固定持股 属性)
我使您的示例数据更加可靠:
g = TinkerGraph.open().traversal()
companyA = g.addV('Company').property('name', 'A').next()
companyB = g.addV('Company').property('name', 'B').next()
companyC = g.addV('Company').property('name', 'C').next()
companyD = g.addV('Company').property('name', 'D').next()
companyE = g.addV('Company').property('name', 'E').next()
g.addE("Shareholder").from(companyB).to(companyC).property("holding",0.5)
g.addE("Shareholder").from(companyA).to(companyB).property("holding", 0.5)
g.addE("Shareholder").from(companyD).to(companyC).property("holding", 0.5)
g.addE("Shareholder").from(companyE).to(companyB).property("holding", 0.5)
并使用了 sack()
,我认为它可以满足您的需求:
gremlin> g.V().has('Company','name','C').
......1> inE('Shareholder').
......2> sack(assign).by('holding').
......3> project('name','holding','shareholders').
......4> by(outV().values('name')).
......5> by(sack()).
......6> by(outV().
......7> inE('Shareholder').
......8> sack(mult).by('holding').
......9> project('name','holding').
.....10> by(outV().values('name')).
.....11> by(sack()).
.....12> fold())
==>[name:B,holding:0.5,shareholders:[[name:A,holding:0.25],[name:E,holding:0.25]]]
==>[name:D,holding:0.5,shareholders:[]]
给定下图:
- 持有“名称”的“公司”类型的顶点属性
- 持有“持股”的“股东”类型边 属性 .
定义:
- 受益人:直接或间接持有公司 的公司
图形示例:
-CompanyB 持有 companyC 的 0.5 - CompanyA 持有 companyB 的 0.5。两家公司都被视为 companyC 的受益人(每家分别直接持有 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)
所需的解决方案:
- 我想计算公司C的受益人及其在公司的持股。
- 我只对两个层面感兴趣(例如,我不关心公司 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 固定持股 属性)
我使您的示例数据更加可靠:
g = TinkerGraph.open().traversal()
companyA = g.addV('Company').property('name', 'A').next()
companyB = g.addV('Company').property('name', 'B').next()
companyC = g.addV('Company').property('name', 'C').next()
companyD = g.addV('Company').property('name', 'D').next()
companyE = g.addV('Company').property('name', 'E').next()
g.addE("Shareholder").from(companyB).to(companyC).property("holding",0.5)
g.addE("Shareholder").from(companyA).to(companyB).property("holding", 0.5)
g.addE("Shareholder").from(companyD).to(companyC).property("holding", 0.5)
g.addE("Shareholder").from(companyE).to(companyB).property("holding", 0.5)
并使用了 sack()
,我认为它可以满足您的需求:
gremlin> g.V().has('Company','name','C').
......1> inE('Shareholder').
......2> sack(assign).by('holding').
......3> project('name','holding','shareholders').
......4> by(outV().values('name')).
......5> by(sack()).
......6> by(outV().
......7> inE('Shareholder').
......8> sack(mult).by('holding').
......9> project('name','holding').
.....10> by(outV().values('name')).
.....11> by(sack()).
.....12> fold())
==>[name:B,holding:0.5,shareholders:[[name:A,holding:0.25],[name:E,holding:0.25]]]
==>[name:D,holding:0.5,shareholders:[]]