【问题标题】:How to combine nodes on select in TinkerPop3?如何在 TinkerPop3 中组合选择节点?
【发布时间】:2018-09-10 13:42:07
【问题描述】:

我正在使用 Apache gremlin 图和 TinkerPop3。 有两个节点

<!-- # parentNode with properties # -->
g.addV('Location')
.property('id', 'fb864e1f-a2e0-4c02-b891-2c0713b29751')
.property('name', 'BananaShop')
.property('description', 'Ipsum dolor sit ...')
.property('fuu', 'abc')
.property('bar', 'xyz')
.addE('FR-FR').to(g.V('b3bd8a03-531f-4f7f-b355-32954b03fd21')) 

还有

<!-- # childNode with translations only # -->
g.addV('Localized')
.property('id', 'b3bd8a03-531f-4f7f-b355-32954b03fd21')
.property('name', 'FR.BananaShop')
.property('description', 'Et ea rebum ...')

我的查询是:

g.V().has("Name","BananaShop").as("a").out("FR-FR").as("b").select("a","b")   

结果很好。我得到了两个节点,所有属性! 但我只对具有父节点属性和子节点翻译的单一结果感兴趣。如果我没有与翻译匹配的子项,则选择父项的“名称”和“描述”。

{
 id : ...,
 name : "FR-FR",         // childnode data
 description : "FR-FR",  // childnode data
 fuu : "...",
 bar : "..."
}

我需要如何更改我的查询?

【问题讨论】:

标签: azure-cosmosdb gremlin tinkerpop3


【解决方案1】:

在这种情况下我会使用project()

gremlin> g.V().has('name','BananaShop').
......1>   project('id','name','description','fuu','bar').
......2>     by('id').
......3>     by(out('FR-FR').values('name')).
......4>     by(out('FR-FR').values('description')).
......5>     by('fuu').
......6>     by('bar')
==>[id:fb864e1f-a2e0-4c02-b891-2c0713b29751,name:FR.BananaShop,description:Et ea rebum ...,fuu:abc,bar:xyz]

通过这样做,您将遍历 out() 两次。如果在 CosmosDB 中这很昂贵,您可以考虑将格式更改为以下格式:

gremlin> g.V().has('name','BananaShop').
......1>   project('id','child','fuu','bar').
......2>     by('id').
......3>     by(out('FR-FR').project('name','description').by('name').by('description')).
......4>     by('fuu').
......5>     by('bar')
==>[id:fb864e1f-a2e0-4c02-b891-2c0713b29751,child:[name:FR.BananaShop,description:Et ea rebum ...],fuu:abc,bar:xyz]

【讨论】:

    【解决方案2】:

    如果你想获得一个原始属性值被本地化属性覆盖的 valueMap(如果它们存在的话):

    g.V().has('name','BananaShop').as('b').
      coalesce(out('FR-FR'), identity()).valueMap().as('l').
      select('b').properties().as('p').
      group().
        by(key()).
        by(coalesce(select('l').select(select('p').key()).unfold(), value()).fold())
    

    示例

    现有翻译

    gremlin> g.V().has('name','BananaShop').as('b').
    ......1>   coalesce(out('FR-FR'), identity()).valueMap().as('l').
    ......2>   select('b').properties().as('p').
    ......3>   group().
    ......4>     by(key()).
    ......5>     by(coalesce(select('l').select(select('p').key()).unfold(), value()).fold()).
    ......6>   unfold()
    ==>bar=[xyz]
    ==>fuu=[abc]
    ==>name=[FR.BananaShop]
    ==>description=[Et ea rebum ...]
    ==>id=[b3bd8a03-531f-4f7f-b355-32954b03fd21]
    

    不存在的翻译

    gremlin> g.V().has('name','BananaShop').as('b').
    ......1>   coalesce(out('DE-DE'), identity()).valueMap().as('l').
    ......2>   select('b').properties().as('p').
    ......3>   group().
    ......4>     by(key()).
    ......5>     by(coalesce(select('l').select(select('p').key()).unfold(), value()).fold()).
    ......6>   unfold()
    ==>bar=[xyz]
    ==>fuu=[abc]
    ==>name=[BananaShop]
    ==>description=[Ipsum dolor sit ...]
    ==>id=[fb864e1f-a2e0-4c02-b891-2c0713b29751]
    

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 2020-01-20
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多