如何编写将执行的gremlin查询
或者有没有其他替代方法可以使用gremlin查询覆盖顶点?
答案 0 :(得分:1)
以TinkerPop现代图形为例:
gremlin> g.V().has('person','name','marko').valueMap(true)
==>[id:1,label:person,name:[marko],age:[29]]
并假设完全支持Gremlin,则可以保留“ name”属性(即index属性),删除所有其他属性,并在Gremlin的一行中添加新属性,如下所示:
gremlin> g.V().has('person','name','marko').
......1> sideEffect(properties().not(hasKey('name')).drop()).
......2> property('age',33).
......3> property('favoriteColor','red')
==>v[1]
gremlin> g.V().has('person','name','marko').valueMap(true)
==>[id:1,label:person,name:[marko],favoriteColor:[red],age:[33]]
但是在CosmosDB中,我认为您尚未支持sideEffect()
步骤。诀窍在于,一次遍历就可以做到这一点,即您需要以某种方式“副作用” drop()
,并且由于drop()
的作用就像过滤器一样,所有步骤都将在此之后添加,根本不执行,因为流中没有剩余可操作的内容。
缺少sideEffect()
的一些解决方法包括将union()
与identity()
一起使用:
gremlin> g.V().has('person','name','marko').
......1> union(properties().not(hasKey('name')).drop(),
......2> __.identity()).
......3> property('age',33).
......4> property('favoriteColor','red')
==>v[1]
gremlin> g.V().has('person','name','marko').valueMap(true)
==>[id:1,label:person,name:[marko],favoriteColor:[red],age:[33]]
比sideEffect()
的意图可读性差,但有效。我相信CosmosDB支持identity()
,即使未在其网站上对其进行记录。我想,如果您没有identity()
,就只需要发挥创造力-这是另一种不太好的方法:
gremlin> g.V().has('person','name','marko').as('a').
......1> union(properties().not(hasKey('name')).drop(),
......2> select('a')).
......3> property('age',33).
......4> property('favoriteColor','red')
==>v[1]
gremlin> g.V().has('person','name','marko').valueMap(true)
==>[id:1,label:person,name:[marko],favoriteColor:[red],age:[33]]