【问题标题】:How to merge two vertex result using only one edge in orientdb如何在orientdb中仅​​使用一条边合并两个顶点结果
【发布时间】:2019-08-16 02:18:31
【问题描述】:

我目前正在研究 orientdb,我很难将如何合并到行或两个结果。我只想将两个顶点合并到一条边上,我尝试了 unionall 但它在我这边不起作用,请帮助我。

我已经使用了 unionall、unwind 和 bothV(),但没有工作。

人和公司是一个顶点
is_working 是一个边缘(来自(人),到(公司))
我想合并两个顶点的结果
前任。 从 is_working where in = '13:3' 中选择 expand(bothV())
我只想获取在特定公司工作的所有用户。
预期结果:
{name:“Randolf”,性别:“Male”,company_name:“公司名称”},
{name:“Jefferson”,性别:“Male”,company_name:“公司名称”}

我已经尝试过下面的代码
选择人员、公司。* from (select person, in('is_working') as company 从(选择扩展(输出('is_working')) 从#13:2) 解散公司)

选择展开($all) 让
@a = (select expand(in('is_working') from company where @rid = '13:2'),
@b = (select expand(in('is_working').out('is_working')) from company where @rid = '13:2'),
@all = unionall(@a, @b)

没有错误,但没有显示任何结果。 当我尝试
“从 is_working where in = '13:3' 中选择 expand(bothV())”
有结果,但不是合并。
顺便说一下 13:2 和 13:3 是我公司的 RID

【问题讨论】:

    标签: orientdb


    【解决方案1】:

    假设(为简单起见,在主动式控制台中执行的任何操作)

    > V.create_class :company, :person
    # INFO->CREATE CLASS company EXTENDS V
    # INFO->CREATE CLASS person EXTENDS V
     => [Company, Person] 
    > E.create_class :is_working
    # INFO->CREATE CLASS is_working EXTENDS E
     => IS_WORKING 
    > c = Company.create name: 'C'
    # INFO->CREATE VERTEX company set name = 'C'
    > c.assign via: IS_WORKING, vertex: Person.create( name: 'A')
    # INFO->CREATE VERTEX person set name = 'A'
    # INFO->CREATE EDGE is_working from #41:0 to #49:0 
    > Person.create( name: 'B').assign( via: IS_WORKING, vertex: c)
    # INFO->CREATE VERTEX person set name = 'B'
    # INFO->CREATE EDGE is_working from #50:0 to #41:0 
    

    你得到了(特定于活动的)

     c.edges.to_human
     => ["<IS_WORKING[#58:0] :.: 50:0->{  }->41:0>", "<IS_WORKING[#57:0] :.: 41:0->{  }->49:0>"] 
    

    这基本上是我们的设置,我猜

    然后

     > c.nodes( :out, via: IS_WORKING).to_human
     # INFO->select  outE('is_working').in  from #41:0 
     => ["<Person[49:0]: in: {IS_WORKING=>1}, name : A>"] 
     > c.nodes( :in, via: IS_WORKING).to_human
     # INFO->select  inE('is_working').out  from #41:0 
     => ["<Person[50:0]: out: {IS_WORKING=>1}, name : B>"] 
     > c.nodes( :both, via: IS_WORKING).to_human
     # INFO->select  both('is_working')  from #41:0 
     => ["<Person[49:0]: in: {IS_WORKING=>1}, name : A>", 
         "<Person[50:0]: out: {IS_WORKING=>1}, name : B>"] 
    
    

    我猜,最后一个查询涵盖了你的情况

    扩展版:

    > t.nodes( :both, via: IS_WORKING, expand: true)
    # INFO->select  expand (  both('is_working')  ) from #41:0 
    

    【讨论】:

    • 谢谢 hartmut .. 我已经解决了,你的代码对我来说太复杂了,我只是初学者,所以我很难理解你的代码,但无论如何,谢谢你非常努力。我用这个解决它 Select rid, company_id, name, work_info, out('is_working')['company_name'] as company, out('is_working')['rid'] as recordID from (select expand(in('is_working ')) 来自@rid = '13:5') 的公司
    猜你喜欢
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2022-10-03
    • 1970-01-01
    相关资源
    最近更新 更多