如何在 TinkerPop3 中合并 select 上的节点?
How to combine nodes on select in TinkerPop3?
我正在使用 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")
结果很好。我得到了两个节点,具有所有属性!
但我只对具有 parent 节点的属性和 child 节点的翻译的单个结果感兴趣。如果我没有匹配的 child 翻译,那 select "name" 和 "description" 的 parent.
{
id : ...,
name : "FR-FR", // childnode data
description : "FR-FR", // childnode data
fuu : "...",
bar : "..."
}
我需要如何为此更改我的查询?
在这种情况下我会使用 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]
如果您想获得一个 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]
我正在使用 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")
结果很好。我得到了两个节点,具有所有属性! 但我只对具有 parent 节点的属性和 child 节点的翻译的单个结果感兴趣。如果我没有匹配的 child 翻译,那 select "name" 和 "description" 的 parent.
{
id : ...,
name : "FR-FR", // childnode data
description : "FR-FR", // childnode data
fuu : "...",
bar : "..."
}
我需要如何为此更改我的查询?
在这种情况下我会使用 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]
如果您想获得一个 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]