【问题标题】:gremlin - how to multiply "carried" propertiesgremlin - 如何乘以“携带”属性
【发布时间】: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


【解决方案1】:

我使您的示例数据更加稳健:

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:[]]

【讨论】:

    猜你喜欢
    • 2019-09-17
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多